Источник 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(число, точность \\ 0)Исходный код
@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(число, точность \\ 0)Исходный код
@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()Исходный код
@spec max_finite() :: float()
Возвращает максимальное конечное значение для числа с плавающей точкой.
Примеры
iex> Float.max_finite() 1.7976931348623157e308
min_finite()Исходный код
@spec min_finite() :: float()
Возвращает минимальное конечное значение для числа с плавающей точкой.
Примеры
iex> Float.min_finite() -1.7976931348623157e308
parse(двоичное)Исходный код
@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(основание, показатель)Исходный код
@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(число_с_плавающей_точкой)Исходный код
@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(число_с_плавающей_точкой, точность \\ 0)Исходный код
@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" by David M. Gay.
Примеры
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(число_с_плавающей_точкой)Исходный код
@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) ~c"7.0"
to_string(число_с_плавающей_точкой)Исходный код
@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.17.2/Float.html