【问题标题】:Mixed precision assignment混合精度赋值
【发布时间】:2015-08-14 15:16:23
【问题描述】:

我正在处理一个大型 Fortran 代码,该代码使用 Power7 的 XLF 编译器 它使用这些标志将精度设置为 64 位:-qrealsize=8 -qintsize=8

但是最近导入的一段代码有类似这样的行:

real :: var1d(nvol)
real :: var3d(ni,nj,nk)

var1d = var3d*1.0e6

我想知道 XLF 如何处理文字 1e6? 主要关注的是;这是参考版本和修改版本 偏离。 var1d 的第 9 位和第 10 位有效数字不同。

令人讨厌的是,这会随着迭代而增长。

【问题讨论】:

  • 所有实变量和常量都应该由标志提升。我没有时间研究 XLF 手册,(你应该这样做!),但普通的相同编译器会这样做。
  • 如果我担心这个问题,我可能会将文字重写为1.0d6(或1.0_real64 或类似的),看看它有什么影响。当然,您可能会告诉我,这些偏差仅在 100,000 cpu-hours 计算后才开始......
  • 要添加到其他 cmets,1e6 是默认类型的字面实常数。
  • 对于这个特定的例子,1.0E6 被精确地表示,无论其精度如何。当然,您说“与此类似”,所以我想您还有其他一些不同的情况。
  • 大家好,感谢弗拉基米尔提醒我 RTM。

标签: fortran double-precision


【解决方案1】:
数据对象 REALSIZE(4) 在效果中 REALSIZE(8) 在效果中
-------------------------------------------------- -----------------
1.2 实数(4) 实数(8)
1.2e0 实数(4) 实数(8)
1.2d0 实数(8) 实数(16)
1.2q0 实数(16) 实数(16)

真实真实(4) 真实(8)
双精度 实数(8) 实数(16)
复杂 复杂(4) 复杂(8)
双复合复合体(8) 复合体(16)

如在线 XLF 手册中所述。感谢所有有用的建议。所以我必须确认这不是差异的来源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2019-01-08
    • 2021-07-13
    • 2018-08-27
    • 1970-01-01
    相关资源
    最近更新 更多