[英]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.