فهرست منبع

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 سال پیش
والد
کامیت
2eaed464e2
2فایلهای تغییر یافته به همراه20 افزوده شده و 16 حذف شده
  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;
 }