Используйте точные числа, чтобы сохранять результаты вроде одной трети в виде дробей. Неточные числа подходят для измерений и вычислений, допускающих округление.
Сравните результаты
Запустите весь пример на площадке.
(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.
Операции +, -, * и / возвращают точный результат для точных аргументов. Если хотя бы один аргумент неточный, они преобразуют все аргументы в числа с плавающей точкой.
Сравнивайте без округления точного аргумента
(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.
Связанные страницы
В разделе Числовые процедуры указаны аргументы и ошибки. Раздел Равенство и идентичность объясняет, когда сравнения различают точные и неточные значения.