




В реализации, использующей представление математически иррациональных чисел с плавающей запятой, любое число, отличное от бесконечности или NaN, будет рациональным, поскольку значение с плавающей запятой, по сути, представляет собой дробь со степенью 2 в качестве знаменателя. По сути, иррациональные числа, такие как π и (sqrt 2), на самом деле являются рациональными приближениями в этих системах.
Предикат rational? предназначен для полноты, чтобы учесть другие возможные представления иррациональных чисел, такие как непрерывные дроби. Я не думаю, что есть какие-то реальные реализации, подобные этому, это просто теоретически.
Спасибо за ваш ответ. Не могли бы вы привести пример, кроме -inf.0, где rational? дает #f?
+inf.0, -inf.0, +nan.0 как я сказал в ответ.
Ну, они не появляются каждый день. Вы упомянули цепные дроби.
Насколько я знаю, таких реализаций Scheme нет. Это просто теоретически.
Предикат rational? возвращает значение true, если число является рациональным: число вида n/m, где n и m — целые числа, а m не равно нулю. Это означает, что, как говорит Бармар, он должен возвращать true для чисел с плавающей запятой (предполагая нормальное представление числа с плавающей запятой), потому что числа с плавающей запятой на самом деле являются рациональными.
Но есть действительно важный случай, когда rational? должен возвращать false: комплексные числа. Комплексные числа — это рациональные числа нет. Таким образом, для любой реализации, которая имеет комплексные числа, rational? вернет false для них:
> (rational? 1+2i)
#f
> (number? 1+2i)
#t
> (complex? 1+2i)
#t
> (real? 1+2i)
#f
> (exact? 1+2i)
#t
> (complex? 1)
#t
> (rational? 1+0i)
#t
В R7RS есть пример:
(rational? -inf.0) => #f