xref: /reactos/sdk/lib/crt/math/fabs.c (revision 1734f297)
1 /*
2  * PROJECT:     ReactOS CRT library
3  * LICENSE:     MIT (https://spdx.org/licenses/MIT)
4  * PURPOSE:     Portable implementation of fabs
5  * COPYRIGHT:   Copyright 2021 Timo Kreuzer <timo.kreuzer@reactos.org>
6  */
7 
8 #include <math.h>
9 
10 #ifdef _MSC_VER
11 #pragma function(fabs)
12 #endif
13 
14 _Check_return_
15 double
16 __cdecl
17 fabs(
18     _In_ double x)
19 {
20     /* Load the value as uint64 */
21     unsigned long long u64 = *(unsigned long long*)&x;
22 
23     /* Clear the sign bit */
24     u64 &= ~(1ULL << 63);
25 
26     /* Check for NAN */
27     if (u64 > 0x7FF0000000000000ull)
28     {
29 #ifdef _M_IX86
30         /* Set error bit */
31         *(unsigned long long*)&x |= 0x0008000000000000ull;
32 #endif
33         return x;
34     }
35 
36     /* Convert back to double */
37     return *(double*)&u64;
38 }
39