Числа с плавающей точкой#

По умолчанию для представления чисел с плавающей точкой используется одинарная точность (обычно 32 бита / 4 байта). Для большинства задач требуется более высокая точность. Для этой цели может быть определён пользовательский параметр kind. Рекомендуемый способ определения параметров kind – использовать запись

integer, parameter :: dp = selected_real_kind(15)

Для многих целей также достаточно непосредственно вывести параметр kind из литерала, как здесь

integer, parameter :: dp = kind(0.0d0)

или переименовать импортируемый параметр kind из модуля iso_fortran_env

use, intrinsic :: iso_fortran_env, only : dp => real64

Некоторые размышления о параметрах kind можно найти в статье Doctor Fortran in it takes all KINDs.

Рекомендуется иметь отдельный модуль для определения параметров kind и подключать их для использования по мере необходимости. Приведём пример такого модуля

!> 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

Константы чисел с плавающей точкой всегда должны объявляться с использованием суффикса параметра kind:

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 значащих цифр при печати.