1#ifndef NEFORCE_CORE_NUMERIC_NUMERIC_TRAITS_HPP__
2#define NEFORCE_CORE_NUMERIC_NUMERIC_TRAITS_HPP__
12#ifdef NEFORCE_PLATFORM_WINDOWS
20NEFORCE_BEGIN_NAMESPACE__
66 static constexpr bool has_denorm_loss =
false;
67 static constexpr bool has_infinity =
false;
68 static constexpr bool has_quiet_nan =
false;
69 static constexpr bool has_signaling_nan =
false;
70 static constexpr bool is_bounded =
false;
71 static constexpr bool is_exact =
false;
72 static constexpr bool is_iec559 =
false;
73 static constexpr bool is_integer =
false;
74 static constexpr bool is_modulo =
false;
75 static constexpr bool is_signed =
false;
76 static constexpr bool is_specialized =
false;
77 static constexpr bool tinyness_before =
false;
78 static constexpr bool traps =
false;
79 static constexpr int digits = 0;
80 static constexpr int digits10 = 0;
81 static constexpr int max_digits10 = 0;
82 static constexpr int max_exponent = 0;
83 static constexpr int max_exponent10 = 0;
84 static constexpr int min_exponent = 0;
85 static constexpr int min_exponent10 = 0;
86 static constexpr int radix = 0;
96struct numeric_int_base : numeric_base {
97 static constexpr bool is_bounded =
true;
98 static constexpr bool is_exact =
true;
99 static constexpr bool is_integer =
true;
100 static constexpr bool is_specialized =
true;
101 static constexpr int radix = 2;
102#ifdef NEFORCE_COMPILER_GNUC
103 static constexpr bool traps =
true;
114struct numeric_float_base : numeric_base {
117 static constexpr bool has_infinity =
true;
118 static constexpr bool has_quiet_nan =
true;
119 static constexpr bool has_signaling_nan =
true;
120 static constexpr bool is_bounded =
true;
121 static constexpr bool is_iec559 =
true;
122 static constexpr bool is_signed =
true;
123 static constexpr bool is_specialized =
true;
124 static constexpr int radix = 2;
140template <
typename T,
typename Dummy =
void>
148 NEFORCE_NODISCARD
static constexpr T
min() noexcept {
return T(); }
153 NEFORCE_NODISCARD
static constexpr T
max() noexcept {
return T(); }
160 NEFORCE_NODISCARD
static constexpr T
lowest() noexcept {
return T(); }
167 NEFORCE_NODISCARD
static constexpr T
epsilon() noexcept {
return T(); }
172 NEFORCE_NODISCARD
static constexpr T
round_error() noexcept {
return T(); }
177 NEFORCE_NODISCARD
static constexpr T
denorm_min() noexcept {
return T(); }
183 NEFORCE_NODISCARD
static constexpr T
infinity() noexcept {
return T(); }
193 NEFORCE_NODISCARD
static constexpr T
quiet_nan() noexcept {
return T(); }
204 NEFORCE_NODISCARD
static constexpr T
signaling_nan() noexcept {
return T(); }
235 NEFORCE_NODISCARD
static constexpr bool min()
noexcept {
return false; }
236 NEFORCE_NODISCARD
static constexpr bool max()
noexcept {
return true; }
238 NEFORCE_NODISCARD
static constexpr bool lowest()
noexcept {
return min(); }
239 NEFORCE_NODISCARD
static constexpr bool epsilon()
noexcept {
return false; }
240 NEFORCE_NODISCARD
static constexpr bool round_error()
noexcept {
return false; }
241 NEFORCE_NODISCARD
static constexpr bool denorm_min()
noexcept {
return false; }
243 NEFORCE_NODISCARD
static constexpr bool infinity()
noexcept {
return false; }
244 NEFORCE_NODISCARD
static constexpr bool quiet_nan()
noexcept {
return false; }
245 NEFORCE_NODISCARD
static constexpr bool signaling_nan()
noexcept {
return false; }
247 static constexpr int digits = 1;
256 NEFORCE_NODISCARD
static constexpr int8_t min()
noexcept {
return -128; }
257 NEFORCE_NODISCARD
static constexpr int8_t max()
noexcept {
return 127; }
259 NEFORCE_NODISCARD
static constexpr int8_t lowest()
noexcept {
return min(); }
260 NEFORCE_NODISCARD
static constexpr int8_t epsilon()
noexcept {
return 0; }
262 NEFORCE_NODISCARD
static constexpr int8_t denorm_min()
noexcept {
return 0; }
264 NEFORCE_NODISCARD
static constexpr int8_t infinity()
noexcept {
return 0; }
265 NEFORCE_NODISCARD
static constexpr int8_t quiet_nan()
noexcept {
return 0; }
268 static constexpr bool is_signed =
true;
269 static constexpr int digits = 7;
270 static constexpr int digits10 = 2;
279 NEFORCE_NODISCARD
static constexpr int16_t min()
noexcept {
return -32768; }
280 NEFORCE_NODISCARD
static constexpr int16_t max()
noexcept {
return 32767; }
282 NEFORCE_NODISCARD
static constexpr int16_t lowest()
noexcept {
return min(); }
283 NEFORCE_NODISCARD
static constexpr int16_t epsilon()
noexcept {
return 0; }
287 NEFORCE_NODISCARD
static constexpr int16_t infinity()
noexcept {
return 0; }
288 NEFORCE_NODISCARD
static constexpr int16_t quiet_nan()
noexcept {
return 0; }
291 static constexpr bool is_signed =
true;
292 static constexpr int digits = 15;
293 static constexpr int digits10 = 4;
302 NEFORCE_NODISCARD
static constexpr int32_t min()
noexcept {
return -2147483647 - 1; }
303 NEFORCE_NODISCARD
static constexpr int32_t max()
noexcept {
return 2147483647; }
305 NEFORCE_NODISCARD
static constexpr int32_t lowest()
noexcept {
return min(); }
306 NEFORCE_NODISCARD
static constexpr int32_t epsilon()
noexcept {
return 0; }
310 NEFORCE_NODISCARD
static constexpr int32_t infinity()
noexcept {
return 0; }
311 NEFORCE_NODISCARD
static constexpr int32_t quiet_nan()
noexcept {
return 0; }
314 static constexpr bool is_signed =
true;
315 static constexpr int digits = 31;
316 static constexpr int digits10 = 9;
325 NEFORCE_NODISCARD
static constexpr int64_t min()
noexcept {
return -9223372036854775807LL - 1; }
326 NEFORCE_NODISCARD
static constexpr int64_t max()
noexcept {
return 9223372036854775807LL; }
328 NEFORCE_NODISCARD
static constexpr int64_t lowest()
noexcept {
return min(); }
329 NEFORCE_NODISCARD
static constexpr int64_t epsilon()
noexcept {
return 0; }
333 NEFORCE_NODISCARD
static constexpr int64_t infinity()
noexcept {
return 0; }
334 NEFORCE_NODISCARD
static constexpr int64_t quiet_nan()
noexcept {
return 0; }
337 static constexpr bool is_signed =
true;
338 static constexpr int digits = 63;
339 static constexpr int digits10 = 18;
342#ifdef NEFORCE_PLATFORM_LINUX64
356 NEFORCE_NODISCARD
static constexpr uint8_t min()
noexcept {
return 0; }
357 NEFORCE_NODISCARD
static constexpr uint8_t max()
noexcept {
return 0xffU; }
359 NEFORCE_NODISCARD
static constexpr uint8_t lowest()
noexcept {
return min(); }
360 NEFORCE_NODISCARD
static constexpr uint8_t epsilon()
noexcept {
return 0; }
364 NEFORCE_NODISCARD
static constexpr uint8_t infinity()
noexcept {
return 0; }
365 NEFORCE_NODISCARD
static constexpr uint8_t quiet_nan()
noexcept {
return 0; }
368 static constexpr bool is_modulo =
true;
369 static constexpr int digits = 8;
370 static constexpr int digits10 = 2;
379 NEFORCE_NODISCARD
static constexpr uint16_t min()
noexcept {
return 0; }
380 NEFORCE_NODISCARD
static constexpr uint16_t max()
noexcept {
return 0xffffU; }
383 NEFORCE_NODISCARD
static constexpr uint16_t epsilon()
noexcept {
return 0; }
387 NEFORCE_NODISCARD
static constexpr uint16_t infinity()
noexcept {
return 0; }
391 static constexpr bool is_modulo =
true;
392 static constexpr int digits = 16;
393 static constexpr int digits10 = 4;
402 NEFORCE_NODISCARD
static constexpr uint32_t min()
noexcept {
return 0; }
403 NEFORCE_NODISCARD
static constexpr uint32_t max()
noexcept {
return 0xffffffffU; }
406 NEFORCE_NODISCARD
static constexpr uint32_t epsilon()
noexcept {
return 0; }
410 NEFORCE_NODISCARD
static constexpr uint32_t infinity()
noexcept {
return 0; }
414 static constexpr bool is_modulo =
true;
415 static constexpr int digits = 32;
416 static constexpr int digits10 = 9;
425 NEFORCE_NODISCARD
static constexpr uint64_t min()
noexcept {
return 0; }
426 NEFORCE_NODISCARD
static constexpr uint64_t max()
noexcept {
return 0xffffffffffffffffULL; }
429 NEFORCE_NODISCARD
static constexpr uint64_t epsilon()
noexcept {
return 0; }
433 NEFORCE_NODISCARD
static constexpr uint64_t infinity()
noexcept {
return 0; }
437 static constexpr bool is_modulo =
true;
438 static constexpr int digits = 64;
439 static constexpr int digits10 = 19;
442#ifdef NEFORCE_PLATFORM_LINUX64
457#ifdef NEFORCE_STANDARD_20
484#ifdef NEFORCE_PLATFORM_WINDOWS
487#elif defined(NEFORCE_PLATFORM_LINUX)
520 NEFORCE_NODISCARD
static constexpr float32_t min() noexcept {
return min_posi(); }
521 NEFORCE_NODISCARD
static constexpr float32_t max() noexcept {
return max_posi(); }
523 NEFORCE_NODISCARD
static constexpr float32_t lowest() noexcept {
return min_nega(); }
524 NEFORCE_NODISCARD
static constexpr float32_t epsilon() noexcept {
return 1.192092896e-07f; }
526 NEFORCE_NODISCARD
static constexpr float32_t denorm_min() noexcept {
return 1.401298464e-45f; }
528 NEFORCE_NODISCARD
static constexpr float32_t infinity() noexcept {
return __builtin_huge_valf(); }
530#ifdef NEFORCE_COMPILER_GCC
531 return __builtin_nanf(
"");
533 return __builtin_nan(
"0");
537#ifdef NEFORCE_COMPILER_GCC
538 return __builtin_nansf(
"");
540 return __builtin_nans(
"1");
559 NEFORCE_NODISCARD
static constexpr float64_t min_posi()
noexcept {
return 2.2250738585072014e-308; }
560 NEFORCE_NODISCARD
static constexpr float64_t max_posi()
noexcept {
return 1.7976931348623157e+308; }
561 NEFORCE_NODISCARD
static constexpr float64_t min_nega()
noexcept {
return -1.7976931348623157e+308; }
562 NEFORCE_NODISCARD
static constexpr float64_t max_nega()
noexcept {
return -2.2250738585072014e-308; }
564 NEFORCE_NODISCARD
static constexpr float64_t min()
noexcept {
return min_posi(); }
565 NEFORCE_NODISCARD
static constexpr float64_t max()
noexcept {
return max_posi(); }
567 NEFORCE_NODISCARD
static constexpr float64_t lowest()
noexcept {
return min_nega(); }
568 NEFORCE_NODISCARD
static constexpr float64_t epsilon()
noexcept {
return 2.2204460492503131e-16; }
570 NEFORCE_NODISCARD
static constexpr float64_t denorm_min()
noexcept {
return 4.9406564584124654e-324; }
572 NEFORCE_NODISCARD
static constexpr float64_t infinity()
noexcept {
return __builtin_huge_val(); }
574#ifdef NEFORCE_COMPILER_GCC
575 return __builtin_nan(
"");
577 return __builtin_nan(
"0");
581#ifdef NEFORCE_COMPILER_GCC
582 return __builtin_nans(
"");
584 return __builtin_nans(
"1");
588 static constexpr int digits = 53;
589 static constexpr int digits10 = 15;
590 static constexpr int max_digits10 = 17;
591 static constexpr int max_exponent = 1024;
592 static constexpr int max_exponent10 = 308;
593 static constexpr int min_exponent = -1021;
594 static constexpr int min_exponent10 = -307;
597#ifdef NEFORCE_COMPILER_GNUC
605 NEFORCE_NODISCARD
static constexpr decimal_t min_posi() noexcept {
606 return 3.36210314311209350626267781732175260e-4932L;
608 NEFORCE_NODISCARD
static constexpr decimal_t max_posi() noexcept {
609 return 1.18973149535723176502126385303097021e+4932L;
611 NEFORCE_NODISCARD
static constexpr decimal_t min_nega() noexcept {
612 return -1.18973149535723176502126385303097021e+4932L;
614 NEFORCE_NODISCARD
static constexpr decimal_t max_nega() noexcept {
615 return -3.36210314311209350626267781732175260e-4932L;
618 NEFORCE_NODISCARD
static constexpr decimal_t min() noexcept {
return min_posi(); }
619 NEFORCE_NODISCARD
static constexpr decimal_t max() noexcept {
return max_posi(); }
621 NEFORCE_NODISCARD
static constexpr decimal_t lowest() noexcept {
return min_nega(); }
622 NEFORCE_NODISCARD
static constexpr decimal_t epsilon() noexcept {
return 1.08420217248550443401e-19L; }
624 NEFORCE_NODISCARD
static constexpr decimal_t denorm_min() noexcept {
return 3.64519953188247460253e-4951L; }
626 NEFORCE_NODISCARD
static constexpr decimal_t infinity() noexcept {
return __builtin_huge_val(); }
627 NEFORCE_NODISCARD
static constexpr decimal_t quiet_nan() noexcept {
return __builtin_nanl(
""); }
630 static constexpr int digits = 64;
631 static constexpr int digits10 = 18;
632 static constexpr int max_digits10 = 21;
633 static constexpr int max_exponent = 16384;
634 static constexpr int max_exponent10 = 4932;
635 static constexpr int min_exponent = -16381;
636 static constexpr int min_exponent10 = -4931;
645NEFORCE_END_NAMESPACE__
static constexpr int min_exponent10
最小十进制指数
static NEFORCE_NODISCARD constexpr float32_t min_posi() noexcept
获取最小正规范值
static constexpr int max_digits10
保证精度的最大十进制位数
static constexpr int max_exponent10
最大十进制指数
static constexpr int digits
尾数位数,包括隐藏位
static NEFORCE_NODISCARD constexpr float32_t max_nega() noexcept
获取最大负规范值
static constexpr int digits10
十进制有效位数
static NEFORCE_NODISCARD constexpr float32_t min_nega() noexcept
获取最小负规范值
static constexpr int max_exponent
最大指数
static NEFORCE_NODISCARD constexpr float32_t max_posi() noexcept
获取最大正规范值
static constexpr int min_exponent
最小指数
static NEFORCE_NODISCARD constexpr T quiet_nan() noexcept
获取安静nan表示
static NEFORCE_NODISCARD constexpr T epsilon() noexcept
获取机器精度
static NEFORCE_NODISCARD constexpr T round_error() noexcept
获取最大舍入误差
static NEFORCE_NODISCARD constexpr T signaling_nan() noexcept
获取信号nan表示
static NEFORCE_NODISCARD constexpr T min() noexcept
获取类型的最小值
static NEFORCE_NODISCARD constexpr T denorm_min() noexcept
获取最小的次正规化正值
static NEFORCE_NODISCARD constexpr T max() noexcept
获取类型的最大值
static NEFORCE_NODISCARD constexpr T infinity() noexcept
获取正无穷大表示
static NEFORCE_NODISCARD constexpr T lowest() noexcept
获取类型的最低值
unsigned char uint8_t
8位无符号整数类型
float float32_t
32位单精度浮点数类型
unsigned int uint32_t
32位无符号整数类型
long double decimal_t
扩展精度浮点数类型
long long int64_t
64位有符号整数类型
double float64_t
64位双精度浮点数类型
unsigned short uint16_t
16位无符号整数类型
unsigned long long uint64_t
64位无符号整数类型
signed char int8_t
8位有符号整数类型
float_denorm_type
浮点数次正规化状态
@ TOWARD_NEG_INFINITY
向负无穷舍入(向下取整)
@ TOWARD_INFINITY
向正无穷舍入(向上取整)