是否存在不使用roundTiesToEven对浮点字面量进行舍入的编译器或编译目标?
是否存在不使用roundTiesToEven对浮点字面量进行舍入的编译器或编译目标?
我先分享下自己做的测试:我写了几个关于浮点字面量舍入的静态断言,在x86_64平台下的GCC、Clang和MSVC上都能顺利通过,代码如下:
// round to nearest static_assert(0.1f == 0.100000001490116119385f); // ties to even static_assert(1.000000059604644775390625f == 1.f); // flush tiny values to zero static_assert(1e-1000f == 0);
从结果来看,主流编译器似乎都在遵循ISO/IEC 60559(也就是IEEE-754)标准里的roundTiesToEven舍入模式。不过有意思的是,C++标准其实并没有强制要求必须用这种舍入方式:标准里明确提到,浮点字面量的取值是“最接近缩放值的可表示值,具体选择更大还是更小的那个值由实现定义”,所以上面的这些断言并不是编译器必须满足的。
这就让我产生了一个疑问:有没有哪款编译器或者某个特定的编译目标,对浮点字面量的舍入并不采用roundTiesToEven模式?我个人感觉这种舍入模式现在已经被普遍使用了,哪怕标准没做强制要求。
作为参考,ISO/IEC 60559标准里对roundTiesToEven的定义是这样的:
应返回最接近无限精确结果的浮点数;如果无法表示的无限精确结果恰好被两个最接近的浮点数同等接近,则返回最低有效位为偶数的那个;如果这也做不到,则返回绝对值更大的那个。
备注:内容来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

