使用 C++,有没有办法检测浮点/双精度非正态化是否被编译器/系统"规范化"?

Using C++, is there a way to detect whether floats/doubles denormals are being "normalized" by the compiler/system?

本文关键字:是否 编译器 规范化 系统 双精度 有没有 C++ 检测 使用      更新时间:2023-10-16

直接说,我的问题正如标题中所述:在使用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