这里有一点测试代码:
float zeroF = 0.f;
float naNF = 0.f / zeroF;
float minimumF = std::min(1.0f, naNF);
std::cout << "MinimumF " << minimumF << std::endl;
double zeroD = 0.0;
double naND = 0.0 / zeroD;
double minimumD = std::min(1.0, naND);
std::cout << "MinimumD " << minimumD << std::endl;
我在VS2013上执行了代码。
在精确模型(/ fp:precise)上,输出始终为“1”;
在快速模型(/ fp:fast)上,如果启用优化(/ O2),输出将为“Nan”( - 。#IND),如果禁用优化(/ Od),则输出为“1”。
首先,根据IEEE754,正确的输出应该是什么? (我阅读了文档,并搜索了不同的文章,如:What is the rationale for all comparisons returning false for IEEE754 NaN values?,似乎正确的输出应该由Nan而不是1,但也许我错了。
其次,这里的快速模型优化如何大幅改变输出?