Не нужно «запоминать» первоначальную точность аргументов.Он может временно (внутренне) преобразовать числа в точные во время вычисления и пометить результат как неточный, если какой-либо аргумент является неточным.
Примеры:
(denominator 1/10) ; 10
(denominator 0.1) ; 3.602879701896397e+16
(Последний результат - реализациязависит от числа Racket 5.0.2, запущенного на amd64. Вы получите другие результаты от других реализаций.)
Для скрытых и архивов: необычно выглядящий результат заключается в том, что большинство реализаций используют IEEE754 для неточных чисел, которые (будучи двоичным форматом с плавающей запятой) не могут представлять 0,1 с полной точностью (только десятичный формат с плавающей запятой).
Фактически, если вы используете (inexact->exact 0.1)
, вы будетене получить 1/10
, если ваша реализация не использует десятичную с плавающей точкой.