Spec-Zone.ru › Elixir 1.15

Float

Функции для работы с числами с плавающей точкой.

Для математических операций над числами с плавающей точкой см. модуль :math Erlang.

Функции ядра

Функции, связанные с числами с плавающей точкой, также есть в модуле Kernel. Вот список этих функций:

  • Kernel.round/1: округляет число до ближайшего целого.
  • Kernel.trunc/1: возвращает целую часть числа.

Известные проблемы

Существует ряд хорошо известных проблем с числами с плавающей точкой и арифметикой, обусловленных тем, что большинство десятичных дробей не могут быть точно представлены в двоичной системе с плавающей точкой, а большинство операций не являются точными, а работают с приближениями. Эти проблемы не специфичны для Elixir, а являются свойством самой системы представления чисел с плавающей точкой.

Например, числа 0,1 и 0,01 являются двумя из них, что означает, что результат возведения 0,1 в квадрат не даёт 0,01, ни самое близкое представимое число. Вот что происходит в этом случае:

  • Самое близкое представимое число к 0,1 равно 0,1000000014
  • Самое близкое представимое число к 0,01 равно 0,0099999997
  • Умножение 0,1 на 0,1 должно дать 0,01, но поскольку 0,1 фактически равно 0,1000000014, результат равен 0,010000000000000002, а так как это не самое близкое представимое число к 0,01, вы получите неверный результат для этой операции

Также существуют другие известные проблемы, такие как округление или отсечение чисел. Смотрите round/2 и floor/2 для получения более подробной информации об этих проблемах.

Чтобы узнать больше о арифметике чисел с плавающей точкой, посетите:

  • 0.30000000000000004.com
  • Что каждый программист должен знать об арифметике чисел с плавающей точкой

Типы

precision_range()

Функции

ceil(number, precision \\ 0)

Округляет число с плавающей точкой до наименьшего целого, большего или равного num.

floor(number, precision \\ 0)

Округляет число с плавающей точкой до наибольшего числа, меньшего или равного num.

max_finite()

Возвращает максимальное конечное значение для числа с плавающей точкой.

min_finite()

Возвращает минимальное конечное значение для числа с плавающей точкой.

parse(binary)

Парсит бинарное представление в число с плавающей точкой.

pow(base, exponent)

Вычисляет base в степени exponent.

ratio(float)

Возвращает пару целых чисел, чьё отношение точно равно исходному числу с плавающей точкой, и с положительным знаменателем.

round(float, precision \\ 0)

Округляет значение с плавающей точкой до произвольного числа дробных цифр (от 0 до 15).

to_charlist(float)

Возвращает список символов, соответствующий самому короткому текстовому представлению заданного числа с плавающей точкой.

to_string(float)

Возвращает бинарное представление, соответствующее самому короткому текстовому представлению заданного числа с плавающей точкой.

precision_range()Source

@type precision_range() :: 0..15

ceil(number, precision \\ 0)Source

@spec ceil(float(), precision_range()) :: float()

Округляет число с плавающей точкой до наименьшего целого, большего или равного num.

ceil/2 также принимает точность для округления значения с плавающей точкой до произвольного числа дробных цифр (от 0 до 15).

Операция выполняется над двоичным представлением числа с плавающей точкой без преобразования в десятичное.

Поведение ceil/2 для чисел с плавающей точкой может быть неожиданным. Например:

iex> Float.ceil(-12.52, 2)
-12.51

Можно было ожидать округления до -12.52. Это не ошибка. Большинство десятичных дробей не могут быть представлены в двоичном формате с плавающей точкой, и поэтому число выше внутренне представлено как -12.51999999, что объясняет приведенное выше поведение.

Эта функция всегда возвращает числа с плавающей точкой. Kernel.trunc/1 можно использовать вместо этого для усечения результата до целого числа.

Примеры

iex> Float.ceil(34.25)
35.0
iex> Float.ceil(-56.5)
-56.0
iex> Float.ceil(34.251, 2)
34.26

floor(number, precision \\ 0)Source

@spec floor(float(), precision_range()) :: float()

Округляет число с плавающей точкой до наибольшего числа, меньшего или равного num.

floor/2 также принимает точность для округления значения с плавающей точкой до произвольного числа дробных цифр (от 0 до 15). Операция выполняется над двоичным представлением числа с плавающей точкой без преобразования в десятичное.

Эта функция всегда возвращает число с плавающей точкой. Kernel.trunc/1 можно использовать вместо этого для усечения результата до целого числа.

Известные проблемы

Поведение floor/2 для чисел с плавающей точкой может быть неожиданным. Например:

iex> Float.floor(12.52, 2)
12.51

Можно было ожидать округления до 12.52. Это не ошибка. Большинство десятичных дробей не могут быть представлены в двоичном формате с плавающей точкой, и поэтому число выше внутренне представлено как 12.51999999, что объясняет приведенное выше поведение.

Примеры

iex> Float.floor(34.25)
34.0
iex> Float.floor(-56.5)
-57.0
iex> Float.floor(34.259, 2)
34.25

max_finite()Source

Возвращает максимальное конечное значение для числа с плавающей точкой.

Примеры

iex> Float.max_finite()
1.7976931348623157e308

min_finite()Source

Возвращает минимальное конечное значение для числа с плавающей точкой.

Примеры

iex> Float.min_finite()
-1.7976931348623157e308

parse(binary)Source

@spec parse(binary()) :: {float(), binary()} | :error

Парсит бинарное представление в число с плавающей точкой.

В случае успеха возвращает кортеж в формате {float, remainder_of_binary}; если бинарное представление нельзя преобразовать в действительное число с плавающей точкой, возвращается атом :error.

Если размер числа с плавающей точкой превышает максимальный размер 1.7976931348623157e+308, возвращается :error, даже если текстовое представление само по себе может быть корректным.

Если нужно преобразовать строковое представление числа с плавающей точкой непосредственно в число с плавающей точкой, можно использовать String.to_float/1.

Примеры

iex> Float.parse("34")
{34.0, ""}
iex> Float.parse("34.25")
{34.25, ""}
iex> Float.parse("56.5xyz")
{56.5, "xyz"}

iex> Float.parse("pi")
:error
iex> Float.parse("1.7976931348623159e+308")
:error

pow(base, exponent)Source

@spec pow(float(), number()) :: float()

Вычисляет base в степени exponent.

base должно быть числом с плавающей точкой, а exponent может быть любым числом. Однако, если задан отрицательный базис и дробный показатель степени, генерируется исключение ArithmeticError.

Функция всегда возвращает число с плавающей точкой. Смотрите Integer.pow/2 для возведения в степень, возвращающей целые числа.

Примеры

iex> Float.pow(2.0, 0)
1.0
iex> Float.pow(2.0, 1)
2.0
iex> Float.pow(2.0, 10)
1024.0
iex> Float.pow(2.0, -1)
0.5
iex> Float.pow(2.0, -3)
0.125

iex> Float.pow(3.0, 1.5)
5.196152422706632

iex> Float.pow(-2.0, 3)
-8.0
iex> Float.pow(-2.0, 4)
16.0

iex> Float.pow(-1.0, 0.5)
** (ArithmeticError) bad argument in arithmetic expression

ratio(float)Source

@spec ratio(float()) :: {integer(), pos_integer()}

Возвращает пару целых чисел, отношение которых точно равно исходному числу с плавающей точкой, и со знаменателем больше нуля.

Примеры

iex> Float.ratio(0.0)
{0, 1}
iex> Float.ratio(3.14)
{7070651414971679, 2251799813685248}
iex> Float.ratio(-3.14)
{-7070651414971679, 2251799813685248}
iex> Float.ratio(1.5)
{3, 2}
iex> Float.ratio(-1.5)
{-3, 2}
iex> Float.ratio(16.0)
{16, 1}
iex> Float.ratio(-16.0)
{-16, 1}

round(float, precision \\ 0)Source

@spec round(float(), precision_range()) :: float()

Округляет значение с плавающей точкой до произвольного числа дробных цифр (от 0 до 15).

Направление округления всегда равно половине вверх. Операция выполняется над двоичным представлением числа с плавающей точкой без преобразования в десятичное.

Эта функция принимает только числа с плавающей точкой и всегда возвращает число с плавающей точкой. Используйте Kernel.round/1, если вам нужна функция, которая принимает как числа с плавающей точкой, так и целые числа и всегда возвращает целое число.

Известные проблемы

Поведение round/2 для чисел с плавающей точкой может быть неожиданным. Например:

iex> Float.round(5.5675, 3)
5.567

Можно было ожидать округления до 5.568 (по принципу половина вверх). Это не ошибка. Большинство десятичных дробей не могут быть представлены в двоичном формате с плавающей точкой, и поэтому число выше внутренне представлено как 5.567499999, что объясняет приведенное выше поведение. Если вам нужно точное округление для десятичных чисел, используйте библиотеку для работы с десятичными числами. Приведенное выше поведение также соответствует эталонным реализациям, таким как "Correctly Rounded Binary-Decimal and Decimal-Binary Conversions" Дэвида М. Гэя.

Примеры

iex> Float.round(12.5)
13.0
iex> Float.round(5.5674, 3)
5.567
iex> Float.round(5.5675, 3)
5.567
iex> Float.round(-5.5674, 3)
-5.567
iex> Float.round(-5.5675)
-6.0
iex> Float.round(12.341444444444441, 15)
12.341444444444441

to_charlist(float)Source

@spec to_charlist(float()) :: charlist()

Возвращает список символов, соответствующий самому короткому текстовому представлению данного числа с плавающей точкой.

Базовый алгоритм меняется в зависимости от версии Erlang/OTP:

  • Для OTP >= 24 используется алгоритм, представленный в "Ryū: fast float-to-string conversion" в Proceedings of the SIGPLAN '2018 Conference on Programming Language Design and Implementation.

  • Для OTP < 24 используется алгоритм, представленный в "Printing Floating-Point Numbers Quickly and Accurately" в Proceedings of the SIGPLAN '1996 Conference on Programming Language Design and Implementation.

Для настраиваемого представления используйте :erlang.float_to_list/2.

Примеры

iex> Float.to_charlist(7.0)
'7.0'

to_string(float)Source

@spec to_string(float()) :: String.t()

Возвращает бинарное представление, соответствующее самому короткому текстовому представлению данного числа с плавающей точкой.

Базовый алгоритм меняется в зависимости от версии Erlang/OTP:

  • Для OTP >= 24 используется алгоритм, представленный в "Ryū: fast float-to-string conversion" в Proceedings of the SIGPLAN '2018 Conference on Programming Language Design and Implementation.

  • Для OTP < 24 используется алгоритм, представленный в "Printing Floating-Point Numbers Quickly and Accurately" в Proceedings of the SIGPLAN '1996 Conference on Programming Language Design and Implementation.

Для настраиваемого представления используйте :erlang.float_to_binary/2.

Примеры

iex> Float.to_string(7.0)
"7.0"

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.15.4/Float.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API