Author: tkreuzer
Date: Thu Jan 28 02:18:12 2010
New Revision: 45294
URL:
http://svn.reactos.org/svn/reactos?rev=45294&view=rev
Log:
[CRT]
Implement sin() in C. Code is actually 99% identical to cos.
Note: We are using even exponents for sin, too, as this results in higher precision than
using uneven exponents.
Added:
branches/ros-amd64-bringup/reactos/lib/sdk/crt/math/sin.c (with props)
Removed:
branches/ros-amd64-bringup/reactos/lib/sdk/crt/math/amd64/sin.S
Modified:
branches/ros-amd64-bringup/reactos/lib/sdk/crt/crt.rbuild
branches/ros-amd64-bringup/reactos/lib/sdk/crt/libcntpr.rbuild
Modified: branches/ros-amd64-bringup/reactos/lib/sdk/crt/crt.rbuild
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/s…
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/sdk/crt/crt.rbuild [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/lib/sdk/crt/crt.rbuild [iso-8859-1] Thu Jan 28
02:18:12 2010
@@ -162,6 +162,7 @@
</if>
<if property="ARCH" value="amd64">
<file>cos.c</file>
+ <file>sin.c</file>
<directory name="amd64">
<file>alldiv.S</file>
<file>atan.S</file>
@@ -178,7 +179,6 @@
<file>log.S</file>
<file>log10.S</file>
<file>pow.S</file>
- <file>sin.S</file>
<file>sqrt.S</file>
<file>sqrtf.S</file>
<file>tan.S</file>
Modified: branches/ros-amd64-bringup/reactos/lib/sdk/crt/libcntpr.rbuild
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/s…
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/sdk/crt/libcntpr.rbuild [iso-8859-1]
(original)
+++ branches/ros-amd64-bringup/reactos/lib/sdk/crt/libcntpr.rbuild [iso-8859-1] Thu Jan 28
02:18:12 2010
@@ -72,7 +72,6 @@
<file>log.S</file>
<file>log10.S</file>
<file>pow.S</file>
- <file>sin.S</file>
<file>sqrt.S</file>
<file>tan.S</file>
</directory>
Removed: branches/ros-amd64-bringup/reactos/lib/sdk/crt/math/amd64/sin.S
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/s…
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/sdk/crt/math/amd64/sin.S [iso-8859-1]
(original)
+++ branches/ros-amd64-bringup/reactos/lib/sdk/crt/math/amd64/sin.S (removed)
@@ -1,21 +1,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS system libraries
- * PURPOSE: Implementation of sin
- * FILE: lib/sdk/crt/math/amd64/sin.S
- * PROGRAMMER: Timo Kreuzer (timo.kreuzer(a)reactos.org)
- */
-
-/* INCLUDES ******************************************************************/
-
-#include <ndk/amd64/asm.h>
-#include <ndk/amd64/asmmacro.S>
-
-.intel_syntax noprefix
-
-
-.proc sin
- UNIMPLEMENTED sin
- ret
-
-.endproc
Added: branches/ros-amd64-bringup/reactos/lib/sdk/crt/math/sin.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/s…
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/sdk/crt/math/sin.c (added)
+++ branches/ros-amd64-bringup/reactos/lib/sdk/crt/math/sin.c [iso-8859-1] Thu Jan 28
02:18:12 2010
@@ -1,0 +1,89 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS CRT
+ * FILE: lib/crt/math/sin.c
+ * PURPOSE: Generic C Implementation of sin
+ * PROGRAMMER: Timo Kreuzer (timo.kreuzer(a)reactos.org)
+ */
+
+#define PRECISION 9
+#define M_PI 3.141592653589793238462643
+
+static double sin_off_tbl[] = {0.0, -M_PI/2., 0, -M_PI/2.};
+static double sin_sign_tbl[] = {1,-1,-1,1};
+
+double
+sin(double x)
+{
+ int quadrant;
+ double x2, result;
+
+ /* Calculate the quadrant */
+ quadrant = x * (2./M_PI);
+
+ /* Get offset inside quadrant */
+ x = x - quadrant * (M_PI/2.);
+
+ /* Normalize quadrant to [0..3] */
+ quadrant = (quadrant - 1) & 0x3;
+
+ /* Fixup value for the generic function */
+ x += sin_off_tbl[quadrant];
+
+ /* Calculate the negative of the square of x */
+ x2 = - (x * x);
+
+ /* This is an unrolled taylor series using <PRECISION> iterations
+ * Example with 4 iterations:
+ * result = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8!
+ * To save multiplications and to keep the precision high, it's performed
+ * like this:
+ * result = 1 - x^2 * (1/2! - x^2 * (1/4! - x^2 * (1/6! - x^2 * (1/8!))))
+ */
+
+ /* Start with 0, compiler will optimize this away */
+ result = 0;
+
+#if (PRECISION >= 10)
+ result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*20);
+ result *= x2;
+#endif
+#if (PRECISION >= 9)
+ result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18);
+ result *= x2;
+#endif
+#if (PRECISION >= 8)
+ result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16);
+ result *= x2;
+#endif
+#if (PRECISION >= 7)
+ result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14);
+ result *= x2;
+#endif
+#if (PRECISION >= 6)
+ result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12);
+ result *= x2;
+#endif
+#if (PRECISION >= 5)
+ result += 1./(1.*2*3*4*5*6*7*8*9*10);
+ result *= x2;
+#endif
+ result += 1./(1.*2*3*4*5*6*7*8);
+ result *= x2;
+
+ result += 1./(1.*2*3*4*5*6);
+ result *= x2;
+
+ result += 1./(1.*2*3*4);
+ result *= x2;
+
+ result += 1./(1.*2);
+ result *= x2;
+
+ result += 1;
+
+ /* Apply correct sign */
+ result *= sin_sign_tbl[quadrant];
+
+ return result;
+}
Propchange: branches/ros-amd64-bringup/reactos/lib/sdk/crt/math/sin.c
------------------------------------------------------------------------------
svn:eol-style = native