summaryrefslogtreecommitdiff
path: root/libk/src/math/copysign.c
blob: fd5fd4f705910716d02b8a4475e207802081b9f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}