diff --git a/sdk/lib/crt/math/frexp.c b/sdk/lib/crt/math/frexp.c index fa8de1e01da..b214f603935 100644 --- a/sdk/lib/crt/math/frexp.c +++ b/sdk/lib/crt/math/frexp.c @@ -1,29 +1,33 @@ -#include -#include -#include - /* - * @implemented + * PROJECT: ReactOS CRT + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Implementation of frexp + * COPYRIGHT: Imported from musl libc + * https://git.musl-libc.org/cgit/musl/tree/src/math/frexp.c + * blob: 27b6266ed0c1d7c5dadd06ecc186a994fdcd1c52 + * See https://git.musl-libc.org/cgit/musl/tree/COPYRIGHT */ -double -frexp(double __x, int *exptr) + +#include +#include + +double frexp(double x, int *e) { - union - { - double* __x; - double_s* x; - } x; + union { double d; uint64_t i; } y = { x }; + int ee = y.i>>52 & 0x7ff; - x.__x = &__x; + if (!ee) { + if (x) { + x = frexp(x*0x1p64, e); + *e -= 64; + } else *e = 0; + return x; + } else if (ee == 0x7ff) { + return x; + } - if ( exptr != NULL ) - *exptr = x.x->exponent - 0x3FE; - - - x.x->exponent = 0x3FE; - - return __x; + *e = ee - 0x3fe; + y.i &= 0x800fffffffffffffull; + y.i |= 0x3fe0000000000000ull; + return y.d; } - - -