2012-07-09 21 views
9

我正嘗試在gfortran中使用四倍精度,但它好像real*16不起作用。經過一番捕魚後,我發現它可能被實施爲real*10。是real*10其實四精度?如何在gfortran中使用和驗證四精度?

如何測試我的代碼的精度?是否有一個標準的簡單算法來測試精度?例如,當我想知道計算機零點是什麼時,我會繼續除以2.0,直到達到0.0。跟蹤這些值可以讓我知道計算機何時「認爲」我的非零數字爲零 - 給我電腦零。

有沒有一種很好的方法來確定像我描述的算法類型的精度?

+0

不幸的是,我們真的錯過了信息這是什麼意思*「不起作用」*。這樣的表述不應該用在很好的問題上,因爲它沒有說明任何有用的東西。 – 2017-07-25 09:07:51

回答

11

添加到現有的答案...真實* N是語言的擴展,最好不要使用。真實* 10不是四倍精度。被稱爲「擴展」 - 它是由英特爾處理器提供的10字節類型。 real * 16可能或不可用於gfortran,具體取決於編譯器版本,硬件和libquadmath的可用性。如果用軟件提供,速度會很慢。

Fortran詢問所需精度的方法是使用selected_real_kind函數爲所需的精度定義一種類型值。

integer, parameter :: QR_K = selected_real_kind (32) 
real (kind=QR_K) :: MyReal 

如果可用,將獲得四個實數。或者,使用Fortran 2008或更高版本,您可以「使用ISO_FORTRAN_ENV」,然後訪問REAL128。如果精度不可用,種類值將爲-1。

一個相關的問題:What does `real*8` mean?

+0

*「real * 10不是四倍精度,被稱爲」擴展「 - 它是由英特爾處理器提供的10字節類型。」*也可在Motorola 68k芯片上使用。 – dmckee 2013-03-02 18:56:31

+0

是的: 閱讀(kind = QR_K):: MyReal real(kind = QR_K):: MyReal? – user1271772 2013-08-08 18:56:44

+0

是的,一個錯字。它應該是「真實的」,而不是「讀」。答案已更正。 – 2013-08-08 19:35:33

2

kind type parameters解答這個問題,尤其是最後一句,它讀取gfortran文檔:

可用一種參數可在恆陣列 CHARACTER_KINDS,INTEGER_KINDS,LOGICAL_KINDS和REAL_KINDS被發現在 ISO_FORTRAN_ENV模塊(參見ISO_FORTRAN_ENV)。

您可能已經發現的是,real*16未在您的平臺上實現。

6

使用各種現代Fortran代碼,即

real(some_kind_value) :: variable 

然後可以使用selected_real_kind()iso_fortran_env模塊或c_long_double樣的價值從iso_c_binding模塊來獲取類型的變量。所有這些都有稍微不同的含義。

您可以使用epsilon(),,huge()nearest() intrinsics來評估代碼的實際精度。

gfortran中的四通道精度通常需要libquadmath庫應該可用於大多數平臺,但可能不是默認情況下。

1

真實(種類= 10)是所謂的擴展的80位精度Wikipedia 80-bit

real(kind = 16)是適當的四位128位清除Wikipedia 128-bit。如前所述,您可以使用selected_real_kind(),epsilon(),tiny(),huge()來選擇並檢查要使用的精度。

+3

謹慎:在編譯器中使用特定的數值作爲種類參數是不可移植的。 – 2012-07-09 17:54:10

0

嘗試gfortran命令

gfortran -fdefault實時的8 test.f -o test.exe的

在測試文件

 implicit double precision(a-h,o-z) 
1 continue 
     print * , ' i:' 
     read(5,*) i 
     if(i.le.0) stop 
     a=i 
     b=sqrt(a) 
     print * , b 
     c=b*b 
     print * , c 
     goto 1 
     end 

在我的平臺( FEDORA 20)它的工作原理。

+4

這真的很糟糕。將所有雙精度變量作爲四精度的副作用可能非常煩人。我也打賭,如果'真實* 16'不起作用,這實際上不會促進四倍的雙打,因此不會解決原來的問題。 – 2014-12-11 15:07:35

相關問題