Fortran语言中的非常小的数字

Fortran语言中的非常小的数字,fortran,Fortran,是否可以用Fortran语言实现非常小的数字,如1E-1200?我知道如何用python来做,但我的硕士论文代码运行得太慢了。我的主管建议我使用Fortran,但我不确定这是否有问题。大多数Fortran编译器支持与IEEE binary128匹配的REAL128数据格式。有些支持REAL80,范围类似,匹配C长双精度。它们没有REAL64的性能,但应该比python快得多。大多数Fortran编译器支持与IEEE binary128匹配的REAL128数据格式。有些支持REAL80,范围类似,

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

大多数Fortran编译器支持与IEEE binary128匹配的REAL128数据格式。有些支持REAL80,范围类似,匹配C长双精度。它们没有REAL64的性能,但应该比python快得多。

大多数Fortran编译器支持与IEEE binary128匹配的REAL128数据格式。有些支持REAL80,范围类似,匹配C长双精度。它们没有REAL64的性能,但应该比python快得多。

简单的回答是肯定的

现代编译器通常支持所谓的四精度,即128位实数。访问此类型的便携式方法是使用
ISO\u FORTRAN\u 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

的数字。简短的回答是肯定的

现代编译器通常支持所谓的四精度,即128位实数。访问此类型的便携式方法是使用
ISO\u FORTRAN\u 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

的数字。前面的答案建议使用ISO_FORTRAN_ENV中的REAL128,这说明了一种不可移植的解决方案。这里得到的是一个表示为128位的实类型,但这并没有说明类型的范围或精度!例如,一些IBM系统有一个128位实数类型,实际上是两个双精度的偏移指数。这会使您获得更高的精度,但不会显著增加范围

正确的方法是使用所选的实数类内在函数来确定支持所需范围的实现类型。例如:

integer, parameter :: bigreal = SELECTED_REAL_KIND(R=1200)
real(KIND=bigreal) :: x
如果实现没有一个可以表示小数指数为正负1200的值的实数类型,您将得到一个错误,否则您将得到最小的合适类型


您还可以在调用中指定p=值,以指示所需的最小精度(十进制数字)。

前面的答案建议使用ISO_FORTRAN_ENV中的REAL128,说明了一种不可移植的解决方案。这里得到的是一个表示为128位的实类型,但这并没有说明类型的范围或精度!例如,一些IBM系统有一个128位实数类型,实际上是两个双精度的偏移指数。这会使您获得更高的精度,但不会显著增加范围

正确的方法是使用所选的实数类内在函数来确定支持所需范围的实现类型。例如:

integer, parameter :: bigreal = SELECTED_REAL_KIND(R=1200)
real(KIND=bigreal) :: x
如果实现没有一个可以表示小数指数为正负1200的值的实数类型,您将得到一个错误,否则您将得到最小的合适类型


您还可以在调用中指定一个p=值,以指示所需的最小精度(十进制数字)。

我是fortranner,但无论如何,我会检查算法是否足够快。改变语言并不能创造奇迹,尽管Python.Hi@wavelos中的一些循环速度很慢,但通常情况下,当使用适当的单位系统(即原子单位)时,浮点数的范围会变得更窄。知道这一点很重要,因为使用128精度类型可能会降低计算速度,因为硬件不支持这些类型。我是fortranner,但无论如何,我会检查算法是否足够快。改变语言并不能创造奇迹,尽管Python.Hi@wavelos中的一些循环速度很慢,但通常情况下,当使用适当的单位系统(即原子单位)时,浮点数的范围会变得更窄。重要的是要知道,使用128精度类型可能会降低计算速度,因为硬件不支持这些类型。C不指定
long double
应为哪种格式,其他类型也是如此。在MSVC中,长双精度与双精度完全相同。在没有80位扩展精度的平台中,它可能是IEEE-754双精度或四倍精度。C没有指定
long double
应该是哪种格式,其他类型也是如此。在MSVC中,长双精度与双精度完全相同。在没有80位扩展精度的平台中,它可能是IEEE-754双精度或四精度