Fortran中的数字很小

时间:2017-01-21 21:47:04

标签: fortran

是否可以在Fortran中实现非常小的数字,如1E-1200?我知道如何在python中做到这一点,但我的硕士论文代码运行得太慢了。我的主管建议我使用Fortran,但我不确定这是否是一个问题。

3 个答案:

答案 0 :(得分: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 =值,以指示您需要的最小精度(以十进制数字表示)。

答案 1 :(得分: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的数字。

答案 2 :(得分:0)

大多数Fortran编译器都支持与IEEE binary128匹配的REAL128数据格式。有些支持REAL80具有相似的范围,匹配C long double。这些没有REAL64的性能,但应该比python快得多。