1

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

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

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

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

4

1 回答 1

4

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

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

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

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

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

于 2013-06-10T19:46:56.313 回答