Fortran和MATLAB之间的数值精度问题

时间:2014-07-18 14:05:59

标签: matlab fortran precision gfortran

注意: 任何解决方案或解决此问题的方法都需要在MATLAB中进行,它是出现问题的代码。使fortran与MATLAB匹配是适得其反的,因为这两段代码都不会起作用......我理解差异是因为fortran编译器的方式和MATLAB所做的不同代替编译单个与双精度的解释漂浮,但我希望有人可以帮我提出一个解决方案来解决这个问题。

我正在调试一些我从Fortran转换成MATLAB的代码,并且遇到了令我难过的东西。在fortran和MATLAB中,我有以下行

pcnt = 0.9999*(-0.5+z2)

其中z2 = 0.51482129528868548。我遇到的问题是在MATLAB中计算的pcnt和在fortran中计算的pcnt之间存在2.4594e-10的差异。我已经确认z2完全相同(即z2_matlab-z2_fortran=0),所以我很难过。在Fortran和MATLAB中,z2和pcnt都是双精度(Fortran的real*8),因此我担心它们应该具有完全相同的精度(因为这是在同一台机器上运行)。

通常我不会关心这个小的差异,但是z2最终会乘以一个大数字,然后用它来计算一个指数,而小的差异最终会产生大约2的差异。稍后的数组索引会导致算法中的大错误(对于最多只有1e7的数字,大小为1e6)。

有没有人知道为什么会出现这个问题并找到解决方法?我正在MATLAB R2011a上执行这项工作,并使用gfortran编译器在64位MacBook pro上使用I5(我认为的第三代)处理器编译fortran。

如果有人有任何建议请告诉我,因为如果我找不到解决方案,过去两周我执行的大约5000行代码的所有翻译都会毫无价值。 / p>

此外,任何解决方案都必须是MATLAB代码,因为Fortran代码是当前正在运行的代码。

提前致谢,

安德鲁

1 个答案:

答案 0 :(得分:5)

除非使用d修饰符,否则Fortran数字文字是单精度,而MATLAB使用double作为默认数字文字类型。所以也许你应该重写你的pcnt表达式,如:

pcnt = 0.9999d+0 * (-0.5d+0 + z2)

相反,您应该转换为单个MATLAB的数字文字,以模拟Fortran行为:

pcnt = single(0.9999) * (single(-0.5) + z2);

稍后修改

在极端情况下,不应该依赖于不同的编译器解释数字文字的算法;而是使用所述文字的原生(二进制)表示:

  • 在Fortran中写入未格式化的所有数字文字,导致你悲伤(在这个公式中,0.9999是最可能的嫌疑人,因为0.5可以在两个FP精度中完全表示),在文件中(参见WRITE) 。
  • 在MATLAB中加载存储在文件中的这些值(参见fread())。
  • 使用加载的值而不是数字文字(应该有一个暗示名称,作为一种良好的编程习惯)。
相关问题