1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-22 03:30:22 +02:00

Implement finite?' in core and fix R6RS finite?' and `infinite?'

* libguile/numbers.c (scm_finite_p): Add new predicate `finite?' from
  R6RS to guile core, which returns #t if and only if its argument is
  neither infinite nor a NaN.  Note that this is not the same as (not
  (inf? x)) or (not (infinite? x)), since NaNs are neither finite nor
  infinite.

* test-suite/tests/numbers.test: Add test cases for `finite?'.

* module/rnrs/base.scm: Import `inf?' as `infinite?' instead of
  reimplementing it.  Previously, the R6RS implementation of
  `infinite?' did not detect non-real complex infinities, nor did it
  throw exceptions for non-numbers.  (Note that NaNs _are_ considered
  numbers by scheme, despite their name).

  Import `finite?' instead of reimplementing it.  Previously, the R6RS
  implementation of `finite?' returned #t for both NaNs and non-real
  complex infinities, in violation of R6RS.

* NEWS: Add NEWS entries, and reorganize existing numerics-related
  entries together under one subheading.

* doc/ref/api-data.texi (Real and Rational Numbers): Add docs for
  `finite?' and scm_finite_p.
This commit is contained in:
Mark H Weaver 2011-01-26 09:34:02 -05:00 committed by Andy Wingo
parent cff5fa3384
commit 7112615f73
5 changed files with 89 additions and 13 deletions

View file

@ -304,6 +304,32 @@
(pass-if (not (even? (- (* 2 fixnum-min) 1))))
(pass-if (even? (* 2 fixnum-min))))
;;;
;;; finite?
;;;
(with-test-prefix "finite?"
(pass-if (documented? finite?))
(pass-if (not (finite? (inf))))
(pass-if (not (finite? +inf.0)))
(pass-if (not (finite? -inf.0)))
(pass-if (not (finite? +inf.0+1i)))
(pass-if (not (finite? -inf.0+1i)))
(pass-if (not (finite? +1+inf.0i)))
(pass-if (not (finite? +1-inf.0i)))
(pass-if (not (finite? (nan))))
(pass-if (not (finite? +nan.0)))
(pass-if (not (finite? 1+nan.0i)))
(pass-if (not (finite? +nan.0+nan.0i)))
(pass-if (finite? 0))
(pass-if (finite? 0.0))
(pass-if (finite? -0.0))
(pass-if (finite? 42.0))
(pass-if (finite? 1/2))
(pass-if (finite? 42.0+700i))
(pass-if (finite? (+ fixnum-max 1)))
(pass-if (finite? (- fixnum-min 1))))
;;;
;;; inf? and inf
;;;