Browse Source

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 11 năm trước cách đây
mục cha
commit
2eaed464e2
2 tập tin đã thay đổi với 20 bổ sung16 xóa
  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;
 }