2017-01-21 51 views
0
非常小的數字

是否有可能實現的Fortran非常小的數字像1E-1200?我知道如何在python中完成它,但是我的碩士論文代碼運行速度太慢。我的主管建議我使用Fortran,但我不確定這是否是一個問題。用Fortran

+0

我是一個fortranner,但不過,我會檢查算法是否足夠快。改變語言並不會創造奇蹟,儘管一些循環在Python中很慢。 –

+3

Hi @wafelos,通常情況下,當使用適當的單位系統(即原子單位https://en.wikipedia.org/wiki/Atomic_units)時,浮點數的範圍變得更窄。知道使用128個精度類型可能會減慢計算速度,因爲它們不受硬件支持,這一點很重要。 –

回答

0

大多數Fortran編譯器支持它匹配IEEE binary128 REAL128數據格式。一些支持也與REAL80具有相似的範圍,匹配C long double。這些沒有REAL64的性能,但應該比python快得多。

+0

C沒有指定'long double'是哪種格式,其他類型也是如此。在MSVC中,long double和double是完全一樣的。在沒有80位擴展精度的平臺中,它可能是IEEE-754雙精度或四倍精度 –

1

簡短的回答是肯定的。

現代編譯器通常支持所謂的四精度,一個128位的真實。訪問這種類型的便攜方式是使用ISO_FORTRAN_ENV。下面是一個示例程序,說明如何大大小小這些數字得到:

program main 
    use ISO_FORTRAN_ENV, only : REAL32, REAL64, REAL128 

    ! -- tiny and huge grab the smallest and largest 
    ! -- representable number of each type 
    write(*,*) 'Range for REAL32: ', tiny(1._REAL32), huge(1._REAL32) 
    write(*,*) 'Range for REAL62: ', tiny(1._REAL64), huge(1._REAL64) 
    write(*,*) 'Range for REAL128: ', tiny(1._REAL128), huge(1._REAL128) 
end program main 

類型REAL32REAL64REAL128通常被稱爲單,雙精度和四精度。更長的類型具有更大範圍的可表示數字更高的精度。

在我的機器與gfortran 4.8,我得到:

mach5% gfortran types.f90 && ./a.out 
Range for REAL32:  1.17549435E-38 3.40282347E+38 
Range for REAL62:  2.2250738585072014E-308 1.7976931348623157E+308 
Range for REAL128: 3.36210314311209350626E-4932 1.18973149535723176502E+4932 

正如你可以看到,四精度可以表示數字小3.4E-4932

4

先前答案提示從ISO_FORTRAN_ENV使用REAL128的描述的非便攜式解決方案。你在這裏得到的是一個真實類型,其表示形式是128位,但沒有提到類型的範圍或精度。例如,一些IBM系統有128位實際類型,實際上是兩個帶偏移量指數的雙精度型。這讓你更精確,但範圍並不大。

正確的方式做,這是使用SELECTED_REAL_KIND內部函數來確定實施的一種支持所需的範圍。例如:

integer, parameter :: bigreal = SELECTED_REAL_KIND(R=1200) 
real(KIND=bigreal) :: x 

如果實現沒有一種真正能夠代表有正負1200的十進制指數的值,你會得到一個錯誤,否則你會得到相應的最小類。

你也可以指定在調用P =值,以表明你所需要的最小精度(十進制位數)。