优化器可以假设浮点不是NaN吗

Can an optimizer assume a floating point is not NaN?

本文关键字:NaN 假设 优化      更新时间:2023-10-16

编译器可以做出一些会导致未定义行为的假设(例如假设加法不会溢出)。他们是否可以就浮动点NaN作出这样的假设?

例如:

double a = some_calc();
double b = a;
if( a == b )
  do_something();

优化器是否可以删除条件语句并假设它始终为真?或者它是否绑定到平台浮点规则(IEEE),并在值为NaN的情况下强制进行检查?

也就是说,编译器是否可以基于双精度不包含NaN的假设进行优化?由于C++标准并没有说明浮点在平台上的实际工作方式,我不清楚这是否真的得到了充分的说明。

还是与平台浮点规则(IEEE)绑定

不一定,如果实现使用IEEE 754浮点数,则std::numeric_limits<double>::is_iec559设置为true。

并在值为NaN的情况下强制进行检查

如果实现确实使用IEEE 754,算术运算的结果必须与IEEE浮点规则相匹配,但就比较而言,它可以被优化。如果some_calc的主体可供编译器在同一翻译单元中进行分析(或在链接时代码生成期间),则可以得出结论,它从不返回NaN(即返回常量),因此可以对其进行优化,因为代码的语义不会改变。