Песочница

Точные и приближённые числа

Сохраняйте точные дроби, вычисляйте с неточными числами и сравнивайте результаты и их запись.

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

Сравните результаты

Запустите весь пример на площадке.

LISPEX
(list (/ 1 3) (+ 1 2.0) (number->string -0.0))

Результат

ВЫВОД
(1/3 3.0 "-0.0")

Выражение (/ 1 3) возвращает точную дробь 1/3. Сложение точного 1 с неточным 2.0 даёт неточное 3.0. Процедура number->string преобразует число в строку и сохраняет знак минус у -0.0.

Выберите тип числа

ТипПримерыПредставление
Точное целое0, -12, 999999999999Произвольная точность позволяет выйти за размер машинного целого
Точное рациональное1/3, -5/2Несократимая дробь с положительным знаменателем
Неточное вещественное2.0, -0.0, 0.125Конечное 64-битное число с плавающей точкой IEEE-754

Дробь со знаменателем 1 становится точным целым. Например, (/ 10 5) возвращает 2.

Операции +, -, * и / возвращают точный результат для точных аргументов. Если хотя бы один аргумент неточный, они преобразуют все аргументы в числа с плавающей точкой.

Сравнивайте без округления точного аргумента

LISPEX
(list (= 2 2.0) (= 1/10 0.1) (min 1 2.0))

Результат

ВЫВОД
(#t #f 1.0)

Числа 2 и 2.0 имеют одинаковое математическое значение. Неточное 0.1 хранит двоичное приближение одной десятой и потому отличается от точного 1/10.

Числовые сравнения =, <, >, <= и >= точно сравнивают сохранённые значения. Они не округляют точный аргумент до числа с плавающей точкой перед сравнением.

Процедуры min и max тоже сначала точно сравнивают аргументы, затем выбирают значение. Если хотя бы один аргумент неточный, выбранное значение возвращается как неточное число. Поэтому (min 1 2.0) возвращает 1.0.

Читайте вывод вещественных чисел

Вещественные числа выводятся десятичной дробью без экспоненциальной записи. Число цифр минимально для чтения обратно в то же значение с плавающей точкой.

ВводРезультат
(number->string 0.125)"0.125"
(number->string 1e3)"1000.0"
(number->string -0.0)"-0.0"

У вещественного числа без дробной части выводится .0. Отрицательный ноль сохраняет знак.

Проверьте числовые ошибки

Деление на ноль вызывает E313. Вычисление или преобразование, которое дало бы бесконечность или NaN, вызывает E314.

Перечисленные типы позволяют работать с целыми, дробями и конечными вещественными числами. Комплексные числа и функции вроде sin и log не поддерживаются. Для целых степеней и целочисленных квадратных корней используйте expt и exact-integer-sqrt.

Связанные страницы

В разделе Числовые процедуры указаны аргументы и ошибки. Раздел Равенство и идентичность объясняет, когда сравнения различают точные и неточные значения.