我正在编写一个描述一些将由软件执行的算法的规范。目的是我可以将此规范交给两个不同的程序员(使用可能不同的语言和/或体系结构),当我将一些输入提供给他们的程序时,他们将总是吐出相同的结果
例如,如果规范说“将0.5加到结果中”,这可能是个问题。根据浮点存储方法,0.5可以表示为0.4999999135,或0.500000138等。
在这里指定规则的最佳方法是什么,以便事情全面一致?我可以说“所有数字必须以IEEE 754 64位格式表示”吗?或者更好地说“所有数字必须首先按1000缩放并使用定点算术计算”?
这与我遇到的大多数浮点问题略有不同,因为问题是跨平台的可重复性,而不是整体精度。
答案 0 :(得分:4)
IEEE 754-2008第11节描述了可重现浮点结果的必要条件。这主要是:
a*b
执行IEEE 754指定的浮点乘法。)今天的编译器很难支持这些要求。
添加.5不会有问题。所有正常的浮点实现都精确地表示.5并正确添加它。问题是语言实现可能会添加.5并精确保持结果(比通常的double
更精确),而另一个实现将结果舍入到double
。如果使用数学库例程(例如cos
和log
),这是另一个问题,因为它们难以很好地计算,并且不同的实现提供了不同的近似值。
IEEE 754是一个很好的规范。理想情况下,您应指定规范的实现符合IEEE 754。