MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
numeric_traits.hpp
浏览该文件的文档.
1#ifndef MSTL_CORE_NUMERIC_NUMERIC_TRAITS_HPP__
2#define MSTL_CORE_NUMERIC_NUMERIC_TRAITS_HPP__
3
10
12#ifdef MSTL_PLATFORM_WINDOWS__
13#ifdef max
14#undef max
15#endif
16#ifdef min
17#undef min
18#endif
19#endif
21
27
39
53
56
63struct numeric_base {
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;
87};
88
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;
104#endif
105};
106
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;
125};
126
129
140template <typename T, typename Dummy = void>
141class numeric_traits : public _INNER numeric_base {
142public:
148 MSTL_NODISCARD static constexpr T min() noexcept { return T(); }
153 MSTL_NODISCARD static constexpr T max() noexcept { return T(); }
154
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(); }
178
183 MSTL_NODISCARD static constexpr T infinity() noexcept { return T(); }
193 MSTL_NODISCARD static constexpr T quiet_nan() noexcept { return T(); }
204 MSTL_NODISCARD static constexpr T signaling_nan() noexcept { return T(); }
205};
206
211template <typename T>
212class numeric_traits<const T> : public numeric_traits<T> {};
213
218template <typename T>
219class numeric_traits<volatile T> : public numeric_traits<T> {};
220
225template <typename T>
226class numeric_traits<const volatile T> : public numeric_traits<T> {};
227
228
232template <>
233class numeric_traits<bool> : public _INNER numeric_int_base {
234public:
235 MSTL_NODISCARD static constexpr bool min() noexcept { return false; }
236 MSTL_NODISCARD static constexpr bool max() noexcept { return true; }
237
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; }
242
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; }
246
247 static constexpr int digits = 1;
248};
249
253template <>
254class numeric_traits<int8_t> : public _INNER numeric_int_base {
255public:
256 MSTL_NODISCARD static constexpr int8_t min() noexcept { return -128; }
257 MSTL_NODISCARD static constexpr int8_t max() noexcept { return 127; }
258
259 MSTL_NODISCARD static constexpr int8_t lowest() noexcept { return min(); }
260 MSTL_NODISCARD static constexpr int8_t epsilon() noexcept { return 0; }
261 MSTL_NODISCARD static constexpr int8_t round_error() noexcept { return 0; }
262 MSTL_NODISCARD static constexpr int8_t denorm_min() noexcept { return 0; }
263
264 MSTL_NODISCARD static constexpr int8_t infinity() noexcept { return 0; }
265 MSTL_NODISCARD static constexpr int8_t quiet_nan() noexcept { return 0; }
266 MSTL_NODISCARD static constexpr int8_t signaling_nan() noexcept { return 0; }
267
268 static constexpr bool is_signed = true;
269 static constexpr int digits = 7;
270 static constexpr int digits10 = 2;
271};
272
276template <>
277class numeric_traits<int16_t> : public _INNER numeric_int_base {
278public:
279 MSTL_NODISCARD static constexpr int16_t min() noexcept { return -32768; }
280 MSTL_NODISCARD static constexpr int16_t max() noexcept { return 32767; }
281
282 MSTL_NODISCARD static constexpr int16_t lowest() noexcept { return min(); }
283 MSTL_NODISCARD static constexpr int16_t epsilon() noexcept { return 0; }
284 MSTL_NODISCARD static constexpr int16_t round_error() noexcept { return 0; }
285 MSTL_NODISCARD static constexpr int16_t denorm_min() noexcept { return 0; }
286
287 MSTL_NODISCARD static constexpr int16_t infinity() noexcept { return 0; }
288 MSTL_NODISCARD static constexpr int16_t quiet_nan() noexcept { return 0; }
289 MSTL_NODISCARD static constexpr int16_t signaling_nan() noexcept { return 0; }
290
291 static constexpr bool is_signed = true;
292 static constexpr int digits = 15;
293 static constexpr int digits10 = 4;
294};
295
299template <>
300class numeric_traits<int32_t> : public _INNER numeric_int_base {
301public:
302 MSTL_NODISCARD static constexpr int32_t min() noexcept { return -2147483647 - 1; }
303 MSTL_NODISCARD static constexpr int32_t max() noexcept { return 2147483647; }
304
305 MSTL_NODISCARD static constexpr int32_t lowest() noexcept { return min(); }
306 MSTL_NODISCARD static constexpr int32_t epsilon() noexcept { return 0; }
307 MSTL_NODISCARD static constexpr int32_t round_error() noexcept { return 0; }
308 MSTL_NODISCARD static constexpr int32_t denorm_min() noexcept { return 0; }
309
310 MSTL_NODISCARD static constexpr int32_t infinity() noexcept { return 0; }
311 MSTL_NODISCARD static constexpr int32_t quiet_nan() noexcept { return 0; }
312 MSTL_NODISCARD static constexpr int32_t signaling_nan() noexcept { return 0; }
313
314 static constexpr bool is_signed = true;
315 static constexpr int digits = 31;
316 static constexpr int digits10 = 9;
317};
318
322template <>
323class numeric_traits<int64_t> : public _INNER numeric_int_base {
324public:
325 MSTL_NODISCARD static constexpr int64_t min() noexcept { return -9223372036854775807LL - 1; }
326 MSTL_NODISCARD static constexpr int64_t max() noexcept { return 9223372036854775807LL; }
327
328 MSTL_NODISCARD static constexpr int64_t lowest() noexcept { return min(); }
329 MSTL_NODISCARD static constexpr int64_t epsilon() noexcept { return 0; }
330 MSTL_NODISCARD static constexpr int64_t round_error() noexcept { return 0; }
331 MSTL_NODISCARD static constexpr int64_t denorm_min() noexcept { return 0; }
332
333 MSTL_NODISCARD static constexpr int64_t infinity() noexcept { return 0; }
334 MSTL_NODISCARD static constexpr int64_t quiet_nan() noexcept { return 0; }
335 MSTL_NODISCARD static constexpr int64_t signaling_nan() noexcept { return 0; }
336
337 static constexpr bool is_signed = true;
338 static constexpr int digits = 63;
339 static constexpr int digits10 = 18;
340};
341
342#ifdef MSTL_PLATFORM_LINUX64__
343template <>
344class numeric_traits<long long> : public numeric_traits<int64_t> {};
345#else
346template <>
347class numeric_traits<long> : public numeric_traits<int32_t> {};
348#endif
349
353template <>
354class numeric_traits<uint8_t> : public _INNER numeric_int_base {
355public:
356 MSTL_NODISCARD static constexpr uint8_t min() noexcept { return 0; }
357 MSTL_NODISCARD static constexpr uint8_t max() noexcept { return 0xffU; }
358
359 MSTL_NODISCARD static constexpr uint8_t lowest() noexcept { return min(); }
360 MSTL_NODISCARD static constexpr uint8_t epsilon() noexcept { return 0; }
361 MSTL_NODISCARD static constexpr uint8_t round_error() noexcept { return 0; }
362 MSTL_NODISCARD static constexpr uint8_t denorm_min() noexcept { return 0; }
363
364 MSTL_NODISCARD static constexpr uint8_t infinity() noexcept { return 0; }
365 MSTL_NODISCARD static constexpr uint8_t quiet_nan() noexcept { return 0; }
366 MSTL_NODISCARD static constexpr uint8_t signaling_nan() noexcept { return 0; }
367
368 static constexpr bool is_modulo = true;
369 static constexpr int digits = 8;
370 static constexpr int digits10 = 2;
371};
372
376template <>
377class numeric_traits<uint16_t> : public _INNER numeric_int_base {
378public:
379 MSTL_NODISCARD static constexpr uint16_t min() noexcept { return 0; }
380 MSTL_NODISCARD static constexpr uint16_t max() noexcept { return 0xffffU; }
381
382 MSTL_NODISCARD static constexpr uint16_t lowest() noexcept { return min(); }
383 MSTL_NODISCARD static constexpr uint16_t epsilon() noexcept { return 0; }
384 MSTL_NODISCARD static constexpr uint16_t round_error() noexcept { return 0; }
385 MSTL_NODISCARD static constexpr uint16_t denorm_min() noexcept { return 0; }
386
387 MSTL_NODISCARD static constexpr uint16_t infinity() noexcept { return 0; }
388 MSTL_NODISCARD static constexpr uint16_t quiet_nan() noexcept { return 0; }
389 MSTL_NODISCARD static constexpr uint16_t signaling_nan() noexcept { return 0; }
390
391 static constexpr bool is_modulo = true;
392 static constexpr int digits = 16;
393 static constexpr int digits10 = 4;
394};
395
399template <>
400class numeric_traits<uint32_t> : public _INNER numeric_int_base {
401public:
402 MSTL_NODISCARD static constexpr uint32_t min() noexcept { return 0; }
403 MSTL_NODISCARD static constexpr uint32_t max() noexcept { return 0xffffffffU; }
404
405 MSTL_NODISCARD static constexpr uint32_t lowest() noexcept { return min(); }
406 MSTL_NODISCARD static constexpr uint32_t epsilon() noexcept { return 0; }
407 MSTL_NODISCARD static constexpr uint32_t round_error() noexcept { return 0; }
408 MSTL_NODISCARD static constexpr uint32_t denorm_min() noexcept { return 0; }
409
410 MSTL_NODISCARD static constexpr uint32_t infinity() noexcept { return 0; }
411 MSTL_NODISCARD static constexpr uint32_t quiet_nan() noexcept { return 0; }
412 MSTL_NODISCARD static constexpr uint32_t signaling_nan() noexcept { return 0; }
413
414 static constexpr bool is_modulo = true;
415 static constexpr int digits = 32;
416 static constexpr int digits10 = 9;
417};
418
422template <>
423class numeric_traits<uint64_t> : public _INNER numeric_int_base {
424public:
425 MSTL_NODISCARD static constexpr uint64_t min() noexcept { return 0; }
426 MSTL_NODISCARD static constexpr uint64_t max() noexcept { return 0xffffffffffffffffULL; }
427
428 MSTL_NODISCARD static constexpr uint64_t lowest() noexcept { return min(); }
429 MSTL_NODISCARD static constexpr uint64_t epsilon() noexcept { return 0; }
430 MSTL_NODISCARD static constexpr uint64_t round_error() noexcept { return 0; }
431 MSTL_NODISCARD static constexpr uint64_t denorm_min() noexcept { return 0; }
432
433 MSTL_NODISCARD static constexpr uint64_t infinity() noexcept { return 0; }
434 MSTL_NODISCARD static constexpr uint64_t quiet_nan() noexcept { return 0; }
435 MSTL_NODISCARD static constexpr uint64_t signaling_nan() noexcept { return 0; }
436
437 static constexpr bool is_modulo = true;
438 static constexpr int digits = 64;
439 static constexpr int digits10 = 19;
440};
441
442#ifdef MSTL_PLATFORM_LINUX64__
443template <>
444class numeric_traits<unsigned long long> : public numeric_traits<uint64_t> {};
445#else
446template <>
447class numeric_traits<unsigned long> : public numeric_traits<uint32_t> {};
448#endif
449
450
454template <>
455class numeric_traits<char> : public numeric_traits<int8_t> {};
456
457#ifdef MSTL_STANDARD_20__
461template <>
462class numeric_traits<char8_t> : public numeric_traits<uint8_t> {};
463#endif
464
468template <>
469class numeric_traits<char16_t> : public numeric_traits<uint16_t> {};
470
474template <>
475class numeric_traits<char32_t> : public numeric_traits<uint32_t> {};
476
481template <>
482class numeric_traits<wchar_t>;
483
484#ifdef MSTL_PLATFORM_WINDOWS__
485template <>
486class numeric_traits<wchar_t> : public numeric_traits<uint16_t> {};
487#elif defined(MSTL_PLATFORM_LINUX__)
488template <>
489class numeric_traits<wchar_t> : public numeric_traits<int32_t> {};
490#endif
491
492
496template <>
497class numeric_traits<float32_t> : public _INNER numeric_float_base {
498public:
503 MSTL_NODISCARD static constexpr float32_t min_posi() noexcept { return 1.175494351e-38f; }
508 MSTL_NODISCARD static constexpr float32_t max_posi() noexcept { return 3.402823466e+38f; }
513 MSTL_NODISCARD static constexpr float32_t min_nega() noexcept { return -3.402823466e+38f; }
518 MSTL_NODISCARD static constexpr float32_t max_nega() noexcept { return -1.175494351e-38f; }
519
520 MSTL_NODISCARD static constexpr float32_t min() noexcept { return min_posi(); }
521 MSTL_NODISCARD static constexpr float32_t max() noexcept { return max_posi(); }
522
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; }
525 MSTL_NODISCARD static constexpr float32_t round_error() noexcept { return 0.5F; }
526 MSTL_NODISCARD static constexpr float32_t denorm_min() noexcept { return 1.401298464e-45f; }
527
528 MSTL_NODISCARD static constexpr float32_t infinity() noexcept { return __builtin_huge_valf(); }
529 MSTL_NODISCARD static constexpr float32_t quiet_nan() noexcept {
530#ifdef MSTL_COMPILER_GCC__
531 return __builtin_nanf("");
532#else
533 return __builtin_nan("0");
534#endif
535 }
536 MSTL_NODISCARD static constexpr float32_t signaling_nan() noexcept {
537#ifdef MSTL_COMPILER_GCC__
538 return __builtin_nansf("");
539#else
540 return __builtin_nans("1");
541#endif
542 }
543
544 static constexpr int digits = 24;
545 static constexpr int digits10 = 6;
546 static constexpr int max_digits10 = 9;
547 static constexpr int max_exponent = 128;
548 static constexpr int max_exponent10 = 38;
549 static constexpr int min_exponent = -125;
550 static constexpr int min_exponent10 = -37;
551};
552
556template <>
557class numeric_traits<float64_t> : public _INNER numeric_float_base {
558public:
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; }
563
564 MSTL_NODISCARD static constexpr float64_t min() noexcept { return min_posi(); }
565 MSTL_NODISCARD static constexpr float64_t max() noexcept { return max_posi(); }
566
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; }
569 MSTL_NODISCARD static constexpr float64_t round_error() noexcept { return 0.5; }
570 MSTL_NODISCARD static constexpr float64_t denorm_min() noexcept { return 4.9406564584124654e-324; }
571
572 MSTL_NODISCARD static constexpr float64_t infinity() noexcept { return __builtin_huge_val(); }
573 MSTL_NODISCARD static constexpr float64_t quiet_nan() noexcept {
574#ifdef MSTL_COMPILER_GCC__
575 return __builtin_nan("");
576#else
577 return __builtin_nan("0");
578#endif
579 }
580 MSTL_NODISCARD static constexpr float64_t signaling_nan() noexcept {
581#ifdef MSTL_COMPILER_GCC__
582 return __builtin_nans("");
583#else
584 return __builtin_nans("1");
585#endif
586 }
587
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;
595};
596
597#ifdef MSTL_COMPILER_GNUC__
602template <>
603class numeric_traits<decimal_t> : public _INNER numeric_float_base {
604public:
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; }
609
610 MSTL_NODISCARD static constexpr decimal_t min() noexcept { return min_posi(); }
611 MSTL_NODISCARD static constexpr decimal_t max() noexcept { return max_posi(); }
612
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; }
615 MSTL_NODISCARD static constexpr decimal_t round_error() noexcept { return 0.5L; }
616 MSTL_NODISCARD static constexpr decimal_t denorm_min() noexcept { return 3.64519953188247460253e-4951L; }
617
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(""); }
620 MSTL_NODISCARD static constexpr decimal_t signaling_nan() noexcept { return __builtin_nansl(""); }
621
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;
629};
630#else
631template <>
632class numeric_traits<decimal_t> : public numeric_traits<float64_t> {};
633#endif
634 // NumericTraits
636
638#endif // MSTL_CORE_NUMERIC_NUMERIC_TRAITS_HPP__
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位无符号整数类型
short int16_t
16位有符号整数类型
int int32_t
32位有符号整数类型
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
浮点数次正规化状态
FLOAT_ROUND_TYPE
浮点数舍入模式
@ INDETERMINATE
状态不确定
@ PRESENT
支持次正规化
@ ABSENT
不支持次正规化
@ TOWARD_NEG_INFINITY
向负无穷舍入(向下取整)
@ TO_NEAREST
向最近值舍入(四舍五入)
@ TOWARD_ZERO
向零舍入(截断)
@ TOWARD_INFINITY
向正无穷舍入(向上取整)
MSTL基本类型别名