在某些情况下,使用 GCC + 编译时,将正常的浮点数与std::numeric_limits<float>::quiet_NaN()总是产生比较(在 Linux 和 MinGW 上测试)。在其他情况下,它总是会产生(这将是符合 IEEE 的行为)。"true""-ffast-math""false"
如果quiet_NaN在编译时已知其中一个值是 a ,则该行为符合 IEEE 标准,并且分支会被优化掉。
我知道这"-ffast-math"允许违反 IEEE 规则,并且它意味着"-ffinite-math-only"假设没有 NaN。但即使"-ffast-math"结果quiet_NaN()具有特定的位模式(例如 7FF80000),那么与普通浮点数的比较如何0.5f可能产生真值?
这是显示不同情况的代码示例。请用"g++ -O3 -ffast-math".
#include <iostream>
#include <limits>
int main() {
#if 1
// make sure that the value of 'x' is not known at compile time
bool isnan;
std::cout << "use nan (0|1): ";
std::cin >> isnan;
#else
// otherwise GCC …Run Code Online (Sandbox Code Playgroud)