2014-03-13 68 views
0

當使用REAL(KIND = 16)或REAL * 16時,我的程序有一些精度問題。有沒有辦法比精確度更高?如何創建REAL(KIND = 32)變量?

+1

所有當前的Fortran編譯器都支持32位和64位浮點數。有些還支持其他尺寸。請參閱http://stackoverflow.com/questions/22362211/confusing-double-precision-real-in-fortran的答案以獲取有關如何爲變量指定類型的指導。 –

+2

real(N)與real * N不同,不應使用。見http://stackoverflow.com/questions/3170239/fortran-integer4-vs-integer4-vs-integerkind-4和http://stackoverflow.com/questions/22362211/confusing-double-precision-real-in-fortran –

回答

1

REAL*32(種類值不是直接攜帶的)將是一個256位的real。沒有這種IEEE浮點類型。見http://en.wikipedia.org/wiki/IEEE_floating-point_standard

我不知道支持這種類型的任何處理器(編譯器)作爲擴展。另外,我沒有知道硬件是如何處理這個本地的。

在如此高的精度下,我會重新考慮算法及其穩定性。程序通常不需要四分之一(你的16字節)的精度。即使是雙倍通常也足夠了。我以單精度進行了很多計算。

最後,有一些庫支持更高的精度,但它們的使用比用不同類型參數重新編譯更復雜。見

http://crd-legacy.lbl.gov/~dhbailey/mpdist/

Is there an arbitrary precision floating point library for C/C++ which allows arbitrary precision exponents?


在一個特殊的要求:一種數字是依賴於實現的。種類16可能不存在或可能不表示IEEE 128位浮點數。在這裏看到很多問題 Fortran: integer*4 vs integer(4) vs integer(kind=4) Fortran 90 kind parameter What does `real*8` mean?等等。

+0

我從來沒有這樣做,但再次重複相同的單詞很累人。這個問題的意圖是完全清楚的。至少在存儲大小上,REAL * 16是唯一的,事實上在我知道的所有系統上都是IEEE 128位浮點型。它始終是16個字符的實際變量 - 16個字節,儘管非標準。 –