Основы чисел с плавающей точкой
Числа с плавающей точкой полезны для представления чисел, которые не являются целыми. Диапазон чисел с плавающей точкой совпадает с диапазоном типа данных 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