【问题标题】:Are floating point errors deterministic?浮点错误是确定性的吗?
【发布时间】:2015-10-04 13:31:29
【问题描述】:

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

#include <cmath>

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

人们必须知道实现、硬件、编译器设置等等,这使得很难预测结果会是什么。还是我的想法有问题?

【问题讨论】:

    标签: c++ floating-point


    【解决方案1】:

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

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

    【讨论】:

    • 我同意。除了谈论量子物理学之外,还有什么不是确定性的吗?
    • 理论上是的,但是就像未定义的行为是不可预测的一样,浮点错误不也是吗?
    • 好的,确定性在计算机程序中还有其他含义。但是,整个系统是确定性的,以哲学或科学的方式。我不断听到非确定性被描述为无法预测结果,或者运行相同的程序产生不同的结果,但这不是确定性的含义。编辑:我只是想补充一下,我总是听说,因为某些东西是不可预测的,它是不确定的,比如混沌理论,混沌理论是完全确定的,或者蝴蝶效应。我认为我们在这里考虑了决定论的不同含义。
    • @Ritesh 定义我发现:“非确定性算法是一种可以在不同运行中表现出不同行为的算法,而不是确定性算法。”所以你告诉我程序 srand(time(NULL); cout rand(); 是一个非确定性程序?如果是这样,计算机科学家什么时候劫持了确定性这个词?
    • @Titone srand(time(NULL)) 是确定性的。你对浮点数的答案也是如此。我被量子物理学词误导了:)。
    【解决方案2】:

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

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

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

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

    并不是每个人都对浮点类型和对它们的操作有足够的了解这一事实并没有使它们具有不确定性。并非每个人都可以用复杂的算法描述完整的操作集,这一事实也不是。这些知识很容易获得,并且只要付出足够的努力,就可以很好地理解所有操作对所有可能的操作数的影响,因此可以在执行操作之前可靠地预测。

    那里有错误的浮点实现,不符合他们自己的文档。例如,查找 pentium FDIV 错误——一些早期的 pentium CPU 错误地实现了浮点除法。一旦了解了操作的实际作用,即使是那些也被证明是确定性的。

    【讨论】:

      猜你喜欢
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 2010-09-24
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多