NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
numeric_traits.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_NUMERIC_NUMERIC_TRAITS_HPP__
2#define NEFORCE_CORE_NUMERIC_NUMERIC_TRAITS_HPP__
3
10
12#ifdef NEFORCE_PLATFORM_WINDOWS
13# ifdef max
14# undef max
15# endif
16# ifdef min
17# undef min
18# endif
19#endif
20NEFORCE_BEGIN_NAMESPACE__
21
27
39
53
55NEFORCE_BEGIN_INNER__
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 NEFORCE_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
127NEFORCE_END_INNER__
129
140template <typename T, typename Dummy = void>
141class numeric_traits : public inner::numeric_base {
142public:
148 NEFORCE_NODISCARD static constexpr T min() noexcept { return T(); }
153 NEFORCE_NODISCARD static constexpr T max() noexcept { return T(); }
154
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(); }
178
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(); }
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 NEFORCE_NODISCARD static constexpr bool min() noexcept { return false; }
236 NEFORCE_NODISCARD static constexpr bool max() noexcept { return true; }
237
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; }
242
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; }
246
247 static constexpr int digits = 1;
248};
249
253template <>
254class numeric_traits<int8_t> : public inner::numeric_int_base {
255public:
256 NEFORCE_NODISCARD static constexpr int8_t min() noexcept { return -128; }
257 NEFORCE_NODISCARD static constexpr int8_t max() noexcept { return 127; }
258
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; }
263
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; }
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 NEFORCE_NODISCARD static constexpr int16_t min() noexcept { return -32768; }
280 NEFORCE_NODISCARD static constexpr int16_t max() noexcept { return 32767; }
281
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; }
286
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; }
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 NEFORCE_NODISCARD static constexpr int32_t min() noexcept { return -2147483647 - 1; }
303 NEFORCE_NODISCARD static constexpr int32_t max() noexcept { return 2147483647; }
304
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; }
309
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; }
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 NEFORCE_NODISCARD static constexpr int64_t min() noexcept { return -9223372036854775807LL - 1; }
326 NEFORCE_NODISCARD static constexpr int64_t max() noexcept { return 9223372036854775807LL; }
327
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; }
332
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; }
336
337 static constexpr bool is_signed = true;
338 static constexpr int digits = 63;
339 static constexpr int digits10 = 18;
340};
341
342#ifdef NEFORCE_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 NEFORCE_NODISCARD static constexpr uint8_t min() noexcept { return 0; }
357 NEFORCE_NODISCARD static constexpr uint8_t max() noexcept { return 0xffU; }
358
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; }
363
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; }
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 NEFORCE_NODISCARD static constexpr uint16_t min() noexcept { return 0; }
380 NEFORCE_NODISCARD static constexpr uint16_t max() noexcept { return 0xffffU; }
381
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; }
386
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; }
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 NEFORCE_NODISCARD static constexpr uint32_t min() noexcept { return 0; }
403 NEFORCE_NODISCARD static constexpr uint32_t max() noexcept { return 0xffffffffU; }
404
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; }
409
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; }
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 NEFORCE_NODISCARD static constexpr uint64_t min() noexcept { return 0; }
426 NEFORCE_NODISCARD static constexpr uint64_t max() noexcept { return 0xffffffffffffffffULL; }
427
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; }
432
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; }
436
437 static constexpr bool is_modulo = true;
438 static constexpr int digits = 64;
439 static constexpr int digits10 = 19;
440};
441
442#ifdef NEFORCE_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>;
456
457#if defined(NEFORCE_ARCH_X86) || defined(NEFORCE_ARCH_LOONGARCH)
458template <>
459class numeric_traits<char> : public numeric_traits<int8_t> {};
460#else
461template <>
462class numeric_traits<char> : public numeric_traits<uint8_t> {};
463#endif
464
465#ifdef NEFORCE_STANDARD_20
469template <>
470class numeric_traits<char8_t> : public numeric_traits<uint8_t> {};
471#endif
472
476template <>
477class numeric_traits<char16_t> : public numeric_traits<uint16_t> {};
478
482template <>
483class numeric_traits<char32_t> : public numeric_traits<uint32_t> {};
484
489template <>
490class numeric_traits<wchar_t>;
491
492#ifdef NEFORCE_PLATFORM_WINDOWS
493template <>
494class numeric_traits<wchar_t> : public numeric_traits<uint16_t> {};
495#elif defined(NEFORCE_PLATFORM_LINUX)
496# ifdef NEFORCE_ARCH_ARM
497template <>
498class numeric_traits<wchar_t> : public numeric_traits<uint32_t> {};
499# else
500template <>
501class numeric_traits<wchar_t> : public numeric_traits<int32_t> {};
502# endif
503#endif
504
505
509template <>
510class numeric_traits<float32_t> : public inner::numeric_float_base {
511public:
516 NEFORCE_NODISCARD static constexpr float32_t min_posi() noexcept { return 1.175494351e-38F; }
521 NEFORCE_NODISCARD static constexpr float32_t max_posi() noexcept { return 3.402823466e+38F; }
526 NEFORCE_NODISCARD static constexpr float32_t min_nega() noexcept { return -3.402823466e+38F; }
531 NEFORCE_NODISCARD static constexpr float32_t max_nega() noexcept { return -1.175494351e-38F; }
532
533 NEFORCE_NODISCARD static constexpr float32_t min() noexcept { return min_posi(); }
534 NEFORCE_NODISCARD static constexpr float32_t max() noexcept { return max_posi(); }
535
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; }
540
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("");
545#else
546 return __builtin_nan("0");
547#endif
548 }
549 NEFORCE_NODISCARD static constexpr float32_t signaling_nan() noexcept {
550#ifdef NEFORCE_COMPILER_GCC
551 return __builtin_nansf("");
552#else
553 return __builtin_nans("1");
554#endif
555 }
556
557 static constexpr int digits = 24;
558 static constexpr int digits10 = 6;
559 static constexpr int max_digits10 = 9;
560 static constexpr int max_exponent = 128;
561 static constexpr int max_exponent10 = 38;
562 static constexpr int min_exponent = -125;
563 static constexpr int min_exponent10 = -37;
564};
565
569template <>
570class numeric_traits<float64_t> : public inner::numeric_float_base {
571public:
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; }
576
577 NEFORCE_NODISCARD static constexpr float64_t min() noexcept { return min_posi(); }
578 NEFORCE_NODISCARD static constexpr float64_t max() noexcept { return max_posi(); }
579
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; }
584
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("");
589#else
590 return __builtin_nan("0");
591#endif
592 }
593 NEFORCE_NODISCARD static constexpr float64_t signaling_nan() noexcept {
594#ifdef NEFORCE_COMPILER_GCC
595 return __builtin_nans("");
596#else
597 return __builtin_nans("1");
598#endif
599 }
600
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;
608};
609
610#ifdef NEFORCE_COMPILER_GNUC
615template <>
616class numeric_traits<decimal_t> : public inner::numeric_float_base {
617public:
618 NEFORCE_NODISCARD static constexpr decimal_t min_posi() noexcept {
619 return 3.36210314311209350626267781732175260e-4932L;
620 }
621 NEFORCE_NODISCARD static constexpr decimal_t max_posi() noexcept {
622 return 1.18973149535723176502126385303097021e+4932L;
623 }
624 NEFORCE_NODISCARD static constexpr decimal_t min_nega() noexcept {
625 return -1.18973149535723176502126385303097021e+4932L;
626 }
627 NEFORCE_NODISCARD static constexpr decimal_t max_nega() noexcept {
628 return -3.36210314311209350626267781732175260e-4932L;
629 }
630
631 NEFORCE_NODISCARD static constexpr decimal_t min() noexcept { return min_posi(); }
632 NEFORCE_NODISCARD static constexpr decimal_t max() noexcept { return max_posi(); }
633
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;
638# else
639 return 1.92592994438723585305597794258492732e-34L;
640# endif
641 }
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; }
644
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(""); }
648
649# ifdef NEFORCE_ARCH_X86
650 static constexpr int digits = 64;
651 static constexpr int digits10 = 18;
652 static constexpr int max_digits10 = 21;
653# else
654 static constexpr int digits = 113;
655 static constexpr int digits10 = 33;
656 static constexpr int max_digits10 = 36;
657# endif
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;
662};
663#else
664template <>
665class numeric_traits<decimal_t> : public numeric_traits<float64_t> {};
666#endif
667 // NumericTraits
669
670NEFORCE_END_NAMESPACE__
671#endif // NEFORCE_CORE_NUMERIC_NUMERIC_TRAITS_HPP__
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)))
返回两个值中的较小者
long int64_t
64位有符号整数类型
float float32_t
32位单精度浮点数类型
unsigned int uint32_t
32位无符号整数类型
unsigned long uint64_t
64位无符号整数类型
long double decimal_t
扩展精度浮点数类型
unsigned char uint8_t
8位无符号整数类型
int int32_t
32位有符号整数类型
double float64_t
64位双精度浮点数类型
unsigned short uint16_t
16位无符号整数类型
short int16_t
16位有符号整数类型
signed char int8_t
8位有符号整数类型
float_round_type
浮点数舍入模式
float_denorm_type
浮点数次正规化状态
@ TOWARD_NEG_INFINITY
向负无穷舍入(向下取整)
@ TO_NEAREST
向最近值舍入(四舍五入)
@ TOWARD_ZERO
向零舍入(截断)
@ TOWARD_INFINITY
向正无穷舍入(向上取整)
基本类型别名