-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathin_range_ext.cpp
62 lines (52 loc) · 2.74 KB
/
in_range_ext.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "in_range_ext.h"
bool in_int_range(float f);
bool in_int_range(float f)
{
return in_range_ext::in_range<int>(f);
}
bool in_int_range(double f);
bool in_int_range(double f)
{
return in_range_ext::in_range<int>(f);
}
static_assert(in_range_ext::in_range<float>(INT_MIN));
static_assert(in_range_ext::in_range<float>(INT_MAX));
int main()
{
in_range_ext::in_range<int>(0.0f);
in_range_ext::in_range<float>(0);
using flimits = std::numeric_limits<float>;
using dfloat = in_range_ext::detail::decomp<flimits::radix, flimits::digits>;
constexpr int fradix = flimits::radix;
IN_RANGE_EXT_ASSERT(float(dfloat(-0.0f)) == -0.0f && std::signbit(float(dfloat(-0.0f))));
IN_RANGE_EXT_ASSERT(float(dfloat(+0.0f)) == +0.0f && !std::signbit(float(dfloat(+0.0f))));
// may not be true at runtime if subnormals are flushed to zero
// IN_RANGE_EXT_ASSERT(float(dfloat(-FLT_TRUE_MIN)) == -FLT_TRUE_MIN);
// IN_RANGE_EXT_ASSERT(float(dfloat(+FLT_TRUE_MIN)) == +FLT_TRUE_MIN);
IN_RANGE_EXT_ASSERT(float(dfloat(-FLT_MIN)) == -FLT_MIN);
IN_RANGE_EXT_ASSERT(float(dfloat(+FLT_MIN)) == +FLT_MIN);
IN_RANGE_EXT_ASSERT(float(dfloat(-1.0f)) == -1.0f);
IN_RANGE_EXT_ASSERT(float(dfloat(+1.0f)) == +1.0f);
IN_RANGE_EXT_ASSERT(float(dfloat(-FLT_MAX)) == -FLT_MAX);
IN_RANGE_EXT_ASSERT(float(dfloat(+FLT_MAX)) == +FLT_MAX);
IN_RANGE_EXT_ASSERT(float(dfloat(0)) == 0.0f && !std::signbit(float(dfloat(0))));
IN_RANGE_EXT_ASSERT(float(dfloat(-1)) == -1);
IN_RANGE_EXT_ASSERT(float(dfloat(+1)) == +1);
IN_RANGE_EXT_ASSERT(float(dfloat(-(fradix - 1))) == -(fradix - 1));
IN_RANGE_EXT_ASSERT(float(dfloat(+(fradix - 1))) == +(fradix - 1));
if constexpr (flimits::radix == 2 && flimits::digits == 24)
{
static_assert(int32_t(float(INT32_MIN)) == INT32_MIN);
static_assert(int32_t(float(0x7fffff80)) == 0x7fffff80);
IN_RANGE_EXT_ASSERT(!in_range_ext::in_range<int32_t>(-flimits::quiet_NaN()));
IN_RANGE_EXT_ASSERT(!in_range_ext::in_range<int32_t>(-flimits::infinity()));
IN_RANGE_EXT_ASSERT(!in_range_ext::in_range<int32_t>(flimits::lowest()));
IN_RANGE_EXT_ASSERT(!in_range_ext::in_range<int32_t>(std::nextafterf(float(INT32_MIN), -INFINITY)));
IN_RANGE_EXT_ASSERT(in_range_ext::in_range<int32_t>(float(INT32_MIN)));
IN_RANGE_EXT_ASSERT(in_range_ext::in_range<int32_t>(float(0x7fffff80)));
IN_RANGE_EXT_ASSERT(!in_range_ext::in_range<int32_t>(std::nextafterf(float(0x7fffff80), +INFINITY)));
IN_RANGE_EXT_ASSERT(!in_range_ext::in_range<int32_t>(flimits::max()));
IN_RANGE_EXT_ASSERT(!in_range_ext::in_range<int32_t>(+flimits::infinity()));
IN_RANGE_EXT_ASSERT(!in_range_ext::in_range<int32_t>(+flimits::quiet_NaN()));
}
}