summaryrefslogtreecommitdiff
path: root/libk/src/math/copysign.c
diff options
context:
space:
mode:
Diffstat (limited to 'libk/src/math/copysign.c')
-rw-r--r--libk/src/math/copysign.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/libk/src/math/copysign.c b/libk/src/math/copysign.c
new file mode 100644
index 0000000..fd5fd4f
--- /dev/null
+++ b/libk/src/math/copysign.c
@@ -0,0 +1,20 @@
+#include <math.h>
+#include <stdint.h>
+
+#define DMASK 0x8000000000000000
+
+double copysign(double n, double s) {
+ union {double f; uint64_t i;} sb = {s};
+ union {double f; uint64_t i;} nb = {n};
+ nb.i = (nb.i & ~DMASK) | (sb.i & DMASK);
+ return nb.f;
+}
+
+#define FMASK 0x80000000
+
+float copysignf(float n, float s) {
+ union {float f; uint32_t i;} sb = {s};
+ union {float f; uint32_t i;} nb = {n};
+ nb.i = (nb.i & ~FMASK) | (sb.i & FMASK);
+ return nb.f;
+}