我正嘗試在gfortran中使用四倍精度,但它好像real*16
不起作用。經過一番捕魚後,我發現它可能被實施爲real*10
。是real*10
其實四精度?如何在gfortran中使用和驗證四精度?
如何測試我的代碼的精度?是否有一個標準的簡單算法來測試精度?例如,當我想知道計算機零點是什麼時,我會繼續除以2.0,直到達到0.0。跟蹤這些值可以讓我知道計算機何時「認爲」我的非零數字爲零 - 給我電腦零。
有沒有一種很好的方法來確定像我描述的算法類型的精度?
我正嘗試在gfortran中使用四倍精度,但它好像real*16
不起作用。經過一番捕魚後,我發現它可能被實施爲real*10
。是real*10
其實四精度?如何在gfortran中使用和驗證四精度?
如何測試我的代碼的精度?是否有一個標準的簡單算法來測試精度?例如,當我想知道計算機零點是什麼時,我會繼續除以2.0,直到達到0.0。跟蹤這些值可以讓我知道計算機何時「認爲」我的非零數字爲零 - 給我電腦零。
有沒有一種很好的方法來確定像我描述的算法類型的精度?
添加到現有的答案...真實* 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?
*「real * 10不是四倍精度,被稱爲」擴展「 - 它是由英特爾處理器提供的10字節類型。」*也可在Motorola 68k芯片上使用。 – dmckee 2013-03-02 18:56:31
是的: 閱讀(kind = QR_K):: MyReal
是的,一個錯字。它應該是「真實的」,而不是「讀」。答案已更正。 – 2013-08-08 19:35:33
爲kind type parameters解答這個問題,尤其是最後一句,它讀取gfortran文檔:
可用一種參數可在恆陣列 CHARACTER_KINDS,INTEGER_KINDS,LOGICAL_KINDS和REAL_KINDS被發現在 ISO_FORTRAN_ENV模塊(參見ISO_FORTRAN_ENV)。
您可能已經發現的是,real*16
未在您的平臺上實現。
使用各種現代Fortran代碼,即
real(some_kind_value) :: variable
然後可以使用selected_real_kind()
或iso_fortran_env
模塊或c_long_double
樣的價值從iso_c_binding
模塊來獲取類型的變量。所有這些都有稍微不同的含義。
您可以使用epsilon()
,,huge()
或nearest()
intrinsics來評估代碼的實際精度。
gfortran中的四通道精度通常需要libquadmath
庫應該可用於大多數平臺,但可能不是默認情況下。
真實(種類= 10)是所謂的擴展的80位精度Wikipedia 80-bit。
real(kind = 16)是適當的四位128位清除Wikipedia 128-bit。如前所述,您可以使用selected_real_kind(),epsilon(),tiny(),huge()來選擇並檢查要使用的精度。
謹慎:在編譯器中使用特定的數值作爲種類參數是不可移植的。 – 2012-07-09 17:54:10
嘗試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)它的工作原理。
這真的很糟糕。將所有雙精度變量作爲四精度的副作用可能非常煩人。我也打賭,如果'真實* 16'不起作用,這實際上不會促進四倍的雙打,因此不會解決原來的問題。 – 2014-12-11 15:07:35
不幸的是,我們真的錯過了信息這是什麼意思*「不起作用」*。這樣的表述不應該用在很好的問題上,因爲它沒有說明任何有用的東西。 – 2017-07-25 09:07:51