优化器可以假设浮点不是NaN吗
Can an optimizer assume a floating point is not NaN?
编译器可以做出一些会导致未定义行为的假设(例如假设加法不会溢出)。他们是否可以就浮动点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(即返回常量),因此可以对其进行优化,因为代码的语义不会改变。
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 输出是NaN,如何
- 为什么我在输出端得到 nan?
- 提升反序列化对象具有 nan 或 -nan 值
- Is !NaN not a NaN?
- NaN 上的宇宙飞船操作员
- C++ STL 排序会检查 NaN 吗?
- C++ 每次运行程序时我都会"nan"输出的问题
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 这个方程 x + y = x & y + x |y 成立(假设 x, y > 0)?
- 复制 -nan 表示浮点数,AVX __m256 复制后显示 0
- 如何使用 Node-addon-API 实现 node-nan 回调
- 为什么我的双变量通过添加 c++ 显示 nan?
- nan() 函数的参数
- 假设声明中某些上下文中需要的名称查找规则是什么
- 为什么 acos() 在使用点积的结果时会导致"nan(ind)"?
- 如何在 c++ 中处理 -nan 输出
- 为什么这段代码返回 -nan(ind)?C++
- 假设浮点数或双 NaN 将始终作为字符串"nan"是否安全?
- 优化器可以假设浮点不是NaN吗