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

And*_*rew 0 precision matlab fortran gfortran

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

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

pcnt = 0.9999*(-0.5+z2)
Run Code Online (Sandbox Code Playgroud)

哪里z2 = 0.51482129528868548.我遇到的问题是2.4594e-10在MATLAB中计算的pcnt和在fortran中计算的pcnt 有所不同.我已经确认z2完全相同(即z2_matlab-z2_fortran=0),所以我很难过.real*8在Fortran和MATLAB中,z2和pcnt都是双精度(对于fortran),所以就我而言,它们应该具有完全相同的精度(因为它在同一台机器上运行).

通常情况下我不会关心这个小的差异,但是z2最终会得到一个大数字,然后用于计算一个索引,稍后差异最后是数组索引后差为2,在算法的后期导致巨大的错误(对于最多只有1e7的数字,大约为1e6).

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

如果有人有任何建议请告诉我,因为如果我找不到解决方案,那么过去两周我执行的大约5000行代码的翻译将毫无价值.

此外,任何解决方案都必须是MATLAB代码,因为Fortran代码是当前可用的代码.

提前致谢,

安德鲁

小智 5

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

pcnt = 0.9999d+0 * (-0.5d+0 + z2)
Run Code Online (Sandbox Code Playgroud)

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

pcnt = single(0.9999) * (single(-0.5) + z2);
Run Code Online (Sandbox Code Playgroud)

稍后编辑

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

  • 从Fortran写出所有导致你悲伤的数字文字(在这个公式中,0.9999是最可能的嫌疑人,因为0.5可以精确地在两个FP精度中表示),在文件中(请参阅参考资料WRITE).
  • 在MATLAB中加载存储在文件中的这些值(参见参考资料fread()).
  • 使用加载的值而不是数字文字(应该有一个暗示名称,作为一个很好的编程实践).