Float
Функции для работы с числами с плавающей точкой.
Функции ядра
Функции, относящиеся к числам с плавающей точкой, также доступны в модуле 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)
Округляет число с плавающей точкой до наименьшего целого, большего или равного
num.- floor(number, precision \\ 0)
Округляет число с плавающей точкой до наибольшего числа, меньшего или равного
num.- 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
parse(binary)Source
@spec 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 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, что объясняет приведенное выше поведение. Если вам нужно точное округление для десятичных чисел, используйте библиотеку десятичных чисел. Приведённое выше поведение также соответствует эталонным реализациям, таким как «Правильные округления двоично-десятичных и десятично-двоичных преобразований» Дэвида М. Гэя.
Примеры
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()
Возвращает список символов, соответствующий текстовому представлению данного числа с плавающей запятой.
Используется самое короткое представление в соответствии с алгоритмом, описанным в «Быстрое и точное вычисление чисел с плавающей точкой» в материалах конференции SIGPLAN '96 по проектированию и реализации языков программирования.
Примеры
iex> Float.to_charlist(7.0) '7.0'
to_string(float)Source
@spec to_string(float()) :: String.t()
Возвращает двоичную строку, соответствующую текстовому представлению данного числа с плавающей запятой.
Используется самое короткое представление в соответствии с алгоритмом, описанным в «Быстрое и точное вычисление чисел с плавающей точкой» в материалах конференции SIGPLAN '96 по проектированию и реализации языков программирования.
Примеры
iex> Float.to_string(7.0) "7.0"
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.13.4/Float.html