使用 C++,有没有办法检测浮点/双精度非正态化是否被编译器/系统"规范化"?
Using C++, is there a way to detect whether floats/doubles denormals are being "normalized" by the compiler/system?
直接说,我的问题正如标题中所述:在使用C++编写的应用程序中,有没有办法检测浮点数/双精度异常值是否被编译器/系统"规范化"(例如,通过DAZ,FTZ等(?
如果需要上下文,我试图完成的是以编程方式检测最小浮点/双精度值。然而,这些结果取决于非正态化是否被"归一化":如果是,最小值由 std 的数字限制 min(( 给出,否则由 denorm_min(( 给出。
您应该简单地信任实现来返回std::numeric_limits
的正确值。如果std::numeric_limits<float>::has_denorm
std::denorm_present
,则应假定常规C++运算符不会隐式规范化浮点值。
请注意,这是一个独立于 std::numeric_limits<float>::has_iec559
的查询,用于测试 IEC-559/IEEE-754 浮点数的使用情况。因此,系统可以使用 IEEE-754 浮点数,但不支持非规范化浮点数。因此,始终将非规范化浮点数刷新为零的实现应该返回std::denorm_absent
has_denorm
。
相关文章:
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- __CHAR_BIT__宏是否为 MSVC 编译器预定义?
- 如何检测VS C++编译器是否支持C++11?
- 编译器是否必须始终删除 try-catch 块(如果它被证明是非抛出的)
- 是否允许编译器省略对指针的 &* 运算符的组合调用?
- 编译器是否强制根据模板参数计算表达式?
- Visual Studio 中是否有来自代码块的编译器标志的类似物?
- C++编译器是否优化了顺序静态变量读取?
- c++ 编译器是否保护常量内存地址免受任何更改?
- 不同版本的编译器(例如GCC)是否会产生不同的性能?
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- 编译器是否对 std::frexp 进行了内联调用?
- 是否可以将不同的编译器嵌入到我的应用程序中?
- GCC 编译器是否应该对涉及 [[fallthrough]] 属性的格式错误的C++代码进行诊断?
- 当作为参数传入时,是否可以由编译器指定模板类参数?
- 是否有任何 2 补充平台/编译器,其中有符号移位不做通常的事情?
- 编译器是否会创建vtable,而不考虑在c++中创建对象
- 是否允许编译器优化掉局部易失性变量