浮動小数点数#
浮動小数点数のデフォルトの表現は、単精度(通常 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
種別パラメータについての洞察に満ちた考えについては、 Doctor Fortran in it takes all KINDs を参照してください。
種別パラメータを定義し、必要に応じて 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 桁プリントアウトされます。