summaryrefslogtreecommitdiffstatshomepage
path: root/lib
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-10-31 11:28:50 +0000
committerDamien George <damien.p.george@gmail.com>2014-10-31 11:28:50 +0000
commit1559a978100762efd84666befd134d5975ae8d4b (patch)
treeb5910a620f1532ae722b865c1f71988e3f4d1e1c /lib
parentfa73c9cb25f05ffa6df4c5d15cc754885c3415ff (diff)
downloadmicropython-1559a978100762efd84666befd134d5975ae8d4b.tar.gz
micropython-1559a978100762efd84666befd134d5975ae8d4b.zip
py: Add builtin round function.
Addresses issue #934.
Diffstat (limited to 'lib')
-rw-r--r--lib/libm/roundf.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/libm/roundf.c b/lib/libm/roundf.c
new file mode 100644
index 0000000000..3da1f0595e
--- /dev/null
+++ b/lib/libm/roundf.c
@@ -0,0 +1,33 @@
+/*****************************************************************************/
+/*****************************************************************************/
+// roundf from musl-0.9.15
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include "libm.h"
+
+float roundf(float x)
+{
+ union {float f; uint32_t i;} u = {x};
+ int e = u.i >> 23 & 0xff;
+ float_t y;
+
+ if (e >= 0x7f+23)
+ return x;
+ if (u.i >> 31)
+ x = -x;
+ if (e < 0x7f-1) {
+ FORCE_EVAL(x + 0x1p23f);
+ return 0*u.f;
+ }
+ y = (float)(x + 0x1p23f) - 0x1p23f - x;
+ if (y > 0.5f)
+ y = y + x - 1;
+ else if (y <= -0.5f)
+ y = y + x + 1;
+ else
+ y = y + x;
+ if (u.i >> 31)
+ y = -y;
+ return y;
+}