mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-23 12:00:21 +02:00
equal?' and
eqv?' are now equivalent for numbers
Change `equal?' to work like `eqv?' for numbers. Previously they worked differently in some cases, e.g. when comparing signed zeroes or NaNs. For example, (equal? 0.0 -0.0) returned #t but (eqv? 0.0 -0.0) returned #f, and (equal? +nan.0 +nan.0) returned #f but (eqv? +nan.0 +nan.0) returned #t. * libguile/numbers.c (scm_real_equalp, scm_bigequal, scm_complex_equalp, scm_i_fraction_equalp): Move to eq.c. * libguile/eq.c (scm_real_equalp): Compare flonums using real_eqv instead of ==, so that NaNs are now considered equal, and to distinguish signed zeroes. (scm_complex_equalp): Compare real and imaginary components using real_eqv instead of ==, so that NaNs are now considered equal, and to distinguish signed zeroes. (scm_bigequal): Use scm_i_bigcmp instead of duplicating it. (real_eqv): Test for NaNs using isnan(x) instead of (x != x), and use SCM_UNLIKELY for optimization. (scm_eqv_p): Use scm_bigequal, scm_real_equalp, scm_complex_equalp, and scm_i_fraction_equalp to compare numbers, instead of inline code. Those predicates now do what scm_eqv_p formerly did internally. Replace if statements with switch statements, as is done in scm_equal_p. Remove useless code to check equality of fractions with different SCM_CELL_TYPEs; this was for a tentative "lazy reduction bit" which was never developed. (scm_eqv_p, scm_equal_p): Remove useless code to check equality between inexact reals and non-real complex numbers with zero imaginary part. Such numbers do not exist, because the current code is careful to never create them. * test-suite/tests/numbers.test: Add test cases for `eqv?' and `equal?'. Change existing test case for `(equal? +nan.0 +nan.0)' to expect #t instead of #f. * NEWS: Add NEWS entries.
This commit is contained in:
parent
c9cf90d474
commit
2e6e1933b4
4 changed files with 154 additions and 89 deletions
|
@ -1605,12 +1605,24 @@
|
|||
|
||||
(with-test-prefix "equal?"
|
||||
(pass-if (documented? equal?))
|
||||
|
||||
;; The following test will fail on platforms
|
||||
;; without distinct signed zeroes 0.0 and -0.0.
|
||||
(pass-if (not (equal? 0.0 -0.0)))
|
||||
|
||||
(pass-if (equal? 0 0))
|
||||
(pass-if (equal? 7 7))
|
||||
(pass-if (equal? -7 -7))
|
||||
(pass-if (equal? (+ 1 fixnum-max) (+ 1 fixnum-max)))
|
||||
(pass-if (equal? (- fixnum-min 1) (- fixnum-min 1)))
|
||||
(pass-if (equal? 0.0 0.0))
|
||||
(pass-if (equal? -0.0 -0.0))
|
||||
(pass-if (not (equal? 0 1)))
|
||||
(pass-if (not (equal? 0 0.0)))
|
||||
(pass-if (not (equal? 1 1.0)))
|
||||
(pass-if (not (equal? 0.0 0)))
|
||||
(pass-if (not (equal? 1.0 1)))
|
||||
(pass-if (not (equal? -1.0 -1)))
|
||||
(pass-if (not (equal? fixnum-max (+ 1 fixnum-max))))
|
||||
(pass-if (not (equal? (+ 1 fixnum-max) fixnum-max)))
|
||||
(pass-if (not (equal? (+ 1 fixnum-max) (+ 2 fixnum-max))))
|
||||
|
@ -1631,7 +1643,10 @@
|
|||
(pass-if (not (equal? (- (ash 1 1024)) -inf.0)))
|
||||
(pass-if (not (equal? -inf.0 (- (ash 1 1024)))))
|
||||
|
||||
(pass-if (not (equal? +nan.0 +nan.0)))
|
||||
(pass-if (equal? +nan.0 +nan.0))
|
||||
(pass-if (equal? +nan.0 +nan.0))
|
||||
(pass-if (not (equal? +nan.0 0.0+nan.0i)))
|
||||
|
||||
(pass-if (not (equal? 0 +nan.0)))
|
||||
(pass-if (not (equal? +nan.0 0)))
|
||||
(pass-if (not (equal? 1 +nan.0)))
|
||||
|
@ -1654,6 +1669,75 @@
|
|||
(pass-if (not (equal? (ash 3 1023) +nan.0)))
|
||||
(pass-if (not (equal? +nan.0 (ash 3 1023)))))
|
||||
|
||||
;;;
|
||||
;;; eqv?
|
||||
;;;
|
||||
|
||||
(with-test-prefix "eqv?"
|
||||
(pass-if (documented? eqv?))
|
||||
|
||||
;; The following test will fail on platforms
|
||||
;; without distinct signed zeroes 0.0 and -0.0.
|
||||
(pass-if (not (eqv? 0.0 -0.0)))
|
||||
|
||||
(pass-if (eqv? 0 0))
|
||||
(pass-if (eqv? 7 7))
|
||||
(pass-if (eqv? -7 -7))
|
||||
(pass-if (eqv? (+ 1 fixnum-max) (+ 1 fixnum-max)))
|
||||
(pass-if (eqv? (- fixnum-min 1) (- fixnum-min 1)))
|
||||
(pass-if (eqv? 0.0 0.0))
|
||||
(pass-if (eqv? -0.0 -0.0))
|
||||
(pass-if (not (eqv? 0 1)))
|
||||
(pass-if (not (eqv? 0 0.0)))
|
||||
(pass-if (not (eqv? 1 1.0)))
|
||||
(pass-if (not (eqv? 0.0 0)))
|
||||
(pass-if (not (eqv? 1.0 1)))
|
||||
(pass-if (not (eqv? -1.0 -1)))
|
||||
(pass-if (not (eqv? fixnum-max (+ 1 fixnum-max))))
|
||||
(pass-if (not (eqv? (+ 1 fixnum-max) fixnum-max)))
|
||||
(pass-if (not (eqv? (+ 1 fixnum-max) (+ 2 fixnum-max))))
|
||||
(pass-if (not (eqv? fixnum-min (- fixnum-min 1))))
|
||||
(pass-if (not (eqv? (- fixnum-min 1) fixnum-min)))
|
||||
(pass-if (not (eqv? (- fixnum-min 1) (- fixnum-min 2))))
|
||||
(pass-if (not (eqv? (+ fixnum-max 1) (- fixnum-min 1))))
|
||||
|
||||
(pass-if (not (eqv? (ash 1 256) +inf.0)))
|
||||
(pass-if (not (eqv? +inf.0 (ash 1 256))))
|
||||
(pass-if (not (eqv? (ash 1 256) -inf.0)))
|
||||
(pass-if (not (eqv? -inf.0 (ash 1 256))))
|
||||
|
||||
;; in gmp prior to 4.2, mpz_cmp_d ended up treating Inf as 2^1024, make
|
||||
;; sure we've avoided that
|
||||
(pass-if (not (eqv? (ash 1 1024) +inf.0)))
|
||||
(pass-if (not (eqv? +inf.0 (ash 1 1024))))
|
||||
(pass-if (not (eqv? (- (ash 1 1024)) -inf.0)))
|
||||
(pass-if (not (eqv? -inf.0 (- (ash 1 1024)))))
|
||||
|
||||
(pass-if (eqv? +nan.0 +nan.0))
|
||||
(pass-if (not (eqv? +nan.0 0.0+nan.0i)))
|
||||
|
||||
(pass-if (not (eqv? 0 +nan.0)))
|
||||
(pass-if (not (eqv? +nan.0 0)))
|
||||
(pass-if (not (eqv? 1 +nan.0)))
|
||||
(pass-if (not (eqv? +nan.0 1)))
|
||||
(pass-if (not (eqv? -1 +nan.0)))
|
||||
(pass-if (not (eqv? +nan.0 -1)))
|
||||
|
||||
(pass-if (not (eqv? (ash 1 256) +nan.0)))
|
||||
(pass-if (not (eqv? +nan.0 (ash 1 256))))
|
||||
(pass-if (not (eqv? (- (ash 1 256)) +nan.0)))
|
||||
(pass-if (not (eqv? +nan.0 (- (ash 1 256)))))
|
||||
|
||||
(pass-if (not (eqv? (ash 1 8192) +nan.0)))
|
||||
(pass-if (not (eqv? +nan.0 (ash 1 8192))))
|
||||
(pass-if (not (eqv? (- (ash 1 8192)) +nan.0)))
|
||||
(pass-if (not (eqv? +nan.0 (- (ash 1 8192)))))
|
||||
|
||||
;; in gmp prior to 4.2, mpz_cmp_d ended up treating NaN as 3*2^1023, make
|
||||
;; sure we've avoided that
|
||||
(pass-if (not (eqv? (ash 3 1023) +nan.0)))
|
||||
(pass-if (not (eqv? +nan.0 (ash 3 1023)))))
|
||||
|
||||
;;;
|
||||
;;; =
|
||||
;;;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue