Liczby zmiennoprzecinkowe#
Domyślnie liczby zmiennoprzecinkowe są reprezentowane poprzez użycie pojedynczej precyzji (zwykle 32 bity / 4 bajty). Dla większości aplikacji wymagana jest większa precyzja. W tym celu można zdefiniować niestandardowy parametr rodzaju. Zalecanym sposobem zdefiniowania takiego parametru jest użycie
integer, parameter :: dp = selected_real_kind(15)
W wielu przypadkach wystarcza również bezpośrednie wywnioskowanie parametru rodzaju z literału, tak jak tutaj
integer, parameter :: dp = kind(0.0d0)
lub zmienić nazwę importowanego parametru rodzaju z modułu iso_fortran_env
use, intrinsic :: iso_fortran_env, only : dp => real64
Aby zapoznać się z bardziej szczegółowymi przemyśleniami na temat parametrów rodzaju zobacz Doctor Fortran in it takes all KINDs.
Zalecane jest posiadanie centralnego modułu do definiowania parametrów rodzaju oraz używania ich tam, gdzie jest to potrzebne. Przykładem takiego modułu jest
!> 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
Stałe zmiennoprzecinkowe powinny zawsze być deklarowane z uwzględnieniem sufiksu parametru rodzaju:
real(dp) :: a, b, c
a = 1.0_dp
b = 3.5_dp
c = 1.34e8_dp
Można bezpiecznie przydzielać liczby całkowite do liczb zmiennoprzecinkowych bez utraty dokładności:
real(dp) :: a
a = 3
Aby wymusić dzielenie liczb zmiennoprzecinkowych (w przeciwieństwie do dzielenia liczb całkowitych, gdzie 3/4
jest równe 0
), liczba całkowita może zostać przekonwertowana na liczbę zmiennoprzecinkową w następujący sposób:
real(dp) :: a
a = real(3, dp) / 4 ! 'a' is equal to 0.75_dp
lub po prostu oddzieleniem dzielenia liczb całkowitych mnożeniem przez 1.0_dp
real(dp) :: a
a = 3 * 1.0_dp / 4 ! 'a' is equal to 0.75_dp
Aby wydrukować liczbę zmiennoprzecinkową bez utraty precyzji użyj nieograniczonego specyfikatora formatu (g0)
lub reprezentacji wykładniczej (es24.16e3)
, dzięki której wydrukowane zostanie 17 najważniejszych cyfr.