讨论开始于我对另一个问题的回答。以下代码确定机器 epsilon:
float compute_eps() {
float eps = 1.0f;
while (1.0f + eps != 1.0f)
eps /= 2.0f;
return eps;
}
Run Code Online (Sandbox Code Playgroud)
在评论中建议1.0f + eps != 1.0f测试可能会失败,因为 C++ 标准允许使用额外的精度。虽然我知道浮点运算实际上以更高的精度执行(比实际使用的类型指定的精度更高),但我碰巧不同意这个提议。
我怀疑在比较操作(例如==or )期间!=,操作数不会被截断为其类型的精度。换句话说,1.0f + eps当然可以以高于float(例如,long double)的精度进行评估,并将结果存储在可以容纳 的寄存器中long double。但是,我认为在执行!=操作之前,左操作数将从long doubleto截断float,因此代码永远不会无法eps精确确定(即它永远不会进行比预期更多的迭代)。
我在 C++ 标准中没有找到关于这个特殊情况的任何线索。此外,代码运行良好,我确信在执行过程中使用了额外精度技术,因为我毫不怀疑任何现代桌面实现实际上在计算过程中都使用了额外精度。
你怎么看待这件事?