【问题标题】:fortran intrinsic function sqrt() behaviourfortran 内在函数 sqrt() 行为
【发布时间】:2013-11-14 16:55:50
【问题描述】:

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

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

有人知道这种行为的原因吗?有没有办法克服这个问题?

附言

有些值在两台机器上是相等的,但大部分是不同的。

【问题讨论】:

  • 你的意思是complex还是complicated
  • @HighPerformanceMark 我的意思是复杂

标签: linux fortran aix intrinsics


【解决方案1】:

遵循 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 的一篇论文中找到,How to Test Whether SQRT is Rounded Correctly

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 2013-06-22
      相关资源
      最近更新 更多