summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libm/ipow.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/libm/ipow.c')
-rw-r--r--mdk-stage1/dietlibc/libm/ipow.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/mdk-stage1/dietlibc/libm/ipow.c b/mdk-stage1/dietlibc/libm/ipow.c
new file mode 100644
index 000000000..399986ea1
--- /dev/null
+++ b/mdk-stage1/dietlibc/libm/ipow.c
@@ -0,0 +1,29 @@
+#define _GNU_SOURCE
+#include <math.h>
+/*
+ * This is not standard, but often you only need such this function
+ * which is much shorter than the generic pow() function.
+ *
+ * double ipow ( double mant, int expo );
+ */
+
+double ipow ( double mant, int expo )
+{
+ double ret = 1.;
+ unsigned int e = expo; /* Some attention is necessary for expo = 2^31 */
+
+ if ( (int)e < 0 ) {
+ e = -e;
+ mant = 1./mant;
+ }
+
+ while (1) {
+ if ( e & 1 )
+ ret *= mant;
+ if ( (e >>= 1) == 0 )
+ break;
+ mant *= mant;
+ }
+
+ return ret;
+}