Spec-Zone.ru › Elisp

Основы чисел с плавающей точкой

Числа с плавающей точкой полезны для представления чисел, которые не являются целыми. Диапазон чисел с плавающей точкой совпадает с диапазоном типа данных C double на используемой машине. На всех компьютерах, поддерживаемых Emacs, используется формат двоичной плавающей точки IEEE binary64, который стандартизирован документом IEEE Std 754-2019 и более подробно обсуждается в статье Дэвида Голдберга «Что каждый программист должен знать о арифметике с плавающей точкой». На современных платформах операции с плавающей точкой тесно следуют стандарту IEEE-754; однако, результаты не всегда правильно округляются на некоторых устаревших платформах, в частности, на 32-битных x86.

Синтаксис для чтения чисел с плавающей точкой требует либо десятичной точки, либо показателя степени, либо и того, и другого. Необязательные знаки (‘+’ или ‘-’) предшествуют числу и его показателю степени. Например, ‘1500.0’, ‘+15e2’, ‘15.0e+2’, ‘+1500000e-3’ и ‘.15e4’ являются пятью способами записи числа с плавающей точкой, значение которого равно 1500. Все они эквивалентны. Как и Common Lisp, Emacs Lisp требует, чтобы после десятичной точки в числе с плавающей точкой без показателя степени было хотя бы одно число; ‘1500.’ является целым числом, а не числом с плавающей точкой.

Emacs Lisp рассматривает -0.0 как численно равное обычному нулю в отношении числовых сравнений, таких как =. Это соответствует стандарту IEEE для чисел с плавающей точкой, в котором говорится, что -0.0 и 0.0 численно равны, даже если другие операции могут их различать.

Стандарт IEEE для чисел с плавающей точкой поддерживает положительную и отрицательную бесконечность в качестве значений чисел с плавающей точкой. Он также предоставляет класс значений, называемых NaN, или «не число»; числовые функции возвращают такие значения в тех случаях, когда нет правильного ответа. Например, (/ 0.0 0.0) возвращает NaN. NaN никогда не численно равно никакому значению, даже самому себе. NaN имеет знак и мантиссу, а нечисловые функции рассматривают два NaN как равные, если их знаки и мантиссы совпадают. Мантиссы NaN зависят от машины, как и цифры в их строковом представлении.

Когда речь идёт о NaN и знакомых нулях, нечисловые функции, такие как eql, equal, sxhash-eql, sxhash-equal и gethash, определяют, являются ли значения неразличимыми, а не то, численно ли они равны. Например, когда x и y — одинаковый NaN, (equal x y) возвращает t, в то время как (= x y) использует числовое сравнение и возвращает nil; наоборот, (equal 0.0 -0.0) возвращает nil, а (= 0.0 -0.0) возвращает t.

Вот синтаксисы чтения этих специальных значений чисел с плавающей точкой:

бесконечность

‘1.0e+INF’ и ‘-1.0e+INF’

не число

‘0.0e+NaN’ и ‘-0.0e+NaN’

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

Функция: isnan x

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

Функция: frexp x

Эта функция возвращает ячейку списка (s . e), где s и e соответственно являются мантиссой и показателем степени числа с плавающей точкой x.

Если x конечно, то s — это число с плавающей точкой между 0,5 (включительно) и 1,0 (исключительно), e — целое число, а x = s * 2**e. Если x равно нулю или бесконечности, то s такое же, как x. Если x — NaN, то s тоже NaN. Если x — ноль, то e равно 0.

Функция: ldexp s e

Учитывая числовую мантиссу s и целую степень e, эта функция возвращает число с плавающей точкой s * 2**e.

Функция: copysign x1 x2

Эта функция копирует знак x2 в значение x1 и возвращает результат. x1 и x2 должны быть числами с плавающей точкой.

Функция: logb x

Эта функция возвращает двоичный показатель x. Точнее, если x конечно и не равно нулю, значение — это логарифм по основанию 2 от |x|, округлённый вниз до целого числа. Если x равно нулю или бесконечности, значение — бесконечность; если x — NaN, значение — NaN.

(logb 10)
     ⇒ 3
(logb 10.0e20)
     ⇒ 69
(logb 0)
     ⇒ -1.0e+INF

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Float-Basics.html

Spec-Zone.ru

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