1#ifndef MSTL_CORE_NUMERIC_NUMERIC_TRAITS_HPP__
2#define MSTL_CORE_NUMERIC_NUMERIC_TRAITS_HPP__
12#ifdef MSTL_PLATFORM_WINDOWS__
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 MSTL_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 MSTL_NODISCARD
static constexpr T
min() noexcept {
return T(); }
153 MSTL_NODISCARD
static constexpr T
max() noexcept {
return T(); }
160 MSTL_NODISCARD
static constexpr T
lowest() noexcept {
return T(); }
167 MSTL_NODISCARD
static constexpr T
epsilon() noexcept {
return T(); }
172 MSTL_NODISCARD
static constexpr T
round_error() noexcept {
return T(); }
177 MSTL_NODISCARD
static constexpr T
denorm_min() noexcept {
return T(); }
183 MSTL_NODISCARD
static constexpr T
infinity() noexcept {
return T(); }
193 MSTL_NODISCARD
static constexpr T
quiet_nan() noexcept {
return T(); }
235 MSTL_NODISCARD
static constexpr bool min()
noexcept {
return false; }
236 MSTL_NODISCARD
static constexpr bool max()
noexcept {
return true; }
238 MSTL_NODISCARD
static constexpr bool lowest()
noexcept {
return min(); }
239 MSTL_NODISCARD
static constexpr bool epsilon()
noexcept {
return false; }
240 MSTL_NODISCARD
static constexpr bool round_error()
noexcept {
return false; }
241 MSTL_NODISCARD
static constexpr bool denorm_min()
noexcept {
return false; }
243 MSTL_NODISCARD
static constexpr bool infinity()
noexcept {
return false; }
244 MSTL_NODISCARD
static constexpr bool quiet_nan()
noexcept {
return false; }
245 MSTL_NODISCARD
static constexpr bool signaling_nan()
noexcept {
return false; }
247 static constexpr int digits = 1;
256 MSTL_NODISCARD
static constexpr int8_t min()
noexcept {
return -128; }
257 MSTL_NODISCARD
static constexpr int8_t max()
noexcept {
return 127; }
259 MSTL_NODISCARD
static constexpr int8_t lowest()
noexcept {
return min(); }
260 MSTL_NODISCARD
static constexpr int8_t epsilon()
noexcept {
return 0; }
264 MSTL_NODISCARD
static constexpr int8_t infinity()
noexcept {
return 0; }
265 MSTL_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 MSTL_NODISCARD
static constexpr int16_t min()
noexcept {
return -32768; }
280 MSTL_NODISCARD
static constexpr int16_t max()
noexcept {
return 32767; }
283 MSTL_NODISCARD
static constexpr int16_t epsilon()
noexcept {
return 0; }
287 MSTL_NODISCARD
static constexpr int16_t infinity()
noexcept {
return 0; }
291 static constexpr bool is_signed =
true;
292 static constexpr int digits = 15;
293 static constexpr int digits10 = 4;
302 MSTL_NODISCARD
static constexpr int32_t min()
noexcept {
return -2147483647 - 1; }
303 MSTL_NODISCARD
static constexpr int32_t max()
noexcept {
return 2147483647; }
306 MSTL_NODISCARD
static constexpr int32_t epsilon()
noexcept {
return 0; }
310 MSTL_NODISCARD
static constexpr int32_t infinity()
noexcept {
return 0; }
314 static constexpr bool is_signed =
true;
315 static constexpr int digits = 31;
316 static constexpr int digits10 = 9;
325 MSTL_NODISCARD
static constexpr int64_t min()
noexcept {
return -9223372036854775807LL - 1; }
326 MSTL_NODISCARD
static constexpr int64_t max()
noexcept {
return 9223372036854775807LL; }
329 MSTL_NODISCARD
static constexpr int64_t epsilon()
noexcept {
return 0; }
333 MSTL_NODISCARD
static constexpr int64_t infinity()
noexcept {
return 0; }
337 static constexpr bool is_signed =
true;
338 static constexpr int digits = 63;
339 static constexpr int digits10 = 18;
342#ifdef MSTL_PLATFORM_LINUX64__
356 MSTL_NODISCARD
static constexpr uint8_t min()
noexcept {
return 0; }
357 MSTL_NODISCARD
static constexpr uint8_t max()
noexcept {
return 0xffU; }
360 MSTL_NODISCARD
static constexpr uint8_t epsilon()
noexcept {
return 0; }
364 MSTL_NODISCARD
static constexpr uint8_t infinity()
noexcept {
return 0; }
368 static constexpr bool is_modulo =
true;
369 static constexpr int digits = 8;
370 static constexpr int digits10 = 2;
379 MSTL_NODISCARD
static constexpr uint16_t min()
noexcept {
return 0; }
380 MSTL_NODISCARD
static constexpr uint16_t max()
noexcept {
return 0xffffU; }
383 MSTL_NODISCARD
static constexpr uint16_t epsilon()
noexcept {
return 0; }
391 static constexpr bool is_modulo =
true;
392 static constexpr int digits = 16;
393 static constexpr int digits10 = 4;
402 MSTL_NODISCARD
static constexpr uint32_t min()
noexcept {
return 0; }
403 MSTL_NODISCARD
static constexpr uint32_t max()
noexcept {
return 0xffffffffU; }
406 MSTL_NODISCARD
static constexpr uint32_t epsilon()
noexcept {
return 0; }
414 static constexpr bool is_modulo =
true;
415 static constexpr int digits = 32;
416 static constexpr int digits10 = 9;
425 MSTL_NODISCARD
static constexpr uint64_t min()
noexcept {
return 0; }
426 MSTL_NODISCARD
static constexpr uint64_t max()
noexcept {
return 0xffffffffffffffffULL; }
429 MSTL_NODISCARD
static constexpr uint64_t epsilon()
noexcept {
return 0; }
437 static constexpr bool is_modulo =
true;
438 static constexpr int digits = 64;
439 static constexpr int digits10 = 19;
442#ifdef MSTL_PLATFORM_LINUX64__
457#ifdef MSTL_STANDARD_20__
484#ifdef MSTL_PLATFORM_WINDOWS__
487#elif defined(MSTL_PLATFORM_LINUX__)
520 MSTL_NODISCARD
static constexpr float32_t min() noexcept {
return min_posi(); }
521 MSTL_NODISCARD
static constexpr float32_t max() noexcept {
return max_posi(); }
523 MSTL_NODISCARD
static constexpr float32_t lowest() noexcept {
return min_nega(); }
524 MSTL_NODISCARD
static constexpr float32_t epsilon() noexcept {
return 1.192092896e-07f; }
526 MSTL_NODISCARD
static constexpr float32_t denorm_min() noexcept {
return 1.401298464e-45f; }
528 MSTL_NODISCARD
static constexpr float32_t infinity() noexcept {
return __builtin_huge_valf(); }
530#ifdef MSTL_COMPILER_GCC__
531 return __builtin_nanf(
"");
533 return __builtin_nan(
"0");
537#ifdef MSTL_COMPILER_GCC__
538 return __builtin_nansf(
"");
540 return __builtin_nans(
"1");
559 MSTL_NODISCARD
static constexpr float64_t min_posi()
noexcept {
return 2.2250738585072014e-308; }
560 MSTL_NODISCARD
static constexpr float64_t max_posi()
noexcept {
return 1.7976931348623157e+308; }
561 MSTL_NODISCARD
static constexpr float64_t min_nega()
noexcept {
return -1.7976931348623157e+308; }
562 MSTL_NODISCARD
static constexpr float64_t max_nega()
noexcept {
return -2.2250738585072014e-308; }
564 MSTL_NODISCARD
static constexpr float64_t min()
noexcept {
return min_posi(); }
565 MSTL_NODISCARD
static constexpr float64_t max()
noexcept {
return max_posi(); }
567 MSTL_NODISCARD
static constexpr float64_t lowest()
noexcept {
return min_nega(); }
568 MSTL_NODISCARD
static constexpr float64_t epsilon()
noexcept {
return 2.2204460492503131e-16; }
570 MSTL_NODISCARD
static constexpr float64_t denorm_min()
noexcept {
return 4.9406564584124654e-324; }
572 MSTL_NODISCARD
static constexpr float64_t infinity()
noexcept {
return __builtin_huge_val(); }
574#ifdef MSTL_COMPILER_GCC__
575 return __builtin_nan(
"");
577 return __builtin_nan(
"0");
581#ifdef MSTL_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 MSTL_COMPILER_GNUC__
605 MSTL_NODISCARD
static constexpr decimal_t min_posi() noexcept {
return 3.36210314311209350626267781732175260e-4932L; }
606 MSTL_NODISCARD
static constexpr decimal_t max_posi() noexcept {
return 1.18973149535723176502126385303097021e+4932L; }
607 MSTL_NODISCARD
static constexpr decimal_t min_nega() noexcept {
return -1.18973149535723176502126385303097021e+4932L; }
608 MSTL_NODISCARD
static constexpr decimal_t max_nega() noexcept {
return -3.36210314311209350626267781732175260e-4932L; }
610 MSTL_NODISCARD
static constexpr decimal_t min() noexcept {
return min_posi(); }
611 MSTL_NODISCARD
static constexpr decimal_t max() noexcept {
return max_posi(); }
613 MSTL_NODISCARD
static constexpr decimal_t lowest() noexcept {
return min_nega(); }
614 MSTL_NODISCARD
static constexpr decimal_t epsilon() noexcept {
return 1.08420217248550443401e-19L; }
616 MSTL_NODISCARD
static constexpr decimal_t denorm_min() noexcept {
return 3.64519953188247460253e-4951L; }
618 MSTL_NODISCARD
static constexpr decimal_t infinity() noexcept {
return __builtin_huge_val(); }
619 MSTL_NODISCARD
static constexpr decimal_t quiet_nan() noexcept {
return __builtin_nanl(
""); }
622 static constexpr int digits = 64;
623 static constexpr int digits10 = 18;
624 static constexpr int max_digits10 = 21;
625 static constexpr int max_exponent = 16384;
626 static constexpr int max_exponent10 = 4932;
627 static constexpr int min_exponent = -16381;
628 static constexpr int min_exponent10 = -4931;
static constexpr int min_exponent10
最小十进制指数
static MSTL_NODISCARD constexpr float32_t max_nega() noexcept
获取最大负规范值
static MSTL_NODISCARD constexpr float32_t min_nega() noexcept
获取最小负规范值
static constexpr int max_digits10
保证精度的最大十进制位数
static constexpr int max_exponent10
最大十进制指数
static constexpr int digits
尾数位数,包括隐藏位
static MSTL_NODISCARD constexpr float32_t min_posi() noexcept
获取最小正规范值
static constexpr int digits10
十进制有效位数
static constexpr int max_exponent
最大指数
static MSTL_NODISCARD constexpr float32_t max_posi() noexcept
获取最大正规范值
static constexpr int min_exponent
最小指数
static MSTL_NODISCARD constexpr T signaling_nan() noexcept
获取信号nan表示
static MSTL_NODISCARD constexpr T infinity() noexcept
获取正无穷大表示
static MSTL_NODISCARD constexpr T denorm_min() noexcept
获取最小的次正规化正值
static MSTL_NODISCARD constexpr T epsilon() noexcept
获取机器精度
static MSTL_NODISCARD constexpr T quiet_nan() noexcept
获取安静nan表示
static MSTL_NODISCARD constexpr T min() noexcept
获取类型的最小值
static MSTL_NODISCARD constexpr T lowest() noexcept
获取类型的最低值
static MSTL_NODISCARD constexpr T round_error() noexcept
获取最大舍入误差
static MSTL_NODISCARD constexpr T max() 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位有符号整数类型
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
FLOAT_DENORM_TYPE
浮点数次正规化状态
@ TOWARD_NEG_INFINITY
向负无穷舍入(向下取整)
@ TOWARD_INFINITY
向正无穷舍入(向上取整)