簡體   English   中英

Fortran和MATLAB之間的數值精度問題

[英]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);

以后編輯

在極端情況下,不應依賴於不同編譯器解釋數字文字的算法。 而是使用上述文字的本機(二進制)表示形式:

  • 在文件中用Fortran格式格式化所有引起麻煩的數字文字(在此公式中,最有可能是0.9999,因為在FP精度中都可以精確表示0.5)(請參閱WRITE )。
  • 將存儲在文件中的這些值加載到MATLAB中(請參閱fread() )。
  • 使用加載的值而不是數字文字(作為良好的編程習慣,應使用提示性名稱)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM