summaryrefslogtreecommitdiffstatshomepage
path: root/lib/libm/kf_sin.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-12-18 14:44:02 +0000
committerDamien George <damien.p.george@gmail.com>2014-12-18 14:44:02 +0000
commitf04329e93b7bfa5462f232832d64aac3dc52d5db (patch)
tree96b06142670e0bb1ddfddcd353872f4612954bf8 /lib/libm/kf_sin.c
parent6936f4626c8748c077ad2c63827d4deeb43b867d (diff)
downloadmicropython-f04329e93b7bfa5462f232832d64aac3dc52d5db.tar.gz
micropython-f04329e93b7bfa5462f232832d64aac3dc52d5db.zip
lib/libm: Add acosh, asinh, atanh, tan; get working with stmhal.
acoshf, asinhf, atanhf were added from musl. mathsincos.c was split up into its original, separate files (from newlibe-nano-2). tan was added. All of the important missing float functions are now implemented, and pyboard now passes tests/float/math_fun.py (finally!).
Diffstat (limited to 'lib/libm/kf_sin.c')
-rw-r--r--lib/libm/kf_sin.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/lib/libm/kf_sin.c b/lib/libm/kf_sin.c
new file mode 100644
index 0000000000..81390b4ebb
--- /dev/null
+++ b/lib/libm/kf_sin.c
@@ -0,0 +1,58 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * These math functions are taken from newlib-nano-2, the newlib/libm/math
+ * directory, available from https://github.com/32bitmicro/newlib-nano-2.
+ *
+ * Appropriate copyright headers are reproduced below.
+ */
+
+/* kf_sin.c -- float version of k_sin.c
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "fdlibm.h"
+
+#ifdef __STDC__
+static const float
+#else
+static float
+#endif
+half = 5.0000000000e-01,/* 0x3f000000 */
+S1 = -1.6666667163e-01, /* 0xbe2aaaab */
+S2 = 8.3333337680e-03, /* 0x3c088889 */
+S3 = -1.9841270114e-04, /* 0xb9500d01 */
+S4 = 2.7557314297e-06, /* 0x3638ef1b */
+S5 = -2.5050759689e-08, /* 0xb2d72f34 */
+S6 = 1.5896910177e-10; /* 0x2f2ec9d3 */
+
+#ifdef __STDC__
+ float __kernel_sinf(float x, float y, int iy)
+#else
+ float __kernel_sinf(x, y, iy)
+ float x,y; int iy; /* iy=0 if y is zero */
+#endif
+{
+ float z,r,v;
+ __int32_t ix;
+ GET_FLOAT_WORD(ix,x);
+ ix &= 0x7fffffff; /* high word of x */
+ if(ix<0x32000000) /* |x| < 2**-27 */
+ {if((int)x==0) return x;} /* generate inexact */
+ z = x*x;
+ v = z*x;
+ r = S2+z*(S3+z*(S4+z*(S5+z*S6)));
+ if(iy==0) return x+v*(S1+z*r);
+ else return x-((z*(half*y-v*r)-y)-v*S1);
+}