• C++标准模板(STL)- 类型支持 (数值极限,traps,tinyness_before)


    数值极限

    std::numeric_limits

    定义于头文件

    定义于头文件

    template< class T > class numeric_limits;

    numeric_limits 类模板提供查询各种算术类型属性的标准化方式(例如 int 类型的最大可能值是 std::numeric_limits::max() )。
     

    鉴别可能导致算术运算出现陷阱的类型

    std::numeric_limits<T>::traps

    static const bool traps;

    (C++11 前)

    static constexpr bool traps;

    (C++11 起)

     std::numeric_limits::traps 的值,对所有至少有一个若用作算术运算参数则会生成陷阱的值的算术类型 T 为 true 。

    标准特化

    Tstd::numeric_limits::traps 的值
    /* non-specialized */false
    boolfalse
    char通常为 true
    signed char通常为 true
    unsigned char通常为 true
    wchar_t通常为 true
    char8_t通常为 true
    char16_t通常为 true
    char32_t通常为 true
    short通常为 true
    unsigned short通常为 true
    int通常为 true
    unsigned int通常为 true
    long通常为 true
    unsigned long通常为 true
    long long通常为 true
    unsigned long long通常为 true
    float通常为 false
    double通常为 false
    long double通常为 false

    注意

    大多数平台上,除以零始终会产生陷阱,而对所有支持值 0 的整数类型, std::numeric_limits::traps 为 true 。例外是类型 bool :即使除以 false 因为从 bool 整数提升到 int 而产生陷阱,这也是零值的 int 所产生的陷阱。零不是 bool 的值。

    大多数平台上,浮点异常可以在运行时开关(例如 Linux 上的 feenableexcept() 或 Windows 上的 _controlfp ),该情况下 std::numeric_limits::traps 对浮点类型的值反映程序启动时的浮点陷阱设施,它在大多数现代系统上为 false 。 DEC Alpha 程序可以是例外,若不以 -ieee 编译程序,则为 true 。

    调用示例

    1. #include <iostream>
    2. #include <string>
    3. #include <limits>
    4. #include <cstdint>
    5. #include <cfloat>
    6. struct SName
    7. {
    8. };
    9. //偏特化
    10. struct SPartSpec
    11. {
    12. };
    13. namespace std
    14. {
    15. template<>
    16. struct numeric_limits<SPartSpec>
    17. {
    18. static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
    19. static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
    20. static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
    21. static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
    22. static _GLIBCXX_USE_CONSTEXPR bool has_infinity = true;
    23. static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = true;
    24. static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = true;
    25. static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm = denorm_present;
    26. static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = true;
    27. static _GLIBCXX_USE_CONSTEXPR float_round_style round_style = round_toward_neg_infinity;
    28. static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = true;
    29. static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
    30. static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
    31. static _GLIBCXX_USE_CONSTEXPR int digits = CHAR_BIT;
    32. static _GLIBCXX_USE_CONSTEXPR int digits10 = CHAR_BIT;
    33. static _GLIBCXX_USE_CONSTEXPR int max_digits10 = DECIMAL_DIG;
    34. static _GLIBCXX_USE_CONSTEXPR int radix = FLT_RADIX;
    35. static _GLIBCXX_USE_CONSTEXPR int min_exponent = FLT_MIN_EXP;
    36. static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = FLT_MIN_10_EXP;
    37. static _GLIBCXX_USE_CONSTEXPR int max_exponent = FLT_MAX_EXP;
    38. static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = FLT_MAX_EXP;
    39. static _GLIBCXX_USE_CONSTEXPR bool traps = true;
    40. };
    41. }
    42. int main()
    43. {
    44. std::cout << std::boolalpha;
    45. std::cout << "std::numeric_limits::traps: "
    46. << std::numeric_limits<bool>::traps << std::endl;
    47. std::cout << "std::numeric_limits::traps: "
    48. << std::numeric_limits<char>::traps << std::endl;
    49. std::cout << "std::numeric_limits::traps: "
    50. << std::numeric_limits<signed char>::traps << std::endl;
    51. std::cout << "std::numeric_limits::traps: "
    52. << std::numeric_limits<unsigned char>::traps << std::endl;
    53. std::cout << "std::numeric_limits::traps: "
    54. << std::numeric_limits<wchar_t>::traps << std::endl;
    55. std::cout << "std::numeric_limits::traps: "
    56. << std::numeric_limits<char16_t>::traps << std::endl;
    57. std::cout << "std::numeric_limits::traps: "
    58. << std::numeric_limits<char32_t>::traps << std::endl;
    59. std::cout << "std::numeric_limits::traps: "
    60. << std::numeric_limits<short>::traps << std::endl;
    61. std::cout << "std::numeric_limits::traps: "
    62. << std::numeric_limits<unsigned short>::traps << std::endl;
    63. std::cout << "std::numeric_limits::traps: "
    64. << std::numeric_limits<int>::traps << std::endl;
    65. std::cout << "std::numeric_limits::traps: "
    66. << std::numeric_limits<unsigned int>::traps << std::endl;
    67. std::cout << "std::numeric_limits::traps: "
    68. << std::numeric_limits<long>::traps << std::endl;
    69. std::cout << "std::numeric_limits::traps: "
    70. << std::numeric_limits<unsigned long>::traps << std::endl;
    71. std::cout << "std::numeric_limits::traps: "
    72. << std::numeric_limits<long long>::traps << std::endl;
    73. std::cout << "std::numeric_limits::traps: "
    74. << std::numeric_limits<unsigned long long>::traps << std::endl;
    75. std::cout << "std::numeric_limits::traps: "
    76. << std::numeric_limits<float>::traps << std::endl;
    77. std::cout << "std::numeric_limits::traps: "
    78. << std::numeric_limits<double>::traps << std::endl;
    79. std::cout << "std::numeric_limits::traps: "
    80. << std::numeric_limits<long double>::traps << std::endl;
    81. std::cout << "std::numeric_limits::traps: "
    82. << std::numeric_limits<std::string>::traps << std::endl;
    83. std::cout << "std::numeric_limits::traps: "
    84. << std::numeric_limits<SName>::traps << std::endl;
    85. std::cout << "std::numeric_limits::traps: "
    86. << std::numeric_limits<SPartSpec>::traps << std::endl;
    87. return 0;
    88. }

    输出

    鉴别检测舍入前是否非正规的浮点类型

    std::numeric_limits<T>::tinyness_before

    static const bool tinyness_before;

    (C++11 前)

    static constexpr bool tinyness_before;

    (C++11 起)

     std::numeric_limits::tinyness_before 的值对所有测试浮点表达式在舍入前下溢的浮点类型 T 为 true 。

    标准特化

    Tstd::numeric_limits::tinyness_before 的值
    /* non-specialized */false
    boolfalse
    charfalse
    signed charfalse
    unsigned charfalse
    wchar_tfalse
    char8_tfalse
    char16_tfalse
    char32_tfalse
    shortfalse
    unsigned shortfalse
    intfalse
    unsigned intfalse
    longfalse
    unsigned longfalse
    long longfalse
    unsigned long longfalse
    float实现定义
    double实现定义
    long double实现定义

    注意

    符合标准的 IEEE 754 浮点实现要求检测浮点下溢,并在执行处有二种可选的情形

    1) 若假如以指数范围和精度均为无界的计算,产生绝对值小于 std::numeric_limits::min() 的结果,则发生下溢(并且可能引发 FE_UNDERFLOW )。这种实现在舍入前检测是否较小(如 UltraSparc 、 POWER )。

    2) 若舍入到目标浮点类型(即舍入到 std::numeric_limits::digits 位)后,结果的绝对值小于 std::numeric_limits::min() ,则发生下溢(并且可能引发 FE_UNDERFLOW )。正式地说,假如以指数范围和精度均为无界的计算,非零结果的绝对值小于 std::numeric_limits::min() 。这种实现在舍入后检测是否较小(如 SuperSparc )

    调用示例

    1. #include <iostream>
    2. #include <string>
    3. #include <limits>
    4. #include <cstdint>
    5. #include <cfloat>
    6. struct SName
    7. {
    8. };
    9. //偏特化
    10. struct SPartSpec
    11. {
    12. };
    13. namespace std
    14. {
    15. template<>
    16. struct numeric_limits<SPartSpec>
    17. {
    18. static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
    19. static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
    20. static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
    21. static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
    22. static _GLIBCXX_USE_CONSTEXPR bool has_infinity = true;
    23. static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = true;
    24. static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = true;
    25. static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm = denorm_present;
    26. static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = true;
    27. static _GLIBCXX_USE_CONSTEXPR float_round_style round_style = round_toward_neg_infinity;
    28. static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = true;
    29. static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
    30. static _GLIBCXX_USE_CONSTEXPR bool is_modulo = true;
    31. static _GLIBCXX_USE_CONSTEXPR int digits = CHAR_BIT;
    32. static _GLIBCXX_USE_CONSTEXPR int digits10 = CHAR_BIT;
    33. static _GLIBCXX_USE_CONSTEXPR int max_digits10 = DECIMAL_DIG;
    34. static _GLIBCXX_USE_CONSTEXPR int radix = FLT_RADIX;
    35. static _GLIBCXX_USE_CONSTEXPR int min_exponent = FLT_MIN_EXP;
    36. static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = FLT_MIN_10_EXP;
    37. static _GLIBCXX_USE_CONSTEXPR int max_exponent = FLT_MAX_EXP;
    38. static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = FLT_MAX_EXP;
    39. static _GLIBCXX_USE_CONSTEXPR bool traps = true;
    40. static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = true;
    41. };
    42. }
    43. int main()
    44. {
    45. std::cout << std::boolalpha;
    46. std::cout << "std::numeric_limits::tinyness_before: "
    47. << std::numeric_limits<bool>::tinyness_before << std::endl;
    48. std::cout << "std::numeric_limits::tinyness_before: "
    49. << std::numeric_limits<char>::tinyness_before << std::endl;
    50. std::cout << "std::numeric_limits::tinyness_before: "
    51. << std::numeric_limits<signed char>::tinyness_before << std::endl;
    52. std::cout << "std::numeric_limits::tinyness_before: "
    53. << std::numeric_limits<unsigned char>::tinyness_before << std::endl;
    54. std::cout << "std::numeric_limits::tinyness_before: "
    55. << std::numeric_limits<wchar_t>::tinyness_before << std::endl;
    56. std::cout << "std::numeric_limits::tinyness_before: "
    57. << std::numeric_limits<char16_t>::tinyness_before << std::endl;
    58. std::cout << "std::numeric_limits::tinyness_before: "
    59. << std::numeric_limits<char32_t>::tinyness_before << std::endl;
    60. std::cout << "std::numeric_limits::tinyness_before: "
    61. << std::numeric_limits<short>::tinyness_before << std::endl;
    62. std::cout << "std::numeric_limits::tinyness_before: "
    63. << std::numeric_limits<unsigned short>::tinyness_before << std::endl;
    64. std::cout << "std::numeric_limits::tinyness_before: "
    65. << std::numeric_limits<int>::tinyness_before << std::endl;
    66. std::cout << "std::numeric_limits::tinyness_before: "
    67. << std::numeric_limits<unsigned int>::tinyness_before << std::endl;
    68. std::cout << "std::numeric_limits::tinyness_before: "
    69. << std::numeric_limits<long>::tinyness_before << std::endl;
    70. std::cout << "std::numeric_limits::tinyness_before: "
    71. << std::numeric_limits<unsigned long>::tinyness_before << std::endl;
    72. std::cout << "std::numeric_limits::tinyness_before: "
    73. << std::numeric_limits<long long>::tinyness_before << std::endl;
    74. std::cout << "std::numeric_limits::tinyness_before: "
    75. << std::numeric_limits<unsigned long long>::tinyness_before << std::endl;
    76. std::cout << "std::numeric_limits::tinyness_before: "
    77. << std::numeric_limits<float>::tinyness_before << std::endl;
    78. std::cout << "std::numeric_limits::tinyness_before: "
    79. << std::numeric_limits<double>::tinyness_before << std::endl;
    80. std::cout << "std::numeric_limits::tinyness_before: "
    81. << std::numeric_limits<long double>::tinyness_before << std::endl;
    82. std::cout << "std::numeric_limits::tinyness_before: "
    83. << std::numeric_limits<std::string>::tinyness_before << std::endl;
    84. std::cout << "std::numeric_limits::tinyness_before: "
    85. << std::numeric_limits<SName>::tinyness_before << std::endl;
    86. std::cout << "std::numeric_limits::tinyness_before: "
    87. << std::numeric_limits<SPartSpec>::tinyness_before << std::endl;
    88. return 0;
    89. }

    输出

  • 相关阅读:
    13.SpringBoot项目之Service层
    详细讲解什么是单例模式
    【Ansible自动化运维实战】使用Ansible部署WordPress应用
    分享8款人声分离的软件,总有一款你喜欢的
    git使用杂记
    vue基于web的化妆品美妆商城电子商务python flask django
    Windows又又又更新?Win 12开发将于下个月开始
    Spring整合Flyway使用笔记
    npm install 安装不成功,node-sass缺失,提示python环境缺失的解决办法
    图解LeetCode——面试题 17.19. 消失的两个数字(难度:困难)
  • 原文地址:https://blog.csdn.net/qq_40788199/article/details/133829768