Floating point IEE754舍入模式:如何计算误差?

Floating point IEE754舍入模式:如何计算误差?,floating-point,precision,Floating Point,Precision,作为一个例子,这里是我编写的一个Java文件的输出。它具有每个数字的二进制表示形式,与我手动计算的尾数一致(截断/向下舍入) 看看67108868,很明显Java使用的是向零方向的半圆形,或者向偶数方向的半圆形。但是如何计算舍入误差呢?如果一个数字太大,无法正确地放入尾数,那么似乎不可能找到准确的错误。也许它使用右边的额外比特,但是对于许多分数,难道没有无限数量的比特需要考虑吗? 我想知道如何在硬件或代码中实现舍入的具体细节。要知道舍入结果是什么,不必知道精确结果的所有位(其中可能有无限多个位)

作为一个例子,这里是我编写的一个Java文件的输出。它具有每个数字的二进制表示形式,与我手动计算的尾数一致(截断/向下舍入)

看看67108868,很明显Java使用的是向零方向的半圆形,或者向偶数方向的半圆形。但是如何计算舍入误差呢?如果一个数字太大,无法正确地放入尾数,那么似乎不可能找到准确的错误。也许它使用右边的额外比特,但是对于许多分数,难道没有无限数量的比特需要考虑吗?
我想知道如何在硬件或代码中实现舍入的具体细节。

要知道舍入结果是什么,不必知道精确结果的所有位(其中可能有无限多个位)。我们只需要知道有效位中的位、下一位以及剩余位是否都为零。这将产生四种情况(从圆形到最近的连接到偶数):

  • 拟合后的下一位为零,所有剩余位均为零:答案准确;没有错误
  • 下一位为零,但并非所有剩余位都为零:向下舍入
  • 下一位为1,所有剩余位均为零:误差正好为½ULP,因此四舍五入为偶数
  • 下一位是1,但并非所有剩余位都是零:向上取整
对于简单的算术运算,如加法、减法、乘法和除法,通过计算固定数量的附加位或检查运算过程中产生的其他数据(例如执行长除法时计算的余数),可以轻松获得此信息


对于像三角函数这样的复杂函数,我们没有完整的证明来描述产生必要信息所需的工作。大多数数学库实现的这些函数的版本不能保证正确舍入。如果需要正确的四舍五入,实现可以使用任意精度算法继续细化答案,直到确定结果是高于还是低于四舍五入点(½ULP)。

。那么对于trig的东西来说,仅仅计算这些额外的比特是不够的,还是我们根本不知道如何证明有多少比特是足够的?@warmCabin:一些额外的比特通常是足够的,但并不总是足够的,我们通常不知道需要多少比特。通常,越来越精确地计算函数的算法不会返回逐位结果。它给出了一些数字y,也许还有某种错误界限或指示。假设你知道答案是(y-e,y+e)。如果(y-e,y+e)中的每个数字舍入到相同的z,则返回z。否则,将结果细化为新的y1和更严格的错误e1,因此答案为(y1-e1,y1+e1)。但舍入变化的边界可能仍在该区间内……通常,我们不能提前说,在区间小到不跨越舍入边界之前,需要多少次算法迭代。CRlibm是一个涉及解决某些函数和某些浮点格式的问题的项目,它取得了有益的进展,但尚未完成。对于性能良好的函数,我们总是可以将估计细化到我们知道正确舍入结果的程度,但我们并不总是知道细化需要多长时间。
    67108867: 67108864.000000
      100000000000000000000000011
       00000000000000000000000
    67108868: 67108864.000000
      100000000000000000000000100
       00000000000000000000000
    67108869: 67108872.000000
      100000000000000000000000101
       00000000000000000000000