0

我有一个场景,我试图在 AIX 和 Linux 上执行一个复杂的应用程序。

在执行过程中,代码使用内部函数 sqrt() 进行计算,但在两台机器上获得的结果不同。

有谁知道这种行为的原因?有没有办法克服这个?

附言

两台机器上的某些值相同,但大多数值不同。

4

3 回答 3

4

遵循 IEEE 754 规范的处理器必须返回平方根的精确结果(或在无法表示精确时正确舍入)。对于相同的输入值、浮点格式和舍入模式,不同的 IEEE 754 兼容处理器必须返回相同的结果。不允许有任何变化。看到不同结果的可能原因:

  1. 其中一个处理器不遵循 IEEE 754 浮点规范。
  2. 这些值实际上是相同的,但是与打印相关的错误或差异使它们看起来不同。
  3. 两个系统上的舍入模式或精度控制设置不同。
  4. 一种系统试图遵循 IEEE 754 规范,但其平方根函数存在缺陷。

您是否比较了二进制输出以消除打印格式错误或差异的可能性?

目前大多数处理器都支持 IEEE 754 浮点。一个不能保证 IEEE 754 精度的例子是 OpenCL native_sqrt 函数。OpenCL 定义了 native_sqrt(除了符合 IEEE 754 的 sqrt),因此如果需要,可以用速度换取准确性。

IEEE 754 sqrt 实现中的错误在今天并不常见。IEEE 754 sqrt 函数的一个困难情况是当舍入模式设置为最近且实际结果非常接近两个浮点表示之间的中间点时。可以在 William Kahan 的论文《如何测试 SQRT 是否正确舍入》中找到生成这些难以计算的平方根参数的方法。

于 2013-11-05T02:04:42.937 回答
2

两台计算机上硬件的数字表示或用于两个编译器的 sqrt 函数的算法可能略有不同。有限精度算术与实数算术不同,计算上的细微差别是可以预料的。要判断差异是否异常,您应该说明您正在使用的数字类型(根据 ChuckCottrill 的要求)并举例说明。相对差异是什么。对于单位值,1E-9 是单精度浮点的预期差异。

于 2013-11-04T08:36:17.240 回答
1

检查每个 cpu 可用的浮点格式。您使用的是单精度还是双精度浮点?如果您想要可比较/相似的答案,您需要在两台机器上使用具有相似精度的浮点格式。

浮点数是近似值。单精度浮点只使用 24 位(包括符号位)作为尾数,其他 8 位作为指数。这允许大约 8 位精度。双精度浮点使用 53 位,允许更高的精度。

缺乏关于两个系统上不同浮点数的二进制值的详细信息,以及这些值的打印表示,您有舍入或表示差异。

于 2013-11-04T05:33:22.137 回答