1#ifndef NEFORCE_CORE_NUMERIC_NUMERIC_TRAITS_HPP__
2#define NEFORCE_CORE_NUMERIC_NUMERIC_TRAITS_HPP__
12#ifdef NEFORCE_PLATFORM_WINDOWS
20NEFORCE_BEGIN_NAMESPACE__
64 static constexpr auto has_denorm = float_denorm_type::ABSENT;
65 static constexpr auto round_style = float_round_type::TOWARD_ZERO;
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 {
115 static constexpr auto has_denorm = float_denorm_type::PRESENT;
116 static constexpr auto round_style = float_round_type::TO_NEAREST;
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; }
261 NEFORCE_NODISCARD
static constexpr int8_t round_error()
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; }
266 NEFORCE_NODISCARD
static constexpr int8_t signaling_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; }
284 NEFORCE_NODISCARD
static constexpr int16_t round_error()
noexcept {
return 0; }
285 NEFORCE_NODISCARD
static constexpr int16_t denorm_min()
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; }
289 NEFORCE_NODISCARD
static constexpr int16_t signaling_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; }
307 NEFORCE_NODISCARD
static constexpr int32_t round_error()
noexcept {
return 0; }
308 NEFORCE_NODISCARD
static constexpr int32_t denorm_min()
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; }
312 NEFORCE_NODISCARD
static constexpr int32_t signaling_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; }
330 NEFORCE_NODISCARD
static constexpr int64_t round_error()
noexcept {
return 0; }
331 NEFORCE_NODISCARD
static constexpr int64_t denorm_min()
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; }
335 NEFORCE_NODISCARD
static constexpr int64_t signaling_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
347class numeric_traits<long> :
public numeric_traits<int32_t> {};
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; }
361 NEFORCE_NODISCARD
static constexpr uint8_t round_error()
noexcept {
return 0; }
362 NEFORCE_NODISCARD
static constexpr uint8_t denorm_min()
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; }
366 NEFORCE_NODISCARD
static constexpr uint8_t signaling_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; }
382 NEFORCE_NODISCARD
static constexpr uint16_t lowest()
noexcept {
return min(); }
383 NEFORCE_NODISCARD
static constexpr uint16_t epsilon()
noexcept {
return 0; }
384 NEFORCE_NODISCARD
static constexpr uint16_t round_error()
noexcept {
return 0; }
385 NEFORCE_NODISCARD
static constexpr uint16_t denorm_min()
noexcept {
return 0; }
387 NEFORCE_NODISCARD
static constexpr uint16_t infinity()
noexcept {
return 0; }
388 NEFORCE_NODISCARD
static constexpr uint16_t quiet_nan()
noexcept {
return 0; }
389 NEFORCE_NODISCARD
static constexpr uint16_t signaling_nan()
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; }
405 NEFORCE_NODISCARD
static constexpr uint32_t lowest()
noexcept {
return min(); }
406 NEFORCE_NODISCARD
static constexpr uint32_t epsilon()
noexcept {
return 0; }
407 NEFORCE_NODISCARD
static constexpr uint32_t round_error()
noexcept {
return 0; }
408 NEFORCE_NODISCARD
static constexpr uint32_t denorm_min()
noexcept {
return 0; }
410 NEFORCE_NODISCARD
static constexpr uint32_t infinity()
noexcept {
return 0; }
411 NEFORCE_NODISCARD
static constexpr uint32_t quiet_nan()
noexcept {
return 0; }
412 NEFORCE_NODISCARD
static constexpr uint32_t signaling_nan()
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; }
428 NEFORCE_NODISCARD
static constexpr uint64_t lowest()
noexcept {
return min(); }
429 NEFORCE_NODISCARD
static constexpr uint64_t epsilon()
noexcept {
return 0; }
430 NEFORCE_NODISCARD
static constexpr uint64_t round_error()
noexcept {
return 0; }
431 NEFORCE_NODISCARD
static constexpr uint64_t denorm_min()
noexcept {
return 0; }
433 NEFORCE_NODISCARD
static constexpr uint64_t infinity()
noexcept {
return 0; }
434 NEFORCE_NODISCARD
static constexpr uint64_t quiet_nan()
noexcept {
return 0; }
435 NEFORCE_NODISCARD
static constexpr uint64_t signaling_nan()
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
447class numeric_traits<unsigned long> :
public numeric_traits<uint32_t> {};
455class numeric_traits<char>;
457#if defined(NEFORCE_ARCH_X86) || defined(NEFORCE_ARCH_LOONGARCH)
459class numeric_traits<char> :
public numeric_traits<int8_t> {};
462class numeric_traits<char> :
public numeric_traits<uint8_t> {};
465#ifdef NEFORCE_STANDARD_20
492#ifdef NEFORCE_PLATFORM_WINDOWS
495#elif defined(NEFORCE_PLATFORM_LINUX)
496# ifdef NEFORCE_ARCH_ARM
498class numeric_traits<wchar_t> :
public numeric_traits<uint32_t> {};
501class numeric_traits<wchar_t> :
public numeric_traits<int32_t> {};
533 NEFORCE_NODISCARD
static constexpr float32_t min() noexcept {
return min_posi(); }
534 NEFORCE_NODISCARD
static constexpr float32_t max() noexcept {
return max_posi(); }
536 NEFORCE_NODISCARD
static constexpr float32_t lowest() noexcept {
return min_nega(); }
537 NEFORCE_NODISCARD
static constexpr float32_t epsilon() noexcept {
return 1.192092896e-07F; }
538 NEFORCE_NODISCARD
static constexpr float32_t round_error() noexcept {
return 0.5F; }
539 NEFORCE_NODISCARD
static constexpr float32_t denorm_min() noexcept {
return 1.401298464e-45F; }
541 NEFORCE_NODISCARD
static constexpr float32_t infinity() noexcept {
return __builtin_huge_valf(); }
542 NEFORCE_NODISCARD
static constexpr float32_t quiet_nan() noexcept {
543#ifdef NEFORCE_COMPILER_GCC
544 return __builtin_nanf(
"");
546 return __builtin_nan(
"0");
549 NEFORCE_NODISCARD
static constexpr float32_t signaling_nan() noexcept {
550#ifdef NEFORCE_COMPILER_GCC
551 return __builtin_nansf(
"");
553 return __builtin_nans(
"1");
572 NEFORCE_NODISCARD
static constexpr float64_t min_posi()
noexcept {
return 2.2250738585072014e-308; }
573 NEFORCE_NODISCARD
static constexpr float64_t max_posi()
noexcept {
return 1.7976931348623157e+308; }
574 NEFORCE_NODISCARD
static constexpr float64_t min_nega()
noexcept {
return -1.7976931348623157e+308; }
575 NEFORCE_NODISCARD
static constexpr float64_t max_nega()
noexcept {
return -2.2250738585072014e-308; }
577 NEFORCE_NODISCARD
static constexpr float64_t min()
noexcept {
return min_posi(); }
578 NEFORCE_NODISCARD
static constexpr float64_t max()
noexcept {
return max_posi(); }
580 NEFORCE_NODISCARD
static constexpr float64_t lowest()
noexcept {
return min_nega(); }
581 NEFORCE_NODISCARD
static constexpr float64_t epsilon()
noexcept {
return 2.2204460492503131e-16; }
582 NEFORCE_NODISCARD
static constexpr float64_t round_error()
noexcept {
return 0.5; }
583 NEFORCE_NODISCARD
static constexpr float64_t denorm_min()
noexcept {
return 4.9406564584124654e-324; }
585 NEFORCE_NODISCARD
static constexpr float64_t infinity()
noexcept {
return __builtin_huge_val(); }
586 NEFORCE_NODISCARD
static constexpr float64_t quiet_nan()
noexcept {
587#ifdef NEFORCE_COMPILER_GCC
588 return __builtin_nan(
"");
590 return __builtin_nan(
"0");
593 NEFORCE_NODISCARD
static constexpr float64_t signaling_nan()
noexcept {
594#ifdef NEFORCE_COMPILER_GCC
595 return __builtin_nans(
"");
597 return __builtin_nans(
"1");
601 static constexpr int digits = 53;
602 static constexpr int digits10 = 15;
603 static constexpr int max_digits10 = 17;
604 static constexpr int max_exponent = 1024;
605 static constexpr int max_exponent10 = 308;
606 static constexpr int min_exponent = -1021;
607 static constexpr int min_exponent10 = -307;
610#ifdef NEFORCE_COMPILER_GNUC
618 NEFORCE_NODISCARD
static constexpr decimal_t min_posi()
noexcept {
619 return 3.36210314311209350626267781732175260e-4932L;
621 NEFORCE_NODISCARD
static constexpr decimal_t max_posi()
noexcept {
622 return 1.18973149535723176502126385303097021e+4932L;
624 NEFORCE_NODISCARD
static constexpr decimal_t min_nega()
noexcept {
625 return -1.18973149535723176502126385303097021e+4932L;
627 NEFORCE_NODISCARD
static constexpr decimal_t max_nega()
noexcept {
628 return -3.36210314311209350626267781732175260e-4932L;
631 NEFORCE_NODISCARD
static constexpr decimal_t min()
noexcept {
return min_posi(); }
632 NEFORCE_NODISCARD
static constexpr decimal_t max()
noexcept {
return max_posi(); }
634 NEFORCE_NODISCARD
static constexpr decimal_t lowest()
noexcept {
return min_nega(); }
635 NEFORCE_NODISCARD
static constexpr decimal_t epsilon()
noexcept {
636# ifdef NEFORCE_ARCH_X86
637 return 1.08420217248550443401e-19L;
639 return 1.92592994438723585305597794258492732e-34L;
642 NEFORCE_NODISCARD
static constexpr decimal_t round_error()
noexcept {
return 0.5L; }
643 NEFORCE_NODISCARD
static constexpr decimal_t denorm_min()
noexcept {
return 3.64519953188247460253e-4951L; }
645 NEFORCE_NODISCARD
static constexpr decimal_t infinity()
noexcept {
return __builtin_huge_vall(); }
646 NEFORCE_NODISCARD
static constexpr decimal_t quiet_nan()
noexcept {
return __builtin_nanl(
""); }
647 NEFORCE_NODISCARD
static constexpr decimal_t signaling_nan()
noexcept {
return __builtin_nansl(
""); }
649# ifdef NEFORCE_ARCH_X86
650 static constexpr int digits = 64;
651 static constexpr int digits10 = 18;
652 static constexpr int max_digits10 = 21;
654 static constexpr int digits = 113;
655 static constexpr int digits10 = 33;
656 static constexpr int max_digits10 = 36;
658 static constexpr int max_exponent = 16384;
659 static constexpr int max_exponent10 = 4932;
660 static constexpr int min_exponent = -16381;
661 static constexpr int min_exponent10 = -4931;
670NEFORCE_END_NAMESPACE__
static constexpr int max_digits10
保证精度的最大十进制位数
static constexpr int min_exponent10
最小十进制指数
static constexpr int digits10
十进制有效位数
static constexpr int digits
尾数位数,包括隐藏位
static constexpr float32_t min_nega() noexcept
获取最小负规范值
static constexpr int max_exponent10
最大十进制指数
static constexpr int max_exponent
最大指数
static constexpr float32_t max_posi() noexcept
获取最大正规范值
static constexpr float32_t max_nega() noexcept
获取最大负规范值
static constexpr float32_t min_posi() noexcept
获取最小正规范值
static constexpr int min_exponent
最小指数
static constexpr T lowest() noexcept
获取类型的最低值
static constexpr T denorm_min() noexcept
获取最小的次正规化正值
static constexpr T quiet_nan() noexcept
获取安静nan表示
static constexpr T max() noexcept
获取类型的最大值
static constexpr T infinity() noexcept
获取正无穷大表示
static constexpr T min() noexcept
获取类型的最小值
static constexpr T epsilon() noexcept
获取机器精度
static constexpr T round_error() noexcept
获取最大舍入误差
static constexpr T signaling_nan() noexcept
获取信号nan表示
constexpr const T & min(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(b, a)))
返回两个值中的较小者
float float32_t
32位单精度浮点数类型
unsigned int uint32_t
32位无符号整数类型
unsigned long uint64_t
64位无符号整数类型
long double decimal_t
扩展精度浮点数类型
unsigned char uint8_t
8位无符号整数类型
double float64_t
64位双精度浮点数类型
unsigned short uint16_t
16位无符号整数类型
signed char int8_t
8位有符号整数类型
float_denorm_type
浮点数次正规化状态
@ TOWARD_NEG_INFINITY
向负无穷舍入(向下取整)
@ TOWARD_INFINITY
向正无穷舍入(向上取整)