Исходный код Float
Функции для работы с числами с плавающей точкой.
Для математических операций над числами с плавающей точкой см. модуль Erlang's :math.
Функции ядра
Функции, связанные с числами с плавающей точкой, также находятся в модуле 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 для получения более подробной информации об этих проблемах.
Чтобы узнать больше о арифметике с плавающей точкой, посетите:
Резюме
Типы
Функции
- ceil(number, precision \\ 0)
Округляет число с плавающей точкой до наименьшего числа с плавающей точкой, большего или равного
number.- floor(number, precision \\ 0)
Округляет число с плавающей точкой до наибольшего числа с плавающей точкой, меньшего или равного
number.- 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()Исходный код
@type precision_range() :: 0..15
Функции
ceil(number, precision \\ 0)Source
@spec ceil(float(), precision_range()) :: float()
Округляет число с плавающей точкой до наименьшего числа с плавающей точкой, большего или равного number.
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 iex> Float.ceil(-0.01) -0.0
floor(number, precision \\ 0)Source
@spec floor(float(), precision_range()) :: float()
Округляет число с плавающей точкой до наибольшего числа с плавающей точкой, меньшего или равного number.
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
@spec max_finite() :: float()
Возвращает максимальное конечное значение для числа с плавающей точкой.
Примеры
iex> Float.max_finite() 1.7976931348623157e308
min_finite()Source
@spec min_finite() :: float()
Возвращает минимальное конечное значение для числа с плавающей точкой.
Примеры
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(".12")
:error
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()} Возвращает пару целых чисел, отношение которых точно равно исходному числу с плавающей точкой, и со знаменателем, большим или равным 0.
Примеры
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 iex> Float.round(-0.01) -0.0
to_charlist(float)Source
@spec to_charlist(float()) :: charlist()
Возвращает список символов, соответствующий самому короткому текстовому представлению заданного числа с плавающей точкой.
Использует алгоритм, представленный в «Ryū: fast float-to-string conversion» в Proceedings of the SIGPLAN '2018 Conference on Programming Language Design and Implementation.
Для настраиваемого представления используйте :erlang.float_to_list/2.
Встроен в компилятор.
Примеры
iex> Float.to_charlist(7.0) ~c"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-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.18.1/Float.html