Spec-Zone.ru › Elixir 1.16

Источник 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.

Дополнительную информацию об арифметике с плавающей запятой можно найти по следующим ссылкам:

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

Краткое описание

Типы

precision_range()

Функции

ceil(число, точность \\ 0)

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

floor(число, точность \\ 0)

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

max_finite()

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

min_finite()

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

parse(бинарное значение)

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

pow(основание, показатель)

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

ratio(число с плавающей запятой)

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

round(число с плавающей запятой, точность \\ 0)

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

to_charlist(число с плавающей запятой)

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

to_string(число с плавающей запятой)

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

Типы

precision_range()Источник

@type precision_range() :: 0..15
END_OF_DOCUMENT_MARKER

Функции

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» Дэвида М. Гэя.

Примеры

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)
'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"

Скачать версию ePub

Создано с помощью ExDoc (v0.32.2) для языка программирования Elixir

© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.16.3/Float.html

Spec-Zone.ru

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