是否可以在Fortran中实现非常小的数字,如1E-1200
?我知道如何在python中做到这一点,但我的硕士论文代码运行得太慢了。我的主管建议我使用Fortran,但我不确定这是否是一个问题。
答案 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
REAL32
,REAL64
和REAL128
类型通常称为单精度,双精度和四精度。较长的类型具有更大范围的可表示数字和更高的精度。
在我的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快得多。