Числа с плавающей точкой
Функции для работы с числами с плавающей точкой.
Функции ядра
Функции, связанные с числами с плавающей точкой, также есть на модуле 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 для получения более подробной информации об этих проблемах.
Для получения дополнительной информации об арифметике с плавающей точкой посетите:
Резюме
Типы
- precision_range()
Функции
- ceil(число, точность \\ 0)
Округляет число с плавающей точкой до наименьшего целого, большего или равного
num.- floor(число, точность \\ 0)
Округляет число с плавающей точкой до наибольшего числа, меньшего или равного
num.- parse(бинарник)
Парсит бинарник в число с плавающей точкой.
- ratio(число с плавающей точкой)
Возвращает пару целых чисел, отношение которых точно равно исходному числу с плавающей точкой и у которого знаменатель положителен.
- round(число с плавающей точкой, точность \\ 0)
Округляет значение с плавающей точкой до произвольного количества знаков после запятой (между 0 и 15).
- to_charlist(число с плавающей точкой)
Возвращает список символов, соответствующий текстовому представлению данного числа с плавающей точкой.
- to_string(число с плавающей точкой)
Возвращает бинарник, соответствующий текстовому представлению данного числа с плавающей точкой.
Типы
precision_range()
precision_range() :: 0..15
Функции
ceil(число, точность \\ 0)
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(число, точность \\ 0)
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
parse(бинарник)
parse(binary()) :: {float(), binary()} | :error Парсит бинарник в число с плавающей точкой.
В случае успеха возвращает кортеж в форме {float, remainder_of_binary}; если бинарник не может быть преобразован в допустимое число с плавающей точкой, возвращается атом :error.
Если размер числа с плавающей точкой превышает максимальный размер 1.7976931348623157e+308, генерируется исключение ArgumentError.
Если вы хотите преобразовать строковое представление числа с плавающей точкой непосредственно в число с плавающей точкой, можно использовать 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 ratio(число с плавающей точкой)
(с версии 1.4.0)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)
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(число с плавающей точкой)
to_charlist(float()) :: charlist()
Возвращает список символов, соответствующий текстовому представлению данного числа с плавающей точкой.
Использует кратчайшее представление в соответствии с алгоритмом, описанным в «Printing Floating-Point Numbers Quickly and Accurately» в «Proceedings of the SIGPLAN '96 Conference on Programming Language Design and Implementation».
Примеры
iex> Float.to_charlist(7.0) '7.0'
to_string(число с плавающей точкой)
to_string(float()) :: String.t()
Возвращает бинарник, соответствующий текстовому представлению данного числа с плавающей точкой.
Использует кратчайшее представление в соответствии с алгоритмом, описанным в «Printing Floating-Point Numbers Quickly and Accurately» в «Proceedings of the SIGPLAN '96 Conference on Programming Language Design and Implementation».
Примеры
iex> Float.to_string(7.0) "7.0"
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.8.2/Float.html