[英]Issues with numerical precision between Fortran and MATLAB
注意: 此问题的任何解决方案或解决方案都需要在MATLAB中进行,这是出现问题的代码。 使fortran与MATLAB匹配会适得其反,因为那段代码都将无法工作...我理解,差异是由于fortran编译器的方式不同以及MATLAB在代替编译解释单精度与双精度方面所做的一切浮动,但我希望有人可以帮助我提出解决方案。
我正在调试一些从Fortran转换为MATLAB的代码,并且遇到了让我感到困惑的事情。 在fortran和MATLAB中,我都有以下内容
pcnt = 0.9999*(-0.5+z2)
其中z2 = 0.51482129528868548
。 我遇到的问题是,在MATLAB中计算出的pcnt与在fortran中计算出的2.4594e-10
存在2.4594e-10
的差异。 我已经确认z2完全相同(即z2_matlab-z2_fortran=0
),所以我很z2_matlab-z2_fortran=0
。 在Fortran和MATLAB中,z2和pcnt都具有双精度(对于Fortran,为real*8
),因此就我而言,它们应该具有完全相同的精度(因为这是在同一台计算机上运行的)。
通常情况下,我不会关心这么小的差异,但是z2最终会乘以一个大数,然后再用于计算索引,而该小差异最终会导致数组索引的差异约为2,导致算法稍后出现巨大错误(数量最多为1e7的数量大约为1e6)。
有谁知道为什么会发生此问题,并有某种解决方法? 我正在MATLAB R2011a上执行此工作,并使用gfortran编译器在具有I5(我认为是第三代)处理器的64位MacBook Pro上编译了所有fortran。
如果有人有任何建议,请告诉我,因为如果找不到解决方案,那么我在过去两周中执行的大约5000行代码的全部翻译将毫无价值。
同样,任何解决方案都必须针对MATLAB代码,因为Fortran代码是当前可用的代码。
提前致谢,
安德鲁
除非使用d
修饰符,否则Fortran数字文字是单精度的,而MATLAB使用double
作为默认数字文字类型。 因此,也许您应该像这样重写pcnt
表达式:
pcnt = 0.9999d+0 * (-0.5d+0 + z2)
相反,为了模拟Fortran行为,应将MATLAB的数字文字转换为单个数字文字:
pcnt = single(0.9999) * (single(-0.5) + z2);
以后编辑
在极端情况下,不应依赖于不同编译器解释数字文字的算法。 而是使用上述文字的本机(二进制)表示形式:
WRITE
)。 fread()
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.