【问题标题】:Is specifying floating-point type sufficient to guarantee same results?指定浮点类型是否足以保证相同的结果?
【发布时间】:2013-06-06 11:36:21
【问题描述】:

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

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

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

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

【问题讨论】:

标签: floating-point precision


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 有趣的是,大多数 CPU 和编程语言都声称符合 IEEE 754。然而,它们都可以使用不同的规则进行中间计算和舍入。那些依赖浮点确定性的人必须跳过各种各样的圈子才能使这些规则保持一致。听起来很痛苦。
  • @Tim 最后一个没有提供“符合 IEEE 754 标准”所需的一切的通用桌面处理器肯定是在 2003-2004 年左右制造的 (en.wikipedia.org/wiki/SSE2)。错误完全在于编译链。这些作者自己可能将责任归咎于用户相对缺乏对结果再现性的兴趣,而不是性能、与旧 ABI 的兼容性、生成的代码与 2003 年前处理器的兼容性……
猜你喜欢
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2022-10-27
  • 2011-04-13
相关资源
最近更新 更多