浮点错误是否确定?

时间:2015-10-04 13:31:30

标签: c++ floating-point

浮点数的一大特征是其中一些不能用二进制来精确表示。这可能使他们难以使用。然而,我很好奇的是浮点中的微妙或不那么微妙的错误是否是确定性的。有人可以预测它们吗?以下是可以利用浮点错误的随机数生成器的一个示例:

#include <cmath>

float constant = M_PI;
float generate()
{
    static float state = 1;
    state = state * constant;
    return state;
}

必须知道实现,硬件,编译器设置等,这使得很难预测结果是什么。或者我的想法有缺陷?

2 个答案:

答案 0 :(得分:3)

浮点“错误”是确定性的。给定操作的输入和输出值之间存在1:1映射。您的示例每次都会生成相同的输出序列。

也就是说,可能会有一个浮点实现或者那里会生成不同的序列,但这不是你可以认为是“随机”的(即熵源)。

答案 1 :(得分:1)

每个浮点表示定义浮点变量的组成(哪个部分是尾数,哪个部分是指数,哪个部分是符号等)以及每个操作的行为。

在您可能选择的任何实现中,如果您知道其操作数(或操作数),则可以预测每个浮点运算的结果。该特性是确定性的定义。

所以,是的,浮点运算是确定性的。

不同的实现(编译器,主机系统等)确实支持不同的浮点表示。因此,实现之间存在一些结果差异。但是,如果您知道如何表示浮点变量以及操作如何工作,仍然可以预测任何浮点运算的结果。

事实并非所有人都对浮点类型及其操作有足够的了解并不能使它们成为非确定性的。并非所有人都能描述复杂算法中的完整操作集。这些知识随时可用,并且只要付出足够的努力,就可以理解得足够好,以便在进行操作之前可以可靠地预测所有操作对所有操作数的影响。

有浮动点的错误实现,不符合他们自己的文档。例如,查找奔腾FDIV错误 - 其中一些早期的奔腾CPU错误地实现了浮点除法。一旦了解了操作实际上做了什么,即使那些结果也是确定性的。