注意: 任何解决方案或解决此问题的方法都需要在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代码是当前正在运行的代码。
提前致谢,
安德鲁
答案 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);
稍后修改
在极端情况下,不应该依赖于不同的编译器解释数字文字的算法;而是使用所述文字的原生(二进制)表示:
WRITE
) 。 fread()
)。