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