Когда это нужно
Используйте точные целые и рациональные числа, если математический результат должен оставаться точным. Вводите вещественное число лишь для неточного измерения или намеренно неточной операции.
Проверьте запуском
(list (/ 1 3) (+ 1 2.0) (number->string -0.0))Наблюдаемый результат
(1/3 3.0 "-0.0")Разбор примера
1/3 остаётся точной сокращённой дробью. Сложение точного 1 с неточным 2.0 даёт неточное 3.0. Печать сохраняет знак отрицательного нуля, поэтому number->string возвращает "-0.0".
Как рассуждать
- Точная арифметика остаётся точной;
+ - * /становятся неточными при любом неточном операнде. Сравнения смешанных чисел выполняются точно. - Бесконечность и NaN не могут попасть в выполнение; деление на ноль — E313, получение не конечного результата — E314.
- Конечные вещественные печатаются кратчайшей формой с точным обратным
чтением, только позиционно, с обязательным
.0и сохранением-0.0.
Быстрый выбор
| Вид | Примеры | Главное правило |
|---|---|---|
| точное целое | 0, -12, 999999999999 | произвольная точность |
| точное рациональное | 1/3, -5/2 | сокращённая дробь с положительным знаменателем |
| конечное вещественное | 2.0, -0.0, 0.125 | конечное IEEE-754 и каноническая позиционная печать |
| смешанная арифметика | (+ 1 2.0) | неточный операнд делает арифметический результат неточным |
| смешанное сравнение | (= 2 2.0) | математическое сравнение без потери точности |
Частая ошибка
Комплексные числа и трансцендентные функции платформенной libm исключены.
Текущие границы
- Правило заразности точности арифметики нельзя переносить на выбор и сравнение.
Куда дальше
Домены и сигнатуры перечислены в числовом справочнике, а отличие числового равенства от чувствительного к точности — в главе о равенстве.