Как вводить положительные и отрицательные бесконечности в схему MIT?

Раздел 4.7.2 Справочное руководство по схемам MIT/GNU утверждает, что

Спецификация чисел с плавающей запятой IEEE поддерживает три специальных «числа»: положительная бесконечность (+inf), отрицательная бесконечность (-inf) и не-число (NaN).

Эти константы, помимо того, что они являются четко определенными значениями с плавающей запятой IEEE, также полезны для арифметики диапазонов. Однако я не могу использовать их в своих программах:

1 ]=> +inf

;Unbound variable: +inf

Генерация этих значений также непроста: выражения, которые, казалось бы, должны вычисляться до бесконечности с плавающей запятой, на самом деле не таковы:

1 ]=> (flo:/ 1. 0.)

;Floating-point division by zero

Как я могу вводить или генерировать бесконечные константы с плавающей запятой в схеме MIT?


person Benjamin Barenblat    schedule 13.04.2015    source источник


Ответы (1)


tests/runtime/test-arith.scm предлагает использовать flo:with-exceptions-untrapped:

;;; XXX The nonsense about IDENTITY-PROCEDURE here serves to fake
;;; out bogus constant-folding which needs to be fixed in SF (and
;;; probably LIAR too).

(define (zero)
  (identity-procedure 0.))

(define (nan)
  (flo:with-exceptions-untrapped (flo:exception:invalid-operation)
    (lambda ()
      (flo:/ (zero) (zero)))))

(define (inf+)
  (flo:with-exceptions-untrapped (flo:exception:divide-by-zero)
    (lambda ()
      (flo:/ +1. (zero)))))

(define (inf-)
  (flo:with-exceptions-untrapped (flo:exception:divide-by-zero)
    (lambda ()
      (flo:/ -1. (zero)))))

Результаты отображаются как #[NaN], #[+inf], #[-inf], но не могут быть введены таким образом.

person Anders Kaseorg    schedule 13.04.2015