mirror of
https://github.com/reactos/reactos.git
synced 2025-03-01 03:45:16 +00:00
[UCRT:MATH] Implement _dclass, _fdclass
This commit is contained in:
parent
0133dba0c6
commit
59c55e003e
3 changed files with 98 additions and 0 deletions
48
sdk/lib/ucrt/math/_dclass.c
Normal file
48
sdk/lib/ucrt/math/_dclass.c
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
//
|
||||||
|
// _dclass.c
|
||||||
|
//
|
||||||
|
// Copyright (c) 2024 Timo Kreuzer
|
||||||
|
//
|
||||||
|
// Implementation of _dclass.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma function(_dclass)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// Returns the floating-point classification of _X.
|
||||||
|
//
|
||||||
|
// FP_NAN - A quiet, signaling, or indeterminate NaN
|
||||||
|
// FP_INFINITE - A positive or negative infinity
|
||||||
|
// FP_NORMAL - A positive or negative normalized non-zero value
|
||||||
|
// FP_SUBNORMAL - A positive or negative subnormal (denormalized) value
|
||||||
|
// FP_ZERO - A positive or negative zero value
|
||||||
|
//
|
||||||
|
_Check_return_
|
||||||
|
short
|
||||||
|
__cdecl
|
||||||
|
_dclass(_In_ double _X)
|
||||||
|
{
|
||||||
|
union { double f; uint64_t ui64; } u = { _X };
|
||||||
|
uint64_t e = u.ui64 & 0x7FF0000000000000ull;
|
||||||
|
uint64_t m = u.ui64 & 0x000FFFFFFFFFFFFFull;
|
||||||
|
|
||||||
|
if (e == 0x7FF0000000000000ull)
|
||||||
|
{
|
||||||
|
return m ? FP_NAN : FP_INFINITE;
|
||||||
|
}
|
||||||
|
else if (e == 0)
|
||||||
|
{
|
||||||
|
return m ? FP_SUBNORMAL : FP_ZERO;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FP_NORMAL;
|
||||||
|
}
|
||||||
|
}
|
48
sdk/lib/ucrt/math/_fdclass.c
Normal file
48
sdk/lib/ucrt/math/_fdclass.c
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
//
|
||||||
|
// _fdclass.c
|
||||||
|
//
|
||||||
|
// Copyright (c) 2024 Timo Kreuzer
|
||||||
|
//
|
||||||
|
// Implementation of _fdclass.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma function(_fdclass)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// Returns the floating-point classification of _X.
|
||||||
|
//
|
||||||
|
// FP_NAN - A quiet, signaling, or indeterminate NaN
|
||||||
|
// FP_INFINITE - A positive or negative infinity
|
||||||
|
// FP_NORMAL - A positive or negative normalized non-zero value
|
||||||
|
// FP_SUBNORMAL - A positive or negative subnormal (denormalized) value
|
||||||
|
// FP_ZERO - A positive or negative zero value
|
||||||
|
//
|
||||||
|
_Check_return_
|
||||||
|
short
|
||||||
|
__cdecl
|
||||||
|
_fdclass(_In_ float _X)
|
||||||
|
{
|
||||||
|
union { float f; uint32_t ui32; } u = { _X };
|
||||||
|
uint32_t e = u.ui32 & 0x7F800000u;
|
||||||
|
uint32_t m = u.ui32 & 0x007FFFFFu;
|
||||||
|
|
||||||
|
if (e == 0x7F800000u)
|
||||||
|
{
|
||||||
|
return m ? FP_NAN : FP_INFINITE;
|
||||||
|
}
|
||||||
|
else if (e == 0)
|
||||||
|
{
|
||||||
|
return m ? FP_SUBNORMAL : FP_ZERO;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FP_NORMAL;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,6 @@
|
||||||
|
|
||||||
list(APPEND UCRT_MATH_SOURCES
|
list(APPEND UCRT_MATH_SOURCES
|
||||||
|
math/_dclass.c
|
||||||
|
math/_fdclass.c
|
||||||
math/matherr.cpp
|
math/matherr.cpp
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue