2013-11-04 50 views
0

我有一個場景,我試圖在AIX和Linux上執行一個複雜的應用程序。fortran內在函數sqrt()行爲

在執行期間,代碼使用內部函數sqrt()進行計算,但獲得的結果在兩臺機器上都不相同。

有誰知道這種行爲的原因?無論如何要克服這一點?

P.S

有些值是在兩臺機器上相等,但其中大部分是不同的。

+0

你的意思是「複雜」還是「複雜」? –

+0

@HighPerformanceMark我的意思是複雜的 – arunr

回答

4

符合IEEE 754規範的處理器必須返回平方根的精確結果(或者在無法表示精確值時正確舍入)。對於相同的輸入值,浮點格式和舍入模式,不同的符合IEEE 754的處理器必須返回相同的結果。不允許有任何變化。看到不同結果的可能原因:

  1. 其中一個處理器不符合IEEE 754浮點規範。
  2. 這些值實際上是相同的,但與打印相關的錯誤或差異會使它們看起來不同。
  3. 舍入模式或精度控制在兩個系統上都沒有設置相同。
  4. 一個系統試圖遵循IEEE 754規範,但其平方根函數存在缺陷。

您是否比較二進制輸出以消除打印格式錯誤或差異的可能性?

今天大多數處理器都支持IEEE 754浮點。 OpenCL native_sqrt函數的一個例子是IEEE 754的精度不能得到保證。 OpenCL定義了native_sqrt(除了符合IEEE 754標準的sqrt),以便可以根據需要交易速度的準確性。

IEEE 754 sqrt實現中的錯誤現在不太常見。對於IEEE 754 sqrt函數來說,困難的情況是舍入模式設置爲最接近的,實際結果非常接近兩個浮點表示之間的中間點。在William Kahan的論文How to Test Whether SQRT is Rounded Correctly中可以找到產生這些困難的平方根參數的方法。

1

檢查每個cpu可用的浮點格式。你在使用單精度還是雙精度浮點?如果你想要可比的/相似的答案,你需要在兩臺機器上使用類似精度的浮點格式。

浮點是一個近似值。單精度浮點僅使用24位(包括符號位)作爲尾數,其他8位用於指數。這允許大約8位數的精度。雙精度浮點使用53位,允許更高的精度。

由於缺少關於兩個systesm上不同浮點數的二進制值以及這些值的打印表示的詳細信息,因此您有四捨五入或表示方式的差異。

+0

我已經在兩臺機器上指定了格式。格式相同,但結果不同。差異的範圍在e-09附近 – arunr

+3

1e-9的差異?請閱讀[每個計算機科學家需要了解的浮點運算知識](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。 –

2

兩臺計算機上的硬件或用於兩個編譯器的sqrt函數的算法的數字表示可能略有差異。有限精度算術與實數的算術不同,計算中的細微差別應該是預期的。爲了判斷差異是否不同尋常,你應該說明你正在使用的數字類型(如ChuckCottrill所要求的)並舉例說明。什麼是相對差異。對於order order的值,1E-9是單精度浮點的預期差異。