浮点数#
浮点数的默认表示使用单精度(通常为 32 位/4 字节)。对于大多数应用程序,需要更高的精度。为此,可以定义自定义种类参数。定义种类参数的推荐方法是使用
integer, parameter :: dp = selected_real_kind(15)
对于许多目的,也足以直接从文字中推断种类参数,例如这里
integer, parameter :: dp = kind(0.0d0)
或重命名从 iso_fortran_env
模块导入的种类参数
use, intrinsic :: iso_fortran_env, only : dp => real64
有关种类参数的一些有见地的想法,请参见 Fortran 博士在它需要所有种类中。
建议有一个中央模块来定义种类参数,并根据需要使用 use 包含它们。此类模块的一个示例如下所示:
!> Numerical storage size parameters for real and integer values
module kind_parameter
implicit none
public
!> Single precision real numbers, 6 digits, range 10⁻³⁷ to 10³⁷-1; 32 bits
integer, parameter :: sp = selected_real_kind(6, 37)
!> Double precision real numbers, 15 digits, range 10⁻³⁰⁷ to 10³⁰⁷-1; 64 bits
integer, parameter :: dp = selected_real_kind(15, 307)
!> Quadruple precision real numbers, 33 digits, range 10⁻⁴⁹³¹ to 10⁴⁹³¹-1; 128 bits
integer, parameter :: qp = selected_real_kind(33, 4931)
!> Char length for integers, range -2⁷ to 2⁷-1; 8 bits
integer, parameter :: i1 = selected_int_kind(2)
!> Short length for integers, range -2¹⁵ to 2¹⁵-1; 16 bits
integer, parameter :: i2 = selected_int_kind(4)
!> Length of default integers, range -2³¹ to 2³¹-1; 32 bits
integer, parameter :: i4 = selected_int_kind(9)
!> Long length for integers, range -2⁶³ to 2⁶³-1; 64 bits
integer, parameter :: i8 = selected_int_kind(18)
end module kind_parameter
浮点常量应始终声明包含种类参数后缀
real(dp) :: a, b, c
a = 1.0_dp
b = 3.5_dp
c = 1.34e8_dp
将整数分配给浮点数而不损失精度是安全的
real(dp) :: a
a = 3
为了强制执行浮点除法(与整数除法 3/4
等于 0
相反),可以通过以下方式将整数转换为浮点数:
real(dp) :: a
a = real(3, dp) / 4 ! 'a' is equal to 0.75_dp
或者简单地用乘以 1.0_dp
将整数除法分开
real(dp) :: a
a = 3 * 1.0_dp / 4 ! 'a' is equal to 0.75_dp
要打印浮点数而不损失精度,请使用无限格式说明符 (g0)
或指数表示形式 (es24.16e3)
,这将为您提供 17 位有效数字的打印输出。