指定浮点类型是否足以保证相同的结果?

时间:2013-06-10 18:14:24

标签: floating-point precision

我正在编写一个描述一些将由软件执行的算法的规范。目的是我可以将此规范交给两个不同的程序员(使用可能不同的语言和/或体系结构),当我将一些输入提供给他们的程序时,他们将总是吐出相同的结果

例如,如果规范说“将0.5加到结果中”,这可能是个问题。根据浮点存储方法,0.5可以表示为0.4999999135,或0.500000138等。

在这里指定规则的最佳方法是什么,以便事情全面一致?我可以说“所有数字必须以IEEE 754 64位格式表示”吗?或者更好地说“所有数字必须首先按1000缩放并使用定点算术计算”?

这与我遇到的大多数浮点问题略有不同,因为问题是跨平台的可重复性,而不是整体精度。

1 个答案:

答案 0 :(得分:4)

IEEE 754-2008第11节描述了可重现浮点结果的必要条件。这主要是:

  • 从编程语言到IEEE 754操作的绑定(例如,a*b执行IEEE 754指定的浮点乘法。)
  • 指定需要可重复结果的方法。例如,禁用默认语言权限以使用比标称类型的对象更宽的精度。
  • 与外部十进制字符序列的准确转换。
  • 避免使用IEEE 754的一些更高级的功能。

今天的编译器很难支持这些要求。

添加.5不会有问题。所有正常的浮点实现都精确地表示.5并正确添加它。问题是语言实现可能会添加.5并精确保持结果(比通常的double更精确),而另一个实现将结果舍入到double。如果使用数学库例程(例如coslog),这是另一个问题,因为它们难以很好地计算,并且不同的实现提供了不同的近似值。

IEEE 754是一个很好的规范。理想情况下,您应指定规范的实现符合IEEE 754。