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


    数值极限


    定义于头文件

    定义于头文件

    template< class T > class numeric_limits;

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

    鉴别类型所用的舍入模式

    std::numeric_limits<T>::round_style

    static const std::float_round_style round_style;

    (C++11 前)

    static constexpr std::float_round_style round_style;

    (C++11 起)

    标准特化

    Tstd::numeric_limits::round_style 的值
    /* non-specialized */std::round_toward_zero
    boolstd::round_toward_zero
    charstd::round_toward_zero
    signed charstd::round_toward_zero
    unsigned charstd::round_toward_zero
    wchar_tstd::round_toward_zero
    char8_tstd::round_toward_zero
    char16_tstd::round_toward_zero
    char32_tstd::round_toward_zero
    shortstd::round_toward_zero
    unsigned shortstd::round_toward_zero
    intstd::round_toward_zero
    unsigned intstd::round_toward_zero
    longstd::round_toward_zero
    unsigned longstd::round_toward_zero
    long longstd::round_toward_zero
    unsigned long longstd::round_toward_zero
    float通常为 std::round_to_nearest
    double通常为 std::round_to_nearest
    long double通常为 std::round_to_nearest

    注意

    这些值是常量,且不反映 std::fesetround 所做的舍入模式更改。被更改的值可从 FLT_ROUNDS 或 std::fegetround 获得。

    示例

    十进制值 0.1 不能表示成二进制浮点类型。在存储于 IEEE-745 double 时,它落入 0x1.9999999999999*2-4与 0x1.999999999999a*2-4之间。舍入到最近可表示结果导致 0x1.999999999999a*2-4。同样地,十进制值 0.3 在 0x1.3333333333333*2-2与 0x1.3333333333334*2-2
    之间,舍入到最近值后存储为 0x1.3333333333333*2-2。

     调用示例

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

    输出

    鉴别 IEC 559/IEEE 754 浮点类型

    std::numeric_limits<T>::is_iec559

    static const bool is_iec559;

    (C++11 前)

    static constexpr bool is_iec559;

    (C++11 起)

     std::numeric_limits::is_iec559 的值对于所有符合 IEC 559 ( IEEE 754 )标准要求的浮点类型 T 为 true 。若 std::numeric_limits::is_iec559 为 true ,则 std::numeric_limits::has_infinity 、 std::numeric_limits::has_quiet_NaN 与 std::numeric_limits::has_signaling_NaN 亦为 true 。

    标准特化

    Tstd::numeric_limits::is_iec559 的值
    /* 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通常为 true
    double通常为 true
    long double通常为 true

    调用示例

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

     输出

    鉴别表示有限值集合的类型

    std::numeric_limits<T>::is_bounded

    static const bool is_bounded;

    (C++11 前)

    static constexpr bool is_bounded;

    (C++11 起)

     std::numeric_limits::is_bounded 对所有表示有限的值集合的算术类型 T 为 true 。所有基础类型均有界,不过此常量会在 std::numeric_limits 对库提供的任意精度算术类型的特化中为 false 。

    标准特化

    Tstd::numeric_limits::is_bounded 的值
    /* non-specialized */false
    booltrue
    chartrue
    signed chartrue
    unsigned chartrue
    wchar_ttrue
    char8_ttrue
    char16_ttrue
    char32_ttrue
    shorttrue
    unsigned shorttrue
    inttrue
    unsigned inttrue
    longtrue
    unsigned longtrue
    long longtrue
    unsigned long longtrue
    floattrue
    doubletrue
    long doubletrue

    调用示例

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

     输出

  • 相关阅读:
    Lepton 无损压缩原理及性能分析
    Simulink代码生成: 查表模块及其代码
    面试算法55:二叉搜索树迭代器
    跟着GPT学设计模式之桥接模式
    Monaco Editor教程(十一):monaco中的位置信息Position类型详解
    矩阵求导详解
    Mybatis-Plus 之 @TableId(value=“xxx”,type = IdType.xxx)注解
    Python编程相关的书籍
    ThreeJs的场景实现鼠标拖动旋转控制
    零基础学Java(13)方法参数
  • 原文地址:https://blog.csdn.net/qq_40788199/article/details/133616144