讓我們分析一下這裏的代碼。這與已經給出的評論和答案一致,但我覺得仍然有一點可以解決的神祕感。
somevar = sqrt(3.0)
這裏,3.0
是將被存儲爲默認精度恆定(可能32位浮點值。即默認與gfortran反正)。因此sqrt
將計算出該精確度的平方根。
對於somevar2
,基數定義爲精度wp
,但指數不是。
somevar2 = (3.0_wp)**(1.0/2.0)
這與1.0/2.0
正好存儲在二進制表示沒有影響。您可以通過比較兩個精度來檢查:
program test
implicit none
integer, parameter :: wp = selected_real_kind(15, 307)
real :: default_prec_half
real(kind=wp) :: wp_prec_half
default_prec_half = 1.0/2.0
wp_prec_half = 1.0_wp/2.0_wp
write(*,*) default_prec_half, wp_prec_half, default_prec_half-wp_prec_half
end program test
差值的輸出恰好爲0。
爲了說明,我用與NumPy的輸入程序來檢查斷言:
import numpy as np
sqrt_3_32 = np.sqrt(3, dtype=np.float32)
sqrt_3_64 = np.sqrt(3, dtype=np.float64)
print(sqrt_3_32, sqrt_3_64)
使用這兩種結果,我檢查的somevar
和somevar2
精度:
In [67]: somevar = 1.7320507764816284
In [68]: somevar2 = 1.7320508075688772
In [69]: somevar-sqrt_3_64
Out[69]: -3.1087248775207854e-08
In [70]: somevar-sqrt_3_32
Out[70]: 0.0
In [72]: somevar2-sqrt_3_64
Out[72]: 0.0
In [73]: somevar2-sqrt_3_32
Out[73]: 3.1087248775207854e-08
什麼出來的這是:
somevar
是3的平方根達到默認精度,並具有與32位NumPy計算的3的平方根相同的值。
somevar2
是3的平方根,直到wp
的準確度與64位NumPy計算機的平方根相同。
注:我可以做比較,因爲我的平臺上的精度相匹配。雖然這是一般的情況下,我提供了比較的說明,你應該選擇適合你的問題的準確性,並在你的程序中一致地使用它。有關一般指南的浮點數,請參閱fortran90.org段落。
nitpicker還希望在分數'(1.0/2.0)'中看到'_wp'。 –