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.