信任浮点运算

时间:2011-10-05 22:29:37

标签: floating-point

我知道0.3这样的数字存在问题,无法使用浮点数表示,因此会产生浮点错误 可以代表的数字怎么样?像0.5,0.75等......如果我处理的是2的负幂和由它们组成的数字的数字,我可以相信浮点运算没有错误吗?

6 个答案:

答案 0 :(得分:1)

假设你有一个IEEE754架构,如果你只是执行加法,减法和乘法,并且如果结果合适,那么它应该是正确的。只有在得到的分母是2的幂时才能使用除法。任何其他内置的数学函数如exp和log都不可能是正确的(由于Lindemann-Weierstrass);同样适用于非自然力量(尽管大多数CPU中都没有内置的电源功能)。

答案 1 :(得分:1)

还有另一个明显的限制:正常的浮点数将具有(例如)53位有效数字,因此(在缩放之后)所涉及的每个数字的二进制表示必须适合53个二进制数字以避免精度损失。

答案 2 :(得分:0)

一些加法和减法在浮点运算中可能是精确的,但通常乘法不能在浮点运算中没有舍入,因为你需要加倍的位数代表产品。

答案 3 :(得分:0)

当您具有符合IEEE-754标准的浮点实现时,您可以保证尽可能精确地计算基本运算(加法,减法,乘法,除法,余数,平方根)。因此,您可以安全地执行以下所有操作:

  • 1.0 + 1.0
  • 1.0 - 0.5
  • 0.0 - -0.0
  • 0.16845703125 * 0.16845703125
  • SQRT(4.0)
  • SQRT(20.25)
  • 15.5 / 0.5

与其他基本操作相比,余数操作对于任何两个操作数都是精确的。

您必须确保永远不需要比浮点类型提供的精度更高的精度。

答案 4 :(得分:0)

您需要获取IEEE浮点规范的副本并进行研究。几乎所有的编译器和CPU都遵循这些日期的字母,所以如果你遵循规范,就可以获得“精确”的结果。

你并不总是(取决于语言)控制的一件事是计算结果是保留在寄存器中还是存储回“home”。这会影响结转到下一次计算的精度。

但几乎所有常见的计算语言都实现(或作为附加组件提供)某种“长十进制”或“长整数”支持,可用于生成任意长度/精度的精确结果,因此只要你坚持这些形式中可表示的价值观。

答案 5 :(得分:0)

首先在x86架构上实现IEEE规范,尝试处理所有异常情况。除以零,下溢和溢出是明显的例外。另一个不那么明显的是“不精确”,因为操作的结果无法准确表示。无论如何 - 正如我所理解的那样 - 许多开发环境只是掩盖了导致这种情况被忽视的异常。即使在没有训练轮的环境中,不精确的异常也会被掩盖,但当然可以启用。

关于两个消极权力的问题,答案是你应该确保不安全的价值观不会在他们没有任何生意的地方结束。 0表示除数,负值表示为sqrt或log / ln等。这意味着实现对输入的控制,使得算法在使用时不会发生异常。由于您的异常可能会被掩盖,因此在您遇到结果之前,您的算法可能会使用错误的值完成相当多的工作:+ NAN,-NAN或者来自printf的“删除删除” - 格式化。

浮点运算会带来一些问题,这些问题可能会导致(通常会)导致一堆蠕虫。因此,我的建议是,您可以窥探更多内容并尝试使用插入不同fp操作的值。

现在,成为浮点大师并不需要太多。