Explorar el Código

math: use float_t and double_t in scalbnf and scalbn

remove STRICT_ASSIGN (c99 semantics is assumed) and use the conventional
union to prepare the scaling factor (so libm.h is no longer needed)
Szabolcs Nagy hace 11 años
padre
commit
2eaed464e2
Se han modificado 2 ficheros con 20 adiciones y 16 borrados
  1. 10 8
      src/math/scalbn.c
  2. 10 8
      src/math/scalbnf.c

+ 10 - 8
src/math/scalbn.c

@@ -1,29 +1,31 @@
-#include "libm.h"
+#include <math.h>
+#include <stdint.h>
 
 double scalbn(double x, int n)
 {
-	double scale;
+	union {double f; uint64_t i;} u;
+	double_t y = x;
 
 	if (n > 1023) {
-		x *= 0x1p1023;
+		y *= 0x1p1023;
 		n -= 1023;
 		if (n > 1023) {
-			x *= 0x1p1023;
+			y *= 0x1p1023;
 			n -= 1023;
 			if (n > 1023)
 				n = 1023;
 		}
 	} else if (n < -1022) {
-		x *= 0x1p-1022;
+		y *= 0x1p-1022;
 		n += 1022;
 		if (n < -1022) {
-			x *= 0x1p-1022;
+			y *= 0x1p-1022;
 			n += 1022;
 			if (n < -1022)
 				n = -1022;
 		}
 	}
-	INSERT_WORDS(scale, (uint32_t)(0x3ff+n)<<20, 0);
-	STRICT_ASSIGN(double, x, x * scale);
+	u.i = (uint64_t)(0x3ff+n)<<52;
+	x = y * u.f;
 	return x;
 }

+ 10 - 8
src/math/scalbnf.c

@@ -1,29 +1,31 @@
-#include "libm.h"
+#include <math.h>
+#include <stdint.h>
 
 float scalbnf(float x, int n)
 {
-	float scale;
+	union {float f; uint32_t i;} u;
+	float_t y = x;
 
 	if (n > 127) {
-		x *= 0x1p127f;
+		y *= 0x1p127f;
 		n -= 127;
 		if (n > 127) {
-			x *= 0x1p127f;
+			y *= 0x1p127f;
 			n -= 127;
 			if (n > 127)
 				n = 127;
 		}
 	} else if (n < -126) {
-		x *= 0x1p-126f;
+		y *= 0x1p-126f;
 		n += 126;
 		if (n < -126) {
-			x *= 0x1p-126f;
+			y *= 0x1p-126f;
 			n += 126;
 			if (n < -126)
 				n = -126;
 		}
 	}
-	SET_FLOAT_WORD(scale, (uint32_t)(0x7f+n)<<23);
-	STRICT_ASSIGN(float, x, x * scale);
+	u.i = (uint32_t)(0x7f+n)<<23;
+	x = y * u.f;
 	return x;
 }