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


    数值极限

    定义于头文件

    定义于头文件

    template< class T > class numeric_limits;

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

    鉴别能表示特殊值“发信的非数”( NaN )的浮点类型

    std::numeric_limits<T>::has_signaling_NaN

    static const bool has_signaling_NaN;

    static constexpr bool has_signaling_NaN;

     std::numeric_limits::has_signaling_NaN 的值对所有能够表示特殊值“发信的非数”的类型 T 为 true 。此常量对所有浮点类型有意义,并保证若 std::numeric_limits::is_iec559 == true 则为 true 。

    标准特化

    Tstd::numeric_limits::has_signaling_NaN 的值
    /* 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 float_denorm_style has_denorm_loss = denorm_present;
    25. };
    26. }
    27. int main()
    28. {
    29. std::cout << std::boolalpha;
    30. std::cout << "std::numeric_limits::has_signaling_NaN: "
    31. << std::numeric_limits<bool>::has_signaling_NaN << std::endl;
    32. std::cout << "std::numeric_limits::has_signaling_NaN: "
    33. << std::numeric_limits<char>::has_signaling_NaN << std::endl;
    34. std::cout << "std::numeric_limits::has_signaling_NaN: "
    35. << std::numeric_limits<signed char>::has_signaling_NaN << std::endl;
    36. std::cout << "std::numeric_limits::has_signaling_NaN: "
    37. << std::numeric_limits<unsigned char>::has_signaling_NaN << std::endl;
    38. std::cout << "std::numeric_limits::has_signaling_NaN: "
    39. << std::numeric_limits<wchar_t>::has_signaling_NaN << std::endl;
    40. std::cout << "std::numeric_limits::has_signaling_NaN: "
    41. << std::numeric_limits<char16_t>::has_signaling_NaN << std::endl;
    42. std::cout << "std::numeric_limits::has_signaling_NaN: "
    43. << std::numeric_limits<char32_t>::has_signaling_NaN << std::endl;
    44. std::cout << "std::numeric_limits::has_signaling_NaN: "
    45. << std::numeric_limits<short>::has_signaling_NaN << std::endl;
    46. std::cout << "std::numeric_limits::has_signaling_NaN: "
    47. << std::numeric_limits<unsigned short>::has_signaling_NaN << std::endl;
    48. std::cout << "std::numeric_limits::has_signaling_NaN: "
    49. << std::numeric_limits<int>::has_signaling_NaN << std::endl;
    50. std::cout << "std::numeric_limits::has_signaling_NaN: "
    51. << std::numeric_limits<unsigned int>::has_signaling_NaN << std::endl;
    52. std::cout << "std::numeric_limits::has_signaling_NaN: "
    53. << std::numeric_limits<long>::has_signaling_NaN << std::endl;
    54. std::cout << "std::numeric_limits::has_signaling_NaN: "
    55. << std::numeric_limits<unsigned long>::has_signaling_NaN << std::endl;
    56. std::cout << "std::numeric_limits::has_signaling_NaN: "
    57. << std::numeric_limits<long long>::has_signaling_NaN << std::endl;
    58. std::cout << "std::numeric_limits::has_signaling_NaN: "
    59. << std::numeric_limits<unsigned long long>::has_signaling_NaN << std::endl;
    60. std::cout << "std::numeric_limits::has_signaling_NaN: "
    61. << std::numeric_limits<float>::has_signaling_NaN << std::endl;
    62. std::cout << "std::numeric_limits::has_signaling_NaN: "
    63. << std::numeric_limits<double>::has_signaling_NaN << std::endl;
    64. std::cout << "std::numeric_limits::has_signaling_NaN: "
    65. << std::numeric_limits<long double>::has_signaling_NaN << std::endl;
    66. std::cout << "std::numeric_limits::has_signaling_NaN: "
    67. << std::numeric_limits<std::string>::has_signaling_NaN << std::endl;
    68. std::cout << "std::numeric_limits::has_signaling_NaN: "
    69. << std::numeric_limits<SName>::has_signaling_NaN << std::endl;
    70. std::cout << "std::numeric_limits::has_signaling_NaN: "
    71. << std::numeric_limits<SPartSpec>::has_signaling_NaN << std::endl;
    72. return 0;
    73. }

    输出

    鉴别浮点类型所用的非正规风格

    std::numeric_limits<T>::has_denorm

     std::numeric_limits::has_denorm 的值鉴别浮点类型如何支持非正规值

    标准特化

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

    调用示例 

    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 float_denorm_style has_denorm_loss = denorm_present;
    25. };
    26. }
    27. int main()
    28. {
    29. std::cout << std::boolalpha;
    30. std::cout << "std::numeric_limits::has_denorm: "
    31. << std::numeric_limits<bool>::has_denorm << std::endl;
    32. std::cout << "std::numeric_limits::has_denorm: "
    33. << std::numeric_limits<char>::has_denorm << std::endl;
    34. std::cout << "std::numeric_limits::has_denorm: "
    35. << std::numeric_limits<signed char>::has_denorm << std::endl;
    36. std::cout << "std::numeric_limits::has_denorm: "
    37. << std::numeric_limits<unsigned char>::has_denorm << std::endl;
    38. std::cout << "std::numeric_limits::has_denorm: "
    39. << std::numeric_limits<wchar_t>::has_denorm << std::endl;
    40. std::cout << "std::numeric_limits::has_denorm: "
    41. << std::numeric_limits<char16_t>::has_denorm << std::endl;
    42. std::cout << "std::numeric_limits::has_denorm: "
    43. << std::numeric_limits<char32_t>::has_denorm << std::endl;
    44. std::cout << "std::numeric_limits::has_denorm: "
    45. << std::numeric_limits<short>::has_denorm << std::endl;
    46. std::cout << "std::numeric_limits::has_denorm: "
    47. << std::numeric_limits<unsigned short>::has_denorm << std::endl;
    48. std::cout << "std::numeric_limits::has_denorm: "
    49. << std::numeric_limits<int>::has_denorm << std::endl;
    50. std::cout << "std::numeric_limits::has_denorm: "
    51. << std::numeric_limits<unsigned int>::has_denorm << std::endl;
    52. std::cout << "std::numeric_limits::has_denorm: "
    53. << std::numeric_limits<long>::has_denorm << std::endl;
    54. std::cout << "std::numeric_limits::has_denorm: "
    55. << std::numeric_limits<unsigned long>::has_denorm << std::endl;
    56. std::cout << "std::numeric_limits::has_denorm: "
    57. << std::numeric_limits<long long>::has_denorm << std::endl;
    58. std::cout << "std::numeric_limits::has_denorm: "
    59. << std::numeric_limits<unsigned long long>::has_denorm << std::endl;
    60. std::cout << "std::numeric_limits::has_denorm: "
    61. << std::numeric_limits<float>::has_denorm << std::endl;
    62. std::cout << "std::numeric_limits::has_denorm: "
    63. << std::numeric_limits<double>::has_denorm << std::endl;
    64. std::cout << "std::numeric_limits::has_denorm: "
    65. << std::numeric_limits<long double>::has_denorm << std::endl;
    66. std::cout << "std::numeric_limits::has_denorm: "
    67. << std::numeric_limits<std::string>::has_denorm << std::endl;
    68. std::cout << "std::numeric_limits::has_denorm: "
    69. << std::numeric_limits<SName>::has_denorm << std::endl;
    70. std::cout << "std::numeric_limits::has_denorm: "
    71. << std::numeric_limits<SPartSpec>::has_denorm << std::endl;
    72. return 0;
    73. }

    输出

    鉴别浮点类型是否检测精度损失为非正规损失,而非不准确结果

    std::numeric_limits<T>::has_denorm_loss

    static const bool has_denorm_loss;

    (C++11 前)

    static constexpr bool has_denorm_loss;

    (C++11 起)

    标准特化

    Tstd::numeric_limits::has_denorm_loss 的值
    /* 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) 非正规化损失:产生的结果异于假如指数范围无界的情况下计算出的结果。

    2) 不准确结果:产生的结果异于假如指数范围和精度均无界的情况下计算出的结果。

    不存在非正规化损失机制的实现(精度损失在舍入后检测为不准确结果),而此选项在 IEEE 标准 754 的 2008 修订版被移除。

    libstdc++ 、 libc++ 、 libCstd 及 stlport4 为所有浮点类型定义此常量为 false 。 Microsoft Visual Studio 为所有浮点类型定义它为 true 。

    同任何浮点计算,精度损失可能引发 FE_INEXACT

    调用示例

    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. };
    26. }
    27. int main()
    28. {
    29. std::cout << std::boolalpha;
    30. std::cout << "std::numeric_limits::has_denorm_loss: "
    31. << std::numeric_limits<bool>::has_denorm_loss << std::endl;
    32. std::cout << "std::numeric_limits::has_denorm_loss: "
    33. << std::numeric_limits<char>::has_denorm_loss << std::endl;
    34. std::cout << "std::numeric_limits::has_denorm_loss: "
    35. << std::numeric_limits<signed char>::has_denorm_loss << std::endl;
    36. std::cout << "std::numeric_limits::has_denorm_loss: "
    37. << std::numeric_limits<unsigned char>::has_denorm_loss << std::endl;
    38. std::cout << "std::numeric_limits::has_denorm_loss: "
    39. << std::numeric_limits<wchar_t>::has_denorm_loss << std::endl;
    40. std::cout << "std::numeric_limits::has_denorm_loss: "
    41. << std::numeric_limits<char16_t>::has_denorm_loss << std::endl;
    42. std::cout << "std::numeric_limits::has_denorm_loss: "
    43. << std::numeric_limits<char32_t>::has_denorm_loss << std::endl;
    44. std::cout << "std::numeric_limits::has_denorm_loss: "
    45. << std::numeric_limits<short>::has_denorm_loss << std::endl;
    46. std::cout << "std::numeric_limits::has_denorm_loss: "
    47. << std::numeric_limits<unsigned short>::has_denorm_loss << std::endl;
    48. std::cout << "std::numeric_limits::has_denorm_loss: "
    49. << std::numeric_limits<int>::has_denorm_loss << std::endl;
    50. std::cout << "std::numeric_limits::has_denorm_loss: "
    51. << std::numeric_limits<unsigned int>::has_denorm_loss << std::endl;
    52. std::cout << "std::numeric_limits::has_denorm_loss: "
    53. << std::numeric_limits<long>::has_denorm_loss << std::endl;
    54. std::cout << "std::numeric_limits::has_denorm_loss: "
    55. << std::numeric_limits<unsigned long>::has_denorm_loss << std::endl;
    56. std::cout << "std::numeric_limits::has_denorm_loss: "
    57. << std::numeric_limits<long long>::has_denorm_loss << std::endl;
    58. std::cout << "std::numeric_limits::has_denorm_loss: "
    59. << std::numeric_limits<unsigned long long>::has_denorm_loss << std::endl;
    60. std::cout << "std::numeric_limits::has_denorm_loss: "
    61. << std::numeric_limits<float>::has_denorm_loss << std::endl;
    62. std::cout << "std::numeric_limits::has_denorm_loss: "
    63. << std::numeric_limits<double>::has_denorm_loss << std::endl;
    64. std::cout << "std::numeric_limits::has_denorm_loss: "
    65. << std::numeric_limits<long double>::has_denorm_loss << std::endl;
    66. std::cout << "std::numeric_limits::has_denorm_loss: "
    67. << std::numeric_limits<std::string>::has_denorm_loss << std::endl;
    68. std::cout << "std::numeric_limits::has_denorm_loss: "
    69. << std::numeric_limits<SName>::has_denorm_loss << std::endl;
    70. std::cout << "std::numeric_limits::has_denorm_loss: "
    71. << std::numeric_limits<SPartSpec>::has_denorm_loss << std::endl;
    72. return 0;
    73. }

    输出

  • 相关阅读:
    C++多态【下】
    未来的嵌入式行业岗位发展怎么样?会不会越来越少?
    springboot+基于vue的响应式代购商城APP的设计与实现 毕业设计-附源码191654
    Rockchip平台rk3588源码下载编译(基于Android13)
    ADDS:卸载/降级域控制器
    ELK+kafka+filebeat企业内部日志分析系统
    初识React.js
    【C++】继承
    第10章 增长和扩展你的 Micro SaaS 应用程序
    5个前端练手项目(html css js canvas)
  • 原文地址:https://blog.csdn.net/qq_40788199/article/details/133577917