1 ;;;; numbers.test --- tests guile's numbers -*- scheme -*-
2 ;;;; Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
4 ;;;; This library is free software; you can redistribute it and/or
5 ;;;; modify it under the terms of the GNU Lesser General Public
6 ;;;; License as published by the Free Software Foundation; either
7 ;;;; version 2.1 of the License, or (at your option) any later version.
9 ;;;; This library is distributed in the hope that it will be useful,
10 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ;;;; Lesser General Public License for more details.
14 ;;;; You should have received a copy of the GNU Lesser General Public
15 ;;;; License along with this library; if not, write to the Free Software
16 ;;;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 (define-module (test-suite test-numbers)
19 #:use-module (test-suite lib)
20 #:use-module (ice-9 documentation))
26 (define exception:numerical-overflow
27 (cons 'numerical-overflow "^Numerical overflow"))
29 (define (documented? object)
30 (not (not (object-documentation object))))
33 (inexact->exact (+ (/ (log (+ most-positive-fixnum 1)) (log 2)) 1)))
35 (define fixnum-min most-negative-fixnum)
36 (define fixnum-max most-positive-fixnum)
38 ;; Divine the number of bits in the mantissa of a flonum.
39 ;; We look for when 2.0^i+1.0 gets rounded, ie. the difference between that
40 ;; value and 2.0^k is not 1.0.
41 ;; Of course this assumes flonums have a fixed precision mantissa, but
42 ;; that's the case now and probably into the forseeable future.
43 ;; On an IEEE system, which means pretty much everywhere, the value here is
50 (error "Oops, cannot determine number of bits in mantissa of inexact"))
51 (let* ((sum (+ 1.0 d))
54 (more (1+ i) (* 2.0 d))
57 ;; like ash, but working on a flonum
72 (with-test-prefix "exact?"
74 (pass-if "documented?"
77 (with-test-prefix "integers"
85 (pass-if "fixnum-max + 1"
86 (exact? (+ fixnum-max 1)))
91 (pass-if "fixnum-min - 1"
92 (exact? (- fixnum-min 1))))
94 (with-test-prefix "reals"
96 ;; (FIXME: need better examples.)
98 (pass-if "sqrt (fixnum-max^2 - 1)"
99 (eq? #f (exact? (sqrt (- (expt fixnum-max 2) 1)))))
101 (pass-if "sqrt ((fixnum-max+1)^2 - 1)"
102 (eq? #f (exact? (sqrt (- (expt (+ fixnum-max 1) 2) 1)))))))
108 (with-test-prefix "odd?"
109 (pass-if (documented? odd?))
112 (pass-if (not (odd? 0)))
113 (pass-if (not (odd? 2)))
114 (pass-if (not (odd? -2)))
115 (pass-if (odd? (+ (* 2 fixnum-max) 1)))
116 (pass-if (not (odd? (* 2 fixnum-max))))
117 (pass-if (odd? (- (* 2 fixnum-min) 1)))
118 (pass-if (not (odd? (* 2 fixnum-min)))))
124 (with-test-prefix "even?"
125 (pass-if (documented? even?))
129 (pass-if (not (even? 1)))
130 (pass-if (not (even? -1)))
131 (pass-if (not (even? (+ (* 2 fixnum-max) 1))))
132 (pass-if (even? (* 2 fixnum-max)))
133 (pass-if (not (even? (- (* 2 fixnum-min) 1))))
134 (pass-if (even? (* 2 fixnum-min))))
140 (with-test-prefix "inf?"
141 (pass-if (documented? inf?))
142 (pass-if (inf? (inf)))
143 ;; FIXME: what are the expected behaviors?
144 ;; (pass-if (inf? (/ 1.0 0.0))
145 ;; (pass-if (inf? (/ 1 0.0))
146 (pass-if (not (inf? 0)))
147 (pass-if (not (inf? 42.0)))
148 (pass-if (not (inf? (+ fixnum-max 1))))
149 (pass-if (not (inf? (- fixnum-min 1)))))
155 (with-test-prefix "nan?"
156 (pass-if (documented? nan?))
157 (pass-if (nan? (nan)))
158 ;; FIXME: other ways we should be able to generate NaN?
159 (pass-if (not (nan? 0)))
160 (pass-if (not (nan? 42.0)))
161 (pass-if (not (nan? (+ fixnum-max 1))))
162 (pass-if (not (nan? (- fixnum-min 1)))))
168 (with-test-prefix "abs"
169 (pass-if (documented? abs))
170 (pass-if (zero? (abs 0)))
171 (pass-if (= 1 (abs 1)))
172 (pass-if (= 1 (abs -1)))
173 (pass-if (= (+ fixnum-max 1) (abs (+ fixnum-max 1))))
174 (pass-if (= (+ (- fixnum-min) 1) (abs (- fixnum-min 1))))
175 (pass-if (positive? (abs 1.0)))
176 (pass-if (positive? (abs -1.0))))
182 (with-test-prefix "quotient"
184 (expect-fail "documented?"
185 (documented? quotient))
187 (with-test-prefix "0 / n"
190 (eqv? 0 (quotient 0 1)))
193 (eqv? 0 (quotient 0 -1)))
196 (eqv? 0 (quotient 0 2)))
198 (pass-if "n = fixnum-max"
199 (eqv? 0 (quotient 0 fixnum-max)))
201 (pass-if "n = fixnum-max + 1"
202 (eqv? 0 (quotient 0 (+ fixnum-max 1))))
204 (pass-if "n = fixnum-min"
205 (eqv? 0 (quotient 0 fixnum-min)))
207 (pass-if "n = fixnum-min - 1"
208 (eqv? 0 (quotient 0 (- fixnum-min 1)))))
210 (with-test-prefix "1 / n"
213 (eqv? 1 (quotient 1 1)))
216 (eqv? -1 (quotient 1 -1)))
219 (eqv? 0 (quotient 1 2)))
221 (pass-if "n = fixnum-max"
222 (eqv? 0 (quotient 1 fixnum-max)))
224 (pass-if "n = fixnum-max + 1"
225 (eqv? 0 (quotient 1 (+ fixnum-max 1))))
227 (pass-if "n = fixnum-min"
228 (eqv? 0 (quotient 1 fixnum-min)))
230 (pass-if "n = fixnum-min - 1"
231 (eqv? 0 (quotient 1 (- fixnum-min 1)))))
233 (with-test-prefix "-1 / n"
236 (eqv? -1 (quotient -1 1)))
239 (eqv? 1 (quotient -1 -1)))
242 (eqv? 0 (quotient -1 2)))
244 (pass-if "n = fixnum-max"
245 (eqv? 0 (quotient -1 fixnum-max)))
247 (pass-if "n = fixnum-max + 1"
248 (eqv? 0 (quotient -1 (+ fixnum-max 1))))
250 (pass-if "n = fixnum-min"
251 (eqv? 0 (quotient -1 fixnum-min)))
253 (pass-if "n = fixnum-min - 1"
254 (eqv? 0 (quotient -1 (- fixnum-min 1)))))
256 (with-test-prefix "fixnum-max / n"
259 (eqv? fixnum-max (quotient fixnum-max 1)))
262 (eqv? (- fixnum-max) (quotient fixnum-max -1)))
265 (eqv? fixnum-max (+ (* (quotient fixnum-max 2) 2) 1)))
267 (pass-if "n = fixnum-max"
268 (eqv? 1 (quotient fixnum-max fixnum-max)))
270 (pass-if "n = fixnum-max + 1"
271 (eqv? 0 (quotient fixnum-max (+ fixnum-max 1))))
273 (pass-if "n = fixnum-min"
274 (eqv? 0 (quotient fixnum-max fixnum-min)))
276 (pass-if "n = fixnum-min - 1"
277 (eqv? 0 (quotient fixnum-max (- fixnum-min 1)))))
279 (with-test-prefix "(fixnum-max + 1) / n"
282 (eqv? (+ fixnum-max 1) (quotient (+ fixnum-max 1) 1)))
285 (eqv? (- (+ fixnum-max 1)) (quotient (+ fixnum-max 1) -1)))
288 (eqv? (+ fixnum-max 1) (* (quotient (+ fixnum-max 1) 2) 2)))
290 (pass-if "n = fixnum-max"
291 (eqv? 1 (quotient (+ fixnum-max 1) fixnum-max)))
293 (pass-if "n = fixnum-max + 1"
294 (eqv? 1 (quotient (+ fixnum-max 1) (+ fixnum-max 1))))
296 (pass-if "n = fixnum-min"
297 (eqv? -1 (quotient (+ fixnum-max 1) fixnum-min)))
299 (pass-if "n = fixnum-min - 1"
300 (eqv? 0 (quotient (+ fixnum-max 1) (- fixnum-min 1)))))
302 (with-test-prefix "fixnum-min / n"
305 (eqv? fixnum-min (quotient fixnum-min 1)))
308 (eqv? (- fixnum-min) (quotient fixnum-min -1)))
311 (eqv? fixnum-min (* (quotient fixnum-min 2) 2)))
313 (pass-if "n = fixnum-max"
314 (eqv? -1 (quotient fixnum-min fixnum-max)))
316 (pass-if "n = fixnum-max + 1"
317 (eqv? -1 (quotient fixnum-min (+ fixnum-max 1))))
319 (pass-if "n = fixnum-min"
320 (eqv? 1 (quotient fixnum-min fixnum-min)))
322 (pass-if "n = fixnum-min - 1"
323 (eqv? 0 (quotient fixnum-min (- fixnum-min 1)))))
325 (with-test-prefix "(fixnum-min - 1) / n"
328 (eqv? (- fixnum-min 1) (quotient (- fixnum-min 1) 1)))
331 (eqv? (- (- fixnum-min 1)) (quotient (- fixnum-min 1) -1)))
334 (eqv? fixnum-min (* (quotient (- fixnum-min 1) 2) 2)))
336 (pass-if "n = fixnum-max"
337 (eqv? -1 (quotient (- fixnum-min 1) fixnum-max)))
339 (pass-if "n = fixnum-max + 1"
340 (eqv? -1 (quotient (- fixnum-min 1) (+ fixnum-max 1))))
342 (pass-if "n = fixnum-min"
343 (eqv? 1 (quotient (- fixnum-min 1) fixnum-min)))
345 (pass-if "n = fixnum-min - 1"
346 (eqv? 1 (quotient (- fixnum-min 1) (- fixnum-min 1)))))
348 ;; Positive dividend and divisor
351 (eqv? 5 (quotient 35 7)))
353 ;; Negative dividend, positive divisor
356 (eqv? -5 (quotient -35 7)))
358 ;; Positive dividend, negative divisor
361 (eqv? -5 (quotient 35 -7)))
363 ;; Negative dividend and divisor
366 (eqv? 5 (quotient -35 -7)))
368 ;; Are numerical overflows detected correctly?
370 (with-test-prefix "division by zero"
372 (pass-if-exception "(quotient 1 0)"
373 exception:numerical-overflow
376 (pass-if-exception "(quotient bignum 0)"
377 exception:numerical-overflow
378 (quotient (+ fixnum-max 1) 0)))
380 ;; Are wrong type arguments detected correctly?
388 (with-test-prefix "remainder"
390 (expect-fail "documented?"
391 (documented? remainder))
393 (with-test-prefix "0 / n"
396 (eqv? 0 (remainder 0 1)))
399 (eqv? 0 (remainder 0 -1)))
401 (pass-if "n = fixnum-max"
402 (eqv? 0 (remainder 0 fixnum-max)))
404 (pass-if "n = fixnum-max + 1"
405 (eqv? 0 (remainder 0 (+ fixnum-max 1))))
407 (pass-if "n = fixnum-min"
408 (eqv? 0 (remainder 0 fixnum-min)))
410 (pass-if "n = fixnum-min - 1"
411 (eqv? 0 (remainder 0 (- fixnum-min 1)))))
413 (with-test-prefix "1 / n"
416 (eqv? 0 (remainder 1 1)))
419 (eqv? 0 (remainder 1 -1)))
421 (pass-if "n = fixnum-max"
422 (eqv? 1 (remainder 1 fixnum-max)))
424 (pass-if "n = fixnum-max + 1"
425 (eqv? 1 (remainder 1 (+ fixnum-max 1))))
427 (pass-if "n = fixnum-min"
428 (eqv? 1 (remainder 1 fixnum-min)))
430 (pass-if "n = fixnum-min - 1"
431 (eqv? 1 (remainder 1 (- fixnum-min 1)))))
433 (with-test-prefix "-1 / n"
436 (eqv? 0 (remainder -1 1)))
439 (eqv? 0 (remainder -1 -1)))
441 (pass-if "n = fixnum-max"
442 (eqv? -1 (remainder -1 fixnum-max)))
444 (pass-if "n = fixnum-max + 1"
445 (eqv? -1 (remainder -1 (+ fixnum-max 1))))
447 (pass-if "n = fixnum-min"
448 (eqv? -1 (remainder -1 fixnum-min)))
450 (pass-if "n = fixnum-min - 1"
451 (eqv? -1 (remainder -1 (- fixnum-min 1)))))
453 (with-test-prefix "fixnum-max / n"
456 (eqv? 0 (remainder fixnum-max 1)))
459 (eqv? 0 (remainder fixnum-max -1)))
461 (pass-if "n = fixnum-max"
462 (eqv? 0 (remainder fixnum-max fixnum-max)))
464 (pass-if "n = fixnum-max + 1"
465 (eqv? fixnum-max (remainder fixnum-max (+ fixnum-max 1))))
467 (pass-if "n = fixnum-min"
468 (eqv? fixnum-max (remainder fixnum-max fixnum-min)))
470 (pass-if "n = fixnum-min - 1"
471 (eqv? fixnum-max (remainder fixnum-max (- fixnum-min 1)))))
473 (with-test-prefix "(fixnum-max + 1) / n"
476 (eqv? 0 (remainder (+ fixnum-max 1) 1)))
479 (eqv? 0 (remainder (+ fixnum-max 1) -1)))
481 (pass-if "n = fixnum-max"
482 (eqv? 1 (remainder (+ fixnum-max 1) fixnum-max)))
484 (pass-if "n = fixnum-max + 1"
485 (eqv? 0 (remainder (+ fixnum-max 1) (+ fixnum-max 1))))
487 (pass-if "n = fixnum-min"
488 (eqv? 0 (remainder (+ fixnum-max 1) fixnum-min)))
490 (pass-if "n = fixnum-min - 1"
491 (eqv? (+ fixnum-max 1) (remainder (+ fixnum-max 1) (- fixnum-min 1)))))
493 (with-test-prefix "fixnum-min / n"
496 (eqv? 0 (remainder fixnum-min 1)))
499 (eqv? 0 (remainder fixnum-min -1)))
501 (pass-if "n = fixnum-max"
502 (eqv? -1 (remainder fixnum-min fixnum-max)))
504 (pass-if "n = fixnum-max + 1"
505 (eqv? 0 (remainder fixnum-min (+ fixnum-max 1))))
507 (pass-if "n = fixnum-min"
508 (eqv? 0 (remainder fixnum-min fixnum-min)))
510 (pass-if "n = fixnum-min - 1"
511 (eqv? fixnum-min (remainder fixnum-min (- fixnum-min 1)))))
513 (with-test-prefix "(fixnum-min - 1) / n"
516 (eqv? 0 (remainder (- fixnum-min 1) 1)))
519 (eqv? 0 (remainder (- fixnum-min 1) -1)))
521 (pass-if "n = fixnum-max"
522 (eqv? -2 (remainder (- fixnum-min 1) fixnum-max)))
524 (pass-if "n = fixnum-max + 1"
525 (eqv? -1 (remainder (- fixnum-min 1) (+ fixnum-max 1))))
527 (pass-if "n = fixnum-min"
528 (eqv? -1 (remainder (- fixnum-min 1) fixnum-min)))
530 (pass-if "n = fixnum-min - 1"
531 (eqv? 0 (remainder (- fixnum-min 1) (- fixnum-min 1)))))
533 ;; Positive dividend and divisor
536 (eqv? 0 (remainder 35 7)))
538 ;; Negative dividend, positive divisor
541 (eqv? 0 (remainder -35 7)))
543 ;; Positive dividend, negative divisor
546 (eqv? 0 (remainder 35 -7)))
548 ;; Negative dividend and divisor
551 (eqv? 0 (remainder -35 -7)))
553 ;; Are numerical overflows detected correctly?
555 (with-test-prefix "division by zero"
557 (pass-if-exception "(remainder 1 0)"
558 exception:numerical-overflow
561 (pass-if-exception "(remainder bignum 0)"
562 exception:numerical-overflow
563 (remainder (+ fixnum-max 1) 0)))
565 ;; Are wrong type arguments detected correctly?
573 (with-test-prefix "modulo"
575 (expect-fail "documented?"
576 (documented? modulo))
578 (with-test-prefix "0 % n"
581 (eqv? 0 (modulo 0 1)))
584 (eqv? 0 (modulo 0 -1)))
586 (pass-if "n = fixnum-max"
587 (eqv? 0 (modulo 0 fixnum-max)))
589 (pass-if "n = fixnum-max + 1"
590 (eqv? 0 (modulo 0 (+ fixnum-max 1))))
592 (pass-if "n = fixnum-min"
593 (eqv? 0 (modulo 0 fixnum-min)))
595 (pass-if "n = fixnum-min - 1"
596 (eqv? 0 (modulo 0 (- fixnum-min 1)))))
598 (with-test-prefix "1 % n"
601 (eqv? 0 (modulo 1 1)))
604 (eqv? 0 (modulo 1 -1)))
606 (pass-if "n = fixnum-max"
607 (eqv? 1 (modulo 1 fixnum-max)))
609 (pass-if "n = fixnum-max + 1"
610 (eqv? 1 (modulo 1 (+ fixnum-max 1))))
612 (pass-if "n = fixnum-min"
613 (eqv? (+ fixnum-min 1) (modulo 1 fixnum-min)))
615 (pass-if "n = fixnum-min - 1"
616 (eqv? fixnum-min (modulo 1 (- fixnum-min 1)))))
618 (with-test-prefix "-1 % n"
621 (eqv? 0 (modulo -1 1)))
624 (eqv? 0 (modulo -1 -1)))
626 (pass-if "n = fixnum-max"
627 (eqv? (- fixnum-max 1) (modulo -1 fixnum-max)))
629 (pass-if "n = fixnum-max + 1"
630 (eqv? fixnum-max (modulo -1 (+ fixnum-max 1))))
632 (pass-if "n = fixnum-min"
633 (eqv? -1 (modulo -1 fixnum-min)))
635 (pass-if "n = fixnum-min - 1"
636 (eqv? -1 (modulo -1 (- fixnum-min 1)))))
638 (with-test-prefix "fixnum-max % n"
641 (eqv? 0 (modulo fixnum-max 1)))
644 (eqv? 0 (modulo fixnum-max -1)))
646 (pass-if "n = fixnum-max"
647 (eqv? 0 (modulo fixnum-max fixnum-max)))
649 (pass-if "n = fixnum-max + 1"
650 (eqv? fixnum-max (modulo fixnum-max (+ fixnum-max 1))))
652 (pass-if "n = fixnum-min"
653 (eqv? -1 (modulo fixnum-max fixnum-min)))
655 (pass-if "n = fixnum-min - 1"
656 (eqv? -2 (modulo fixnum-max (- fixnum-min 1)))))
658 (with-test-prefix "(fixnum-max + 1) % n"
661 (eqv? 0 (modulo (+ fixnum-max 1) 1)))
664 (eqv? 0 (modulo (+ fixnum-max 1) -1)))
666 (pass-if "n = fixnum-max"
667 (eqv? 1 (modulo (+ fixnum-max 1) fixnum-max)))
669 (pass-if "n = fixnum-max + 1"
670 (eqv? 0 (modulo (+ fixnum-max 1) (+ fixnum-max 1))))
672 (pass-if "n = fixnum-min"
673 (eqv? 0 (modulo (+ fixnum-max 1) fixnum-min)))
675 (pass-if "n = fixnum-min - 1"
676 (eqv? -1 (modulo (+ fixnum-max 1) (- fixnum-min 1)))))
678 (with-test-prefix "fixnum-min % n"
681 (eqv? 0 (modulo fixnum-min 1)))
684 (eqv? 0 (modulo fixnum-min -1)))
686 (pass-if "n = fixnum-max"
687 (eqv? (- fixnum-max 1) (modulo fixnum-min fixnum-max)))
689 (pass-if "n = fixnum-max + 1"
690 (eqv? 0 (modulo fixnum-min (+ fixnum-max 1))))
692 (pass-if "n = fixnum-min"
693 (eqv? 0 (modulo fixnum-min fixnum-min)))
695 (pass-if "n = fixnum-min - 1"
696 (eqv? fixnum-min (modulo fixnum-min (- fixnum-min 1)))))
698 (with-test-prefix "(fixnum-min - 1) % n"
701 (eqv? 0 (modulo (- fixnum-min 1) 1)))
704 (eqv? 0 (modulo (- fixnum-min 1) -1)))
706 (pass-if "n = fixnum-max"
707 (eqv? (- fixnum-max 2) (modulo (- fixnum-min 1) fixnum-max)))
709 (pass-if "n = fixnum-max + 1"
710 (eqv? fixnum-max (modulo (- fixnum-min 1) (+ fixnum-max 1))))
712 (pass-if "n = fixnum-min"
713 (eqv? -1 (modulo (- fixnum-min 1) fixnum-min)))
715 (pass-if "n = fixnum-min - 1"
716 (eqv? 0 (modulo (- fixnum-min 1) (- fixnum-min 1)))))
718 ;; Positive dividend and divisor
721 (eqv? 1 (modulo 13 4)))
723 (pass-if "2177452800 % 86400"
724 (eqv? 0 (modulo 2177452800 86400)))
726 ;; Negative dividend, positive divisor
729 (eqv? 3 (modulo -13 4)))
731 (pass-if "-2177452800 % 86400"
732 (eqv? 0 (modulo -2177452800 86400)))
734 ;; Positive dividend, negative divisor
737 (eqv? -3 (modulo 13 -4)))
739 (pass-if "2177452800 % -86400"
740 (eqv? 0 (modulo 2177452800 -86400)))
742 ;; Negative dividend and divisor
745 (eqv? -1 (modulo -13 -4)))
747 (pass-if "-2177452800 % -86400"
748 (eqv? 0 (modulo -2177452800 -86400)))
750 ;; Are numerical overflows detected correctly?
752 (with-test-prefix "division by zero"
754 (pass-if-exception "(modulo 1 0)"
755 exception:numerical-overflow
758 (pass-if-exception "(modulo bignum 0)"
759 exception:numerical-overflow
760 (modulo (+ fixnum-max 1) 0)))
762 ;; Are wrong type arguments detected correctly?
770 (with-test-prefix "gcd"
772 (expect-fail "documented?"
775 (with-test-prefix "(0 n)"
786 (pass-if "n = fixnum-max"
787 (eqv? fixnum-max (gcd 0 fixnum-max)))
789 (pass-if "n = fixnum-max + 1"
790 (eqv? (+ fixnum-max 1) (gcd 0 (+ fixnum-max 1))))
792 (pass-if "n = fixnum-min"
793 (eqv? (- fixnum-min) (gcd 0 fixnum-min)))
795 (pass-if "n = fixnum-min - 1"
796 (eqv? (- (- fixnum-min 1)) (gcd 0 (- fixnum-min 1)))))
798 (with-test-prefix "(n 0)"
800 (pass-if "n = 2^128 * fixnum-max"
801 (eqv? (ash fixnum-max 128) (gcd (ash fixnum-max 128) 0))))
803 (with-test-prefix "(1 n)"
814 (pass-if "n = fixnum-max"
815 (eqv? 1 (gcd 1 fixnum-max)))
817 (pass-if "n = fixnum-max + 1"
818 (eqv? 1 (gcd 1 (+ fixnum-max 1))))
820 (pass-if "n = fixnum-min"
821 (eqv? 1 (gcd 1 fixnum-min)))
823 (pass-if "n = fixnum-min - 1"
824 (eqv? 1 (gcd 1 (- fixnum-min 1)))))
826 (with-test-prefix "(-1 n)"
835 (eqv? 1 (gcd -1 -1)))
837 (pass-if "n = fixnum-max"
838 (eqv? 1 (gcd -1 fixnum-max)))
840 (pass-if "n = fixnum-max + 1"
841 (eqv? 1 (gcd -1 (+ fixnum-max 1))))
843 (pass-if "n = fixnum-min"
844 (eqv? 1 (gcd -1 fixnum-min)))
846 (pass-if "n = fixnum-min - 1"
847 (eqv? 1 (gcd -1 (- fixnum-min 1)))))
849 (with-test-prefix "(fixnum-max n)"
852 (eqv? fixnum-max (gcd fixnum-max 0)))
855 (eqv? 1 (gcd fixnum-max 1)))
858 (eqv? 1 (gcd fixnum-max -1)))
860 (pass-if "n = fixnum-max"
861 (eqv? fixnum-max (gcd fixnum-max fixnum-max)))
863 (pass-if "n = fixnum-max + 1"
864 (eqv? 1 (gcd fixnum-max (+ fixnum-max 1))))
866 (pass-if "n = fixnum-min"
867 (eqv? 1 (gcd fixnum-max fixnum-min)))
869 (pass-if "n = fixnum-min - 1"
870 (eqv? 1 (gcd fixnum-max (- fixnum-min 1)))))
872 (with-test-prefix "((+ fixnum-max 1) n)"
875 (eqv? (+ fixnum-max 1) (gcd (+ fixnum-max 1) 0)))
878 (eqv? 1 (gcd (+ fixnum-max 1) 1)))
881 (eqv? 1 (gcd (+ fixnum-max 1) -1)))
883 (pass-if "n = fixnum-max"
884 (eqv? 1 (gcd (+ fixnum-max 1) fixnum-max)))
886 (pass-if "n = fixnum-max + 1"
887 (eqv? (+ fixnum-max 1) (gcd (+ fixnum-max 1) (+ fixnum-max 1))))
889 (pass-if "n = fixnum-min"
890 (eqv? (+ fixnum-max 1) (gcd (+ fixnum-max 1) fixnum-min)))
892 (pass-if "n = fixnum-min - 1"
893 (eqv? 1 (gcd (+ fixnum-max 1) (- fixnum-min 1)))))
895 (with-test-prefix "(fixnum-min n)"
898 (eqv? (- fixnum-min) (gcd fixnum-min 0)))
901 (eqv? 1 (gcd fixnum-min 1)))
904 (eqv? 1 (gcd fixnum-min -1)))
906 (pass-if "n = fixnum-max"
907 (eqv? 1 (gcd fixnum-min fixnum-max)))
909 (pass-if "n = fixnum-max + 1"
910 (eqv? (+ fixnum-max 1) (gcd fixnum-min (+ fixnum-max 1))))
912 (pass-if "n = fixnum-min"
913 (eqv? (- fixnum-min) (gcd fixnum-min fixnum-min)))
915 (pass-if "n = fixnum-min - 1"
916 (eqv? 1 (gcd fixnum-min (- fixnum-min 1)))))
918 (with-test-prefix "((- fixnum-min 1) n)"
921 (eqv? (- (- fixnum-min 1)) (gcd (- fixnum-min 1) 0)))
924 (eqv? 1 (gcd (- fixnum-min 1) 1)))
927 (eqv? 1 (gcd (- fixnum-min 1) -1)))
929 (pass-if "n = fixnum-max"
930 (eqv? 1 (gcd (- fixnum-min 1) fixnum-max)))
932 (pass-if "n = fixnum-max + 1"
933 (eqv? 1 (gcd (- fixnum-min 1) (+ fixnum-max 1))))
935 (pass-if "n = fixnum-min"
936 (eqv? 1 (gcd (- fixnum-min 1) fixnum-min)))
938 (pass-if "n = fixnum-min - 1"
939 (eqv? (- (- fixnum-min 1)) (gcd (- fixnum-min 1) (- fixnum-min 1)))))
941 ;; Are wrong type arguments detected correctly?
949 (with-test-prefix "lcm"
950 ;; FIXME: more tests?
951 ;; (some of these are already in r4rs.test)
952 (expect-fail (documented? lcm))
953 (pass-if (= (lcm) 1))
954 (pass-if (= (lcm 32 -36) 288))
955 (let ((big-n 115792089237316195423570985008687907853269984665640564039457584007913129639936) ; 2 ^ 256
956 (lcm-of-big-n-and-11 1273712981610478149659280835095566986385969831322046204434033424087044426039296))
957 (pass-if (= lcm-of-big-n-and-11 (lcm big-n 11)))
958 (pass-if (= lcm-of-big-n-and-11 (lcm 11 big-n 11)))))
964 (with-test-prefix "number->string"
967 (string->number (number->string n radix) radix))))
969 (pass-if (documented? number->string))
970 (pass-if (string=? (number->string 0) "0"))
971 (pass-if (string=? (number->string 171) "171"))
972 (pass-if (= (+ fixnum-max 1) (num->str->num (+ fixnum-max 1) 10)))
973 (pass-if (= (- fixnum-min 1) (num->str->num (- fixnum-min 1) 10)))
974 (pass-if (= (inf) (num->str->num (inf) 10)))
975 (pass-if (= 1.3 (num->str->num 1.3 10)))))
981 (with-test-prefix "string->number"
983 (pass-if "string->number"
984 (documented? string->number))
986 (pass-if "non number strings"
987 (for-each (lambda (x) (if (string->number x) (throw 'fail)))
988 '("" "q" "1q" "6+7iq" "8+9q" "10+11" "13+" "18@19q" "20@q" "23@"
989 "+25iq" "26i" "-q" "-iq" "i" "5#.0" "8/" "10#11" ".#" "."
990 "#o.2" "3.4q" "15.16e17q" "18.19e+q" ".q" ".17#18" "10q" "#b2"
991 "#b3" "#b4" "#b5" "#b6" "#b7" "#b8" "#b9" "#ba" "#bb" "#bc"
992 "#bd" "#be" "#bf" "#q" "#b#b1" "#o#o1" "#d#d1" "#x#x1" "#e#e1"
996 (pass-if "valid number strings"
997 (for-each (lambda (couple)
1000 (let ((xx (string->number x)))
1001 (if (or (eq? xx #f) (not (eqv? xx y)))
1007 ("#b0" 0) ("#B0" 0) ("#b1" 1) ("#B1" 1) ("#o0" 0) ("#O0" 0)
1008 ("#o1" 1) ("#O1" 1) ("#o2" 2) ("#O2" 2) ("#o3" 3) ("#O3" 3)
1009 ("#o4" 4) ("#O4" 4) ("#o5" 5) ("#O5" 5) ("#o6" 6) ("#O6" 6)
1010 ("#o7" 7) ("#O7" 7) ("#d0" 0) ("#D0" 0) ("#d1" 1) ("#D1" 1)
1011 ("#d2" 2) ("#D2" 2) ("#d3" 3) ("#D3" 3) ("#d4" 4) ("#D4" 4)
1012 ("#d5" 5) ("#D5" 5) ("#d6" 6) ("#D6" 6) ("#d7" 7) ("#D7" 7)
1013 ("#d8" 8) ("#D8" 8) ("#d9" 9) ("#D9" 9)
1014 ("#xa" 10) ("#Xa" 10) ("#xb" 11) ("#Xb" 11)
1015 ("#xc" 12) ("#Xc" 12) ("#xd" 13) ("#Xd" 13)
1016 ("#xe" 14) ("#Xe" 14) ("#xf" 15) ("#Xf" 15)
1018 ("#o12345670" 2739128)
1019 ("#d1234567890" 1234567890)
1020 ("#x1234567890abcdef" 1311768467294899695)
1022 ("#e1" 1) ("#e1.2" 12/10)
1023 ("#i1.1" 1.1) ("#i1" 1.0)
1025 ("1" ,(1+ 0)) ("23" ,(+ 9 9 5)) ("-1" ,(- 0 1))
1026 ("-45" ,(- 0 45)) ("2#" 20.0) ("2##" 200.0) ("12##" 1200.0)
1029 ("1/1" 1) ("1/2" 1/2) ("-1/2" -1/2) ("1#/1" 10.0)
1030 ("10/1#" 1.0) ("1#/1#" 1.0) ("#e9/10" 9/10) ("#e10/1#" 1)
1031 ("#i6/8" 0.75) ("#i1/1" 1.0)
1033 ;; * <uinteger 10> <suffix>
1034 ("1e2" 100.0) ("1E2" 100.0) ("1s2" 100.0) ("1S2" 100.0)
1035 ("1f2" 100.0) ("1F2" 100.0) ("1d2" 100.0) ("1D2" 100.0)
1036 ("1l2" 100.0) ("1L2" 100.0) ("1e+2" 100.0) ("1e-2" 0.01)
1037 ;; * . <digit 10>+ #* <suffix>
1038 (".1" .1) (".0123456789" 123456789e-10) (".16#" 0.16)
1039 (".0123456789e10" 123456789.0) (".16#e3" 160.0) ("#d.3" 0.3)
1040 ;; * <digit 10>+ . <digit 10>* #* <suffix>
1041 ("3." ,(exact->inexact 3)) ("3.e0" ,(exact->inexact 3))
1042 ("3.1" ,(exact->inexact 31/10)) ("3.1e0" 3.1) ("3.1#" 3.1)
1044 ;; * <digit 10>+ #+ . #* <suffix>
1045 ("3#." 30.0) ("3#.e0" 30.0) ("3#.#" 30.0) ("3#.#e0" 30.0)
1047 ("1@0" 1.0) ("1@+0" 1.0) ("1@-0" 1.0)
1048 ("2+3i" ,(+ 2 (* 3 +i))) ("4-5i" ,(- 4 (* 5 +i)))
1049 ("1+i" 1+1i) ("1-i" 1-1i) ("+1i" 0+1i) ("-1i" 0-1i)
1050 ("+i" +1i) ("-i" -1i)))
1053 (pass-if-exception "exponent too big"
1054 exception:out-of-range
1055 (string->number "12.13e141414")))
1061 (with-test-prefix "number?"
1062 (pass-if (documented? number?))
1063 (pass-if (number? 0))
1064 (pass-if (number? 7))
1065 (pass-if (number? -7))
1066 (pass-if (number? 1.3))
1067 (pass-if (number? (+ 1 fixnum-max)))
1068 (pass-if (number? (- 1 fixnum-min)))
1069 (pass-if (number? 3+4i))
1070 (pass-if (not (number? #\a)))
1071 (pass-if (not (number? "a")))
1072 (pass-if (not (number? (make-vector 0))))
1073 (pass-if (not (number? (cons 1 2))))
1074 (pass-if (not (number? #t)))
1075 (pass-if (not (number? (lambda () #t))))
1076 (pass-if (not (number? (current-input-port)))))
1082 (with-test-prefix "complex?"
1083 (pass-if (documented? complex?))
1084 (pass-if (complex? 0))
1085 (pass-if (complex? 7))
1086 (pass-if (complex? -7))
1087 (pass-if (complex? (+ 1 fixnum-max)))
1088 (pass-if (complex? (- 1 fixnum-min)))
1089 (pass-if (complex? 1.3))
1090 (pass-if (complex? 3+4i))
1091 (pass-if (not (complex? #\a)))
1092 (pass-if (not (complex? "a")))
1093 (pass-if (not (complex? (make-vector 0))))
1094 (pass-if (not (complex? (cons 1 2))))
1095 (pass-if (not (complex? #t)))
1096 (pass-if (not (complex? (lambda () #t))))
1097 (pass-if (not (complex? (current-input-port)))))
1103 (with-test-prefix "real?"
1104 (pass-if (documented? real?))
1107 (pass-if (real? -7))
1108 (pass-if (real? (+ 1 fixnum-max)))
1109 (pass-if (real? (- 1 fixnum-min)))
1110 (pass-if (real? 1.3))
1111 (pass-if (not (real? 3+4i)))
1112 (pass-if (not (real? #\a)))
1113 (pass-if (not (real? "a")))
1114 (pass-if (not (real? (make-vector 0))))
1115 (pass-if (not (real? (cons 1 2))))
1116 (pass-if (not (real? #t)))
1117 (pass-if (not (real? (lambda () #t))))
1118 (pass-if (not (real? (current-input-port)))))
1121 ;;; rational? (same as real? right now)
1124 (with-test-prefix "rational?"
1125 (pass-if (documented? rational?))
1126 (pass-if (rational? 0))
1127 (pass-if (rational? 7))
1128 (pass-if (rational? -7))
1129 (pass-if (rational? (+ 1 fixnum-max)))
1130 (pass-if (rational? (- 1 fixnum-min)))
1131 (pass-if (rational? 1.3))
1132 (pass-if (not (rational? 3+4i)))
1133 (pass-if (not (rational? #\a)))
1134 (pass-if (not (rational? "a")))
1135 (pass-if (not (rational? (make-vector 0))))
1136 (pass-if (not (rational? (cons 1 2))))
1137 (pass-if (not (rational? #t)))
1138 (pass-if (not (rational? (lambda () #t))))
1139 (pass-if (not (rational? (current-input-port)))))
1145 (with-test-prefix "integer?"
1146 (pass-if (documented? integer?))
1147 (pass-if (integer? 0))
1148 (pass-if (integer? 7))
1149 (pass-if (integer? -7))
1150 (pass-if (integer? (+ 1 fixnum-max)))
1151 (pass-if (integer? (- 1 fixnum-min)))
1152 (pass-if (and (= 3+0i (round 3+0i)) (integer? 3+0i)))
1153 (pass-if (and (= 1.0 (round 1.0)) (integer? 1.0)))
1154 (pass-if (not (integer? 1.3)))
1155 (pass-if (not (integer? 3+4i)))
1156 (pass-if (not (integer? #\a)))
1157 (pass-if (not (integer? "a")))
1158 (pass-if (not (integer? (make-vector 0))))
1159 (pass-if (not (integer? (cons 1 2))))
1160 (pass-if (not (integer? #t)))
1161 (pass-if (not (integer? (lambda () #t))))
1162 (pass-if (not (integer? (current-input-port)))))
1168 (with-test-prefix "inexact?"
1169 (pass-if (documented? inexact?))
1170 (pass-if (not (inexact? 0)))
1171 (pass-if (not (inexact? 7)))
1172 (pass-if (not (inexact? -7)))
1173 (pass-if (not (inexact? (+ 1 fixnum-max))))
1174 (pass-if (not (inexact? (- 1 fixnum-min))))
1175 (pass-if (inexact? 1.3))
1176 (pass-if (inexact? 3.1+4.2i))
1177 (pass-if-exception "char"
1178 exception:wrong-type-arg
1179 (not (inexact? #\a)))
1180 (pass-if-exception "string"
1181 exception:wrong-type-arg
1182 (not (inexact? "a")))
1183 (pass-if-exception "vector"
1184 exception:wrong-type-arg
1185 (not (inexact? (make-vector 0))))
1186 (pass-if-exception "cons"
1187 exception:wrong-type-arg
1188 (not (inexact? (cons 1 2))))
1189 (pass-if-exception "bool"
1190 exception:wrong-type-arg
1191 (not (inexact? #t)))
1192 (pass-if-exception "procedure"
1193 exception:wrong-type-arg
1194 (not (inexact? (lambda () #t))))
1195 (pass-if-exception "port"
1196 exception:wrong-type-arg
1197 (not (inexact? (current-input-port)))))
1203 (with-test-prefix "equal?"
1204 (pass-if (documented? equal?))
1205 (pass-if (equal? 0 0))
1206 (pass-if (equal? 7 7))
1207 (pass-if (equal? -7 -7))
1208 (pass-if (equal? (+ 1 fixnum-max) (+ 1 fixnum-max)))
1209 (pass-if (equal? (- fixnum-min 1) (- fixnum-min 1)))
1210 (pass-if (not (equal? 0 1)))
1211 (pass-if (not (equal? fixnum-max (+ 1 fixnum-max))))
1212 (pass-if (not (equal? (+ 1 fixnum-max) fixnum-max)))
1213 (pass-if (not (equal? (+ 1 fixnum-max) (+ 2 fixnum-max))))
1214 (pass-if (not (equal? fixnum-min (- fixnum-min 1))))
1215 (pass-if (not (equal? (- fixnum-min 1) fixnum-min)))
1216 (pass-if (not (equal? (- fixnum-min 1) (- fixnum-min 2))))
1217 (pass-if (not (equal? (+ fixnum-max 1) (- fixnum-min 1))))
1219 (pass-if (not (equal? (ash 1 256) +inf.0)))
1220 (pass-if (not (equal? +inf.0 (ash 1 256))))
1221 (pass-if (not (equal? (ash 1 256) -inf.0)))
1222 (pass-if (not (equal? -inf.0 (ash 1 256))))
1224 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating Inf as 2^1024, make
1225 ;; sure we've avoided that
1226 (pass-if (not (equal? (ash 1 1024) +inf.0)))
1227 (pass-if (not (equal? +inf.0 (ash 1 1024))))
1228 (pass-if (not (equal? (- (ash 1 1024)) -inf.0)))
1229 (pass-if (not (equal? -inf.0 (- (ash 1 1024)))))
1231 (pass-if (not (equal? +nan.0 +nan.0)))
1232 (pass-if (not (equal? 0 +nan.0)))
1233 (pass-if (not (equal? +nan.0 0)))
1234 (pass-if (not (equal? 1 +nan.0)))
1235 (pass-if (not (equal? +nan.0 1)))
1236 (pass-if (not (equal? -1 +nan.0)))
1237 (pass-if (not (equal? +nan.0 -1)))
1239 (pass-if (not (equal? (ash 1 256) +nan.0)))
1240 (pass-if (not (equal? +nan.0 (ash 1 256))))
1241 (pass-if (not (equal? (- (ash 1 256)) +nan.0)))
1242 (pass-if (not (equal? +nan.0 (- (ash 1 256)))))
1244 (pass-if (not (equal? (ash 1 8192) +nan.0)))
1245 (pass-if (not (equal? +nan.0 (ash 1 8192))))
1246 (pass-if (not (equal? (- (ash 1 8192)) +nan.0)))
1247 (pass-if (not (equal? +nan.0 (- (ash 1 8192)))))
1249 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating NaN as 3*2^1023, make
1250 ;; sure we've avoided that
1251 (pass-if (not (equal? (ash 3 1023) +nan.0)))
1252 (pass-if (not (equal? +nan.0 (ash 3 1023)))))
1258 (with-test-prefix "="
1259 (expect-fail (documented? =))
1263 (pass-if (= (+ 1 fixnum-max) (+ 1 fixnum-max)))
1264 (pass-if (= (- fixnum-min 1) (- fixnum-min 1)))
1265 (pass-if (not (= 0 1)))
1266 (pass-if (not (= fixnum-max (+ 1 fixnum-max))))
1267 (pass-if (not (= (+ 1 fixnum-max) fixnum-max)))
1268 (pass-if (not (= (+ 1 fixnum-max) (+ 2 fixnum-max))))
1269 (pass-if (not (= fixnum-min (- fixnum-min 1))))
1270 (pass-if (not (= (- fixnum-min 1) fixnum-min)))
1271 (pass-if (not (= (- fixnum-min 1) (- fixnum-min 2))))
1272 (pass-if (not (= (+ fixnum-max 1) (- fixnum-min 1))))
1274 (pass-if (not (= (ash 1 256) +inf.0)))
1275 (pass-if (not (= +inf.0 (ash 1 256))))
1276 (pass-if (not (= (ash 1 256) -inf.0)))
1277 (pass-if (not (= -inf.0 (ash 1 256))))
1279 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating Inf as 2^1024, make
1280 ;; sure we've avoided that
1281 (pass-if (not (= (ash 1 1024) +inf.0)))
1282 (pass-if (not (= +inf.0 (ash 1 1024))))
1283 (pass-if (not (= (- (ash 1 1024)) -inf.0)))
1284 (pass-if (not (= -inf.0 (- (ash 1 1024)))))
1286 (pass-if (not (= +nan.0 +nan.0)))
1287 (pass-if (not (= 0 +nan.0)))
1288 (pass-if (not (= +nan.0 0)))
1289 (pass-if (not (= 1 +nan.0)))
1290 (pass-if (not (= +nan.0 1)))
1291 (pass-if (not (= -1 +nan.0)))
1292 (pass-if (not (= +nan.0 -1)))
1294 (pass-if (not (= (ash 1 256) +nan.0)))
1295 (pass-if (not (= +nan.0 (ash 1 256))))
1296 (pass-if (not (= (- (ash 1 256)) +nan.0)))
1297 (pass-if (not (= +nan.0 (- (ash 1 256)))))
1299 (pass-if (not (= (ash 1 8192) +nan.0)))
1300 (pass-if (not (= +nan.0 (ash 1 8192))))
1301 (pass-if (not (= (- (ash 1 8192)) +nan.0)))
1302 (pass-if (not (= +nan.0 (- (ash 1 8192)))))
1304 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating NaN as 3*2^1023, make
1305 ;; sure we've avoided that
1306 (pass-if (not (= (ash 3 1023) +nan.0)))
1307 (pass-if (not (= +nan.0 (ash 3 1023)))))
1313 (with-test-prefix "<"
1315 (expect-fail "documented?"
1318 (with-test-prefix "(< 0 n)"
1338 (pass-if "n = fixnum-max"
1341 (pass-if "n = fixnum-max + 1"
1342 (< 0 (+ fixnum-max 1)))
1344 (pass-if "n = fixnum-min"
1345 (not (< 0 fixnum-min)))
1347 (pass-if "n = fixnum-min - 1"
1348 (not (< 0 (- fixnum-min 1)))))
1350 (with-test-prefix "(< 0.0 n)"
1370 (pass-if "n = fixnum-max"
1373 (pass-if "n = fixnum-max + 1"
1374 (< 0.0 (+ fixnum-max 1)))
1376 (pass-if "n = fixnum-min"
1377 (not (< 0.0 fixnum-min)))
1379 (pass-if "n = fixnum-min - 1"
1380 (not (< 0.0 (- fixnum-min 1)))))
1382 (with-test-prefix "(< 1 n)"
1402 (pass-if "n = fixnum-max"
1405 (pass-if "n = fixnum-max + 1"
1406 (< 1 (+ fixnum-max 1)))
1408 (pass-if "n = fixnum-min"
1409 (not (< 1 fixnum-min)))
1411 (pass-if "n = fixnum-min - 1"
1412 (not (< 1 (- fixnum-min 1)))))
1414 (with-test-prefix "(< 1.0 n)"
1434 (pass-if "n = fixnum-max"
1437 (pass-if "n = fixnum-max + 1"
1438 (< 1.0 (+ fixnum-max 1)))
1440 (pass-if "n = fixnum-min"
1441 (not (< 1.0 fixnum-min)))
1443 (pass-if "n = fixnum-min - 1"
1444 (not (< 1.0 (- fixnum-min 1)))))
1446 (with-test-prefix "(< -1 n)"
1466 (pass-if "n = fixnum-max"
1469 (pass-if "n = fixnum-max + 1"
1470 (< -1 (+ fixnum-max 1)))
1472 (pass-if "n = fixnum-min"
1473 (not (< -1 fixnum-min)))
1475 (pass-if "n = fixnum-min - 1"
1476 (not (< -1 (- fixnum-min 1)))))
1478 (with-test-prefix "(< -1.0 n)"
1496 (not (< -1.0 -1.0)))
1498 (pass-if "n = fixnum-max"
1499 (< -1.0 fixnum-max))
1501 (pass-if "n = fixnum-max + 1"
1502 (< -1.0 (+ fixnum-max 1)))
1504 (pass-if "n = fixnum-min"
1505 (not (< -1.0 fixnum-min)))
1507 (pass-if "n = fixnum-min - 1"
1508 (not (< -1.0 (- fixnum-min 1)))))
1510 (with-test-prefix "(< fixnum-max n)"
1513 (not (< fixnum-max 0)))
1516 (not (< fixnum-max 0.0)))
1519 (not (< fixnum-max 1)))
1522 (not (< fixnum-max 1.0)))
1525 (not (< fixnum-max -1)))
1528 (not (< fixnum-max -1.0)))
1530 (pass-if "n = fixnum-max"
1531 (not (< fixnum-max fixnum-max)))
1533 (pass-if "n = fixnum-max + 1"
1534 (< fixnum-max (+ fixnum-max 1)))
1536 (pass-if "n = fixnum-min"
1537 (not (< fixnum-max fixnum-min)))
1539 (pass-if "n = fixnum-min - 1"
1540 (not (< fixnum-max (- fixnum-min 1)))))
1542 (with-test-prefix "(< (+ fixnum-max 1) n)"
1545 (not (< (+ fixnum-max 1) 0)))
1548 (not (< (+ fixnum-max 1) 0.0)))
1551 (not (< (+ fixnum-max 1) 1)))
1554 (not (< (+ fixnum-max 1) 1.0)))
1557 (not (< (+ fixnum-max 1) -1)))
1560 (not (< (+ fixnum-max 1) -1.0)))
1562 (pass-if "n = fixnum-max"
1563 (not (< (+ fixnum-max 1) fixnum-max)))
1565 (pass-if "n = fixnum-max + 1"
1566 (not (< (+ fixnum-max 1) (+ fixnum-max 1))))
1568 (pass-if "n = fixnum-min"
1569 (not (< (+ fixnum-max 1) fixnum-min)))
1571 (pass-if "n = fixnum-min - 1"
1572 (not (< (+ fixnum-max 1) (- fixnum-min 1)))))
1574 (with-test-prefix "(< fixnum-min n)"
1592 (< fixnum-min -1.0))
1594 (pass-if "n = fixnum-max"
1595 (< fixnum-min fixnum-max))
1597 (pass-if "n = fixnum-max + 1"
1598 (< fixnum-min (+ fixnum-max 1)))
1600 (pass-if "n = fixnum-min"
1601 (not (< fixnum-min fixnum-min)))
1603 (pass-if "n = fixnum-min - 1"
1604 (not (< fixnum-min (- fixnum-min 1)))))
1606 (with-test-prefix "(< (- fixnum-min 1) n)"
1609 (< (- fixnum-min 1) 0))
1612 (< (- fixnum-min 1) 0.0))
1615 (< (- fixnum-min 1) 1))
1618 (< (- fixnum-min 1) 1.0))
1621 (< (- fixnum-min 1) -1))
1624 (< (- fixnum-min 1) -1.0))
1626 (pass-if "n = fixnum-max"
1627 (< (- fixnum-min 1) fixnum-max))
1629 (pass-if "n = fixnum-max + 1"
1630 (< (- fixnum-min 1) (+ fixnum-max 1)))
1632 (pass-if "n = fixnum-min"
1633 (< (- fixnum-min 1) fixnum-min))
1635 (pass-if "n = fixnum-min - 1"
1636 (not (< (- fixnum-min 1) (- fixnum-min 1)))))
1638 (pass-if (< (ash 1 256) +inf.0))
1639 (pass-if (not (< +inf.0 (ash 1 256))))
1640 (pass-if (not (< (ash 1 256) -inf.0)))
1641 (pass-if (< -inf.0 (ash 1 256)))
1643 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating Inf as 2^1024, make
1644 ;; sure we've avoided that
1645 (pass-if (< (1- (ash 1 1024)) +inf.0))
1646 (pass-if (< (ash 1 1024) +inf.0))
1647 (pass-if (< (1+ (ash 1 1024)) +inf.0))
1648 (pass-if (not (< +inf.0 (1- (ash 1 1024)))))
1649 (pass-if (not (< +inf.0 (ash 1 1024))))
1650 (pass-if (not (< +inf.0 (1+ (ash 1 1024)))))
1651 (pass-if (< -inf.0 (- (1- (ash 1 1024)))))
1652 (pass-if (< -inf.0 (- (ash 1 1024))))
1653 (pass-if (< -inf.0 (- (1+ (ash 1 1024)))))
1654 (pass-if (not (< (- (1- (ash 1 1024))) -inf.0)))
1655 (pass-if (not (< (- (ash 1 1024)) -inf.0)))
1656 (pass-if (not (< (- (1+ (ash 1 1024))) -inf.0)))
1658 (pass-if (not (< +nan.0 +nan.0)))
1659 (pass-if (not (< 0 +nan.0)))
1660 (pass-if (not (< +nan.0 0)))
1661 (pass-if (not (< 1 +nan.0)))
1662 (pass-if (not (< +nan.0 1)))
1663 (pass-if (not (< -1 +nan.0)))
1664 (pass-if (not (< +nan.0 -1)))
1666 (pass-if (not (< (ash 1 256) +nan.0)))
1667 (pass-if (not (< +nan.0 (ash 1 256))))
1668 (pass-if (not (< (- (ash 1 256)) +nan.0)))
1669 (pass-if (not (< +nan.0 (- (ash 1 256)))))
1671 (pass-if (not (< (ash 1 8192) +nan.0)))
1672 (pass-if (not (< +nan.0 (ash 1 8192))))
1673 (pass-if (not (< (- (ash 1 8192)) +nan.0)))
1674 (pass-if (not (< +nan.0 (- (ash 1 8192)))))
1676 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating NaN as 3*2^1023, make
1677 ;; sure we've avoided that
1678 (pass-if (not (< (ash 3 1023) +nan.0)))
1679 (pass-if (not (< (1+ (ash 3 1023)) +nan.0)))
1680 (pass-if (not (< (1- (ash 3 1023)) +nan.0)))
1681 (pass-if (not (< +nan.0 (ash 3 1023))))
1682 (pass-if (not (< +nan.0 (1+ (ash 3 1023)))))
1683 (pass-if (not (< +nan.0 (1- (ash 3 1023))))))
1689 ;; currently not tested -- implementation is trivial
1690 ;; (> x y) is implemented as (< y x)
1691 ;; FIXME: tests should probably be added in case we change implementation.
1697 ;; currently not tested -- implementation is trivial
1698 ;; (<= x y) is implemented as (not (< y x))
1699 ;; FIXME: tests should probably be added in case we change implementation.
1705 ;; currently not tested -- implementation is trivial
1706 ;; (>= x y) is implemented as (not (< x y))
1707 ;; FIXME: tests should probably be added in case we change implementation.
1713 (with-test-prefix "zero?"
1714 (expect-fail (documented? zero?))
1716 (pass-if (not (zero? 7)))
1717 (pass-if (not (zero? -7)))
1718 (pass-if (not (zero? (+ 1 fixnum-max))))
1719 (pass-if (not (zero? (- 1 fixnum-min))))
1720 (pass-if (not (zero? 1.3)))
1721 (pass-if (not (zero? 3.1+4.2i))))
1727 (with-test-prefix "positive?"
1728 (expect-fail (documented? positive?))
1729 (pass-if (positive? 1))
1730 (pass-if (positive? (+ fixnum-max 1)))
1731 (pass-if (positive? 1.3))
1732 (pass-if (not (positive? 0)))
1733 (pass-if (not (positive? -1)))
1734 (pass-if (not (positive? (- fixnum-min 1))))
1735 (pass-if (not (positive? -1.3))))
1741 (with-test-prefix "negative?"
1742 (expect-fail (documented? negative?))
1743 (pass-if (not (negative? 1)))
1744 (pass-if (not (negative? (+ fixnum-max 1))))
1745 (pass-if (not (negative? 1.3)))
1746 (pass-if (not (negative? 0)))
1747 (pass-if (negative? -1))
1748 (pass-if (negative? (- fixnum-min 1)))
1749 (pass-if (negative? -1.3)))
1755 (with-test-prefix "max"
1756 (pass-if (= 456.0 (max 123.0 456.0)))
1757 (pass-if (= 456.0 (max 456.0 123.0)))
1759 (let ((big*2 (* fixnum-max 2))
1760 (big*3 (* fixnum-max 3))
1761 (big*4 (* fixnum-max 4))
1762 (big*5 (* fixnum-max 5)))
1764 (pass-if (= +inf.0 (max big*5 +inf.0)))
1765 (pass-if (= +inf.0 (max +inf.0 big*5)))
1766 (pass-if (= big*5 (max big*5 -inf.0)))
1767 (pass-if (= big*5 (max -inf.0 big*5)))
1769 (pass-if (nan? (max 123 +nan.0)))
1770 (pass-if (nan? (max big*5 +nan.0)))
1771 (pass-if (nan? (max 123.0 +nan.0)))
1772 (pass-if (nan? (max +nan.0 123)))
1773 (pass-if (nan? (max +nan.0 big*5)))
1774 (pass-if (nan? (max +nan.0 123.0)))
1775 (pass-if (nan? (max +nan.0 +nan.0))))
1777 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating Inf as 2^1024, make
1778 ;; sure we've avoided that
1779 (for-each (lambda (b)
1780 (pass-if (list b +inf.0)
1781 (= +inf.0 (max b +inf.0)))
1782 (pass-if (list +inf.0 b)
1783 (= +inf.0 (max b +inf.0)))
1784 (pass-if (list b -inf.0)
1785 (= b (max b -inf.0)))
1786 (pass-if (list -inf.0 b)
1787 (= b (max b -inf.0))))
1788 (list (1- (ash 1 1024))
1791 (- (1- (ash 1 1024)))
1793 (- (1+ (ash 1 1024)))))
1795 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating NaN as 3*2^1023, make
1796 ;; sure we've avoided that
1797 (pass-if (nan? (max (ash 1 2048) +nan.0)))
1798 (pass-if (nan? (max +nan.0 (ash 1 2048)))))
1804 ;; FIXME: unfinished...
1806 (with-test-prefix "min"
1807 (pass-if (= 123.0 (min 123.0 456.0)))
1808 (pass-if (= 123.0 (min 456.0 123.0)))
1810 (let ((big*2 (* fixnum-max 2))
1811 (big*3 (* fixnum-max 3))
1812 (big*4 (* fixnum-max 4))
1813 (big*5 (* fixnum-max 5)))
1815 (expect-fail (documented? max))
1816 (pass-if (= 1 (min 7 3 1 5)))
1817 (pass-if (= 1 (min 1 7 3 5)))
1818 (pass-if (= 1 (min 7 3 5 1)))
1819 (pass-if (= -7 (min 2 3 4 -2 5 -7 1 -1 4 2)))
1820 (pass-if (= -7 (min -7 2 3 4 -2 5 1 -1 4 2)))
1821 (pass-if (= -7 (min 2 3 4 -2 5 1 -1 4 2 -7)))
1822 (pass-if (= big*2 (min big*3 big*5 big*2 big*4)))
1823 (pass-if (= big*2 (min big*2 big*3 big*5 big*4)))
1824 (pass-if (= big*2 (min big*3 big*5 big*4 big*2)))
1826 (= (- fixnum-min 1) (min 2 4 (- fixnum-min 1) 3 (* 2 fixnum-max))))
1828 (= (- fixnum-min 1) (min (- fixnum-min 1) 2 4 3 (* 2 fixnum-max))))
1830 (= (- fixnum-min 1) (min 2 4 3 (* 2 fixnum-max) (- fixnum-min 1))))
1832 (pass-if (= big*5 (min big*5 +inf.0)))
1833 (pass-if (= big*5 (min +inf.0 big*5)))
1834 (pass-if (= -inf.0 (min big*5 -inf.0)))
1835 (pass-if (= -inf.0 (min -inf.0 big*5)))
1837 (pass-if (nan? (min 123 +nan.0)))
1838 (pass-if (nan? (min big*5 +nan.0)))
1839 (pass-if (nan? (min 123.0 +nan.0)))
1840 (pass-if (nan? (min +nan.0 123)))
1841 (pass-if (nan? (min +nan.0 big*5)))
1842 (pass-if (nan? (min +nan.0 123.0)))
1843 (pass-if (nan? (min +nan.0 +nan.0))))
1845 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating Inf as 2^1024, make
1846 ;; sure we've avoided that
1847 (for-each (lambda (b)
1848 (pass-if (list b +inf.0)
1849 (= b (min b +inf.0)))
1850 (pass-if (list +inf.0 b)
1851 (= b (min b +inf.0)))
1852 (pass-if (list b -inf.0)
1853 (= -inf.0 (min b -inf.0)))
1854 (pass-if (list -inf.0 b)
1855 (= -inf.0 (min b -inf.0))))
1856 (list (1- (ash 1 1024))
1859 (- (1- (ash 1 1024)))
1861 (- (1+ (ash 1 1024)))))
1863 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating NaN as 3*2^1023, make
1864 ;; sure we've avoided that
1865 (pass-if (nan? (min (- (ash 1 2048)) (- +nan.0))))
1866 (pass-if (nan? (min (- +nan.0) (- (ash 1 2048))))))
1872 (with-test-prefix "+"
1874 (expect-fail "documented?"
1877 (with-test-prefix "wrong type argument"
1879 (pass-if-exception "1st argument string"
1880 exception:wrong-type-arg
1883 (pass-if-exception "2nd argument bool"
1884 exception:wrong-type-arg
1890 (with-test-prefix "-"
1892 (pass-if "-inum - +bignum"
1893 (= #x-100000000000000000000000000000001
1894 (- -1 #x100000000000000000000000000000000)))
1896 (pass-if "big - inum"
1897 (= #xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
1898 (- #x100000000000000000000000000000000 1)))
1900 (pass-if "big - -inum"
1901 (= #x100000000000000000000000000000001
1902 (- #x100000000000000000000000000000000 -1))))
1908 (with-test-prefix "*"
1910 (pass-if "complex * bignum"
1911 (let ((big (ash 1 90)))
1912 (= (make-rectangular big big)
1919 (with-test-prefix "/"
1921 (expect-fail "documented?"
1924 (with-test-prefix "division by zero"
1926 (pass-if-exception "(/ 0)"
1927 exception:numerical-overflow
1933 (pass-if-exception "(/ 1 0)"
1934 exception:numerical-overflow
1937 (pass-if "(/ 1 0.0)"
1938 (= +inf.0 (/ 1 0.0)))
1940 (pass-if-exception "(/ bignum 0)"
1941 exception:numerical-overflow
1942 (/ (+ fixnum-max 1) 0))
1944 (pass-if "(/ bignum 0.0)"
1945 (= +inf.0 (/ (+ fixnum-max 1) 0.0)))
1947 (pass-if-exception "(/ 1.0 0)"
1948 exception:numerical-overflow
1951 (pass-if "(/ 1.0 0.0)"
1952 (= +inf.0 (/ 1.0 0.0)))
1954 (pass-if-exception "(/ +i 0)"
1955 exception:numerical-overflow
1958 (pass-if "(/ +i 0.0)"
1959 (= +inf.0 (imag-part (/ +i 0.0)))))
1961 (with-test-prefix "complex division"
1964 (= (/ 3+4i) 0.12-0.16i))
1967 (= (/ 4+3i) 0.16-0.12i))
1969 (pass-if "(/ 25+125i 3+4i)"
1970 (= (/ 25+125i 3+4i) 23.0+11.0i))
1972 (pass-if "(/ 25+125i 4+3i)"
1973 (= (/ 25+125i 4+3i) 19.0+17.0i))
1975 (pass-if "(/ 25 3+4i)"
1976 (= (/ 25 3+4i) 3.0-4.0i))
1978 (pass-if "(/ 25 4+3i)"
1979 (= (/ 25 4+3i) 4.0-3.0i))
1981 (pass-if "(/ 1e200+1e200i)"
1982 (= (/ 1e200+1e200i) 5.0e-201-5.0e-201i))))
1988 (with-test-prefix "truncate"
1989 (pass-if (= 1 (truncate 1.75)))
1990 (pass-if (= 1 (truncate 1.5)))
1991 (pass-if (= 1 (truncate 1.25)))
1992 (pass-if (= 0 (truncate 0.75)))
1993 (pass-if (= 0 (truncate 0.5)))
1994 (pass-if (= 0 (truncate 0.0)))
1995 (pass-if (= 0 (truncate -0.5)))
1996 (pass-if (= -1 (truncate -1.25)))
1997 (pass-if (= -1 (truncate -1.5))))
2003 (with-test-prefix "round"
2004 (pass-if (= 2 (round 1.75)))
2005 (pass-if (= 2 (round 1.5)))
2006 (pass-if (= 1 (round 1.25)))
2007 (pass-if (= 1 (round 0.75)))
2008 (pass-if (= 0 (round 0.5)))
2009 (pass-if (= 0 (round 0.0)))
2010 (pass-if (= 0 (round -0.5)))
2011 (pass-if (= -1 (round -1.25)))
2012 (pass-if (= -2 (round -1.5))))
2018 (with-test-prefix "exact->inexact"
2020 ;; Test "(exact->inexact n)", expect "want".
2021 ;; "i" is a index, for diagnostic purposes.
2022 (define (try-i i n want)
2023 (with-test-prefix (list i n want)
2024 (with-test-prefix "pos"
2025 (let ((got (exact->inexact n)))
2026 (pass-if "inexact?" (inexact? got))
2027 (pass-if (list "=" got) (= want got))))
2029 (set! want (- want))
2030 (with-test-prefix "neg"
2031 (let ((got (exact->inexact n)))
2032 (pass-if "inexact?" (inexact? got))
2033 (pass-if (list "=" got) (= want got))))))
2035 (with-test-prefix "2^i, no round"
2038 (want 1.0 (* 2.0 want)))
2042 (with-test-prefix "2^i+1, no round"
2045 (want 3.0 (- (* 2.0 want) 1.0)))
2046 ((>= i dbl-mant-dig))
2049 (with-test-prefix "(2^i+1)*2^100, no round"
2052 (want 3.0 (- (* 2.0 want) 1.0)))
2053 ((>= i dbl-mant-dig))
2054 (try-i i (ash n 100) (ash-flo want 100))))
2056 ;; bit pattern: 1111....11100.00
2059 (with-test-prefix "mantdig ones then zeros, no rounding"
2061 (n (- (ash 1 dbl-mant-dig) 1) (* 2 n))
2062 (want (- (ash-flo 1.0 dbl-mant-dig) 1.0) (* 2.0 want)))
2066 ;; bit pattern: 1111....111011..1
2067 ;; <-mantdig-> <-i->
2068 ;; This sort of value was incorrectly rounded upwards in Guile 1.6.4 when
2069 ;; i >= 11 (that's when the total is 65 or more bits).
2071 (with-test-prefix "mantdig ones then 011..11, round down"
2073 (n (- (ash 1 (+ 1 dbl-mant-dig)) 2) (+ 1 (* 2 n)))
2074 (want (- (ash-flo 1.0 (+ 1 dbl-mant-dig)) 2.0) (* 2.0 want)))
2078 ;; bit pattern: 1111....111100..001
2079 ;; <-mantdig-> <--i->
2081 (with-test-prefix "mantdig ones then 100..001, round up"
2083 (n (- (ash 1 (+ 2 dbl-mant-dig)) 1) (1- (* 2 n)))
2084 (want (ash-flo 1.0 (+ 2 dbl-mant-dig)) (* 2.0 want)))
2088 ;; bit pattern: 1000....000100..001
2089 ;; <-mantdig-> <--i->
2091 (with-test-prefix "2^mantdig then 100..001, round up"
2093 (n (- (ash 1 (+ 2 dbl-mant-dig)) 1) (1- (* 2 n)))
2094 (want (+ (ash-flo 1.0 (+ 2 dbl-mant-dig)) 4.0) (* 2.0 want)))
2110 (with-test-prefix "expt"
2111 (pass-if "(= 1 (expt 0 0))" (= 1 (expt 0 0)))
2112 (pass-if "(= 1 (expt 0 0.0))" (= 1 (expt 0 0.0)))
2113 (pass-if "(= 1 (expt 0.0 0))" (= 1 (expt 0.0 0)))
2114 (pass-if "(= 1 (expt 0.0 0.0))" (= 1 (expt 0.0 0.0))))
2120 (with-test-prefix "asinh"
2121 (pass-if (= 0 (asinh 0))))
2127 (with-test-prefix "acosh"
2128 (pass-if (= 0 (acosh 1))))
2134 (with-test-prefix "atanh"
2135 (pass-if (= 0 (atanh 0))))
2138 ;;; make-rectangular
2145 (with-test-prefix "make-polar"
2146 (define pi 3.14159265358979323846)
2147 (define (almost= x y)
2148 (> 0.01 (magnitude (- x y))))
2150 (pass-if (= 0 (make-polar 0 0)))
2151 (pass-if (= 0 (make-polar 0 123.456)))
2152 (pass-if (= 1 (make-polar 1 0)))
2153 (pass-if (= -1 (make-polar -1 0)))
2155 (pass-if (almost= 0+i (make-polar 1 (* 0.5 pi))))
2156 (pass-if (almost= -1 (make-polar 1 (* 1.0 pi))))
2157 (pass-if (almost= 0-i (make-polar 1 (* 1.5 pi))))
2158 (pass-if (almost= 1 (make-polar 1 (* 2.0 pi)))))
2172 (with-test-prefix "magnitude"
2173 (pass-if (= 0 (magnitude 0)))
2174 (pass-if (= 1 (magnitude 1)))
2175 (pass-if (= 1 (magnitude -1)))
2176 (pass-if (= 1 (magnitude 0+i)))
2177 (pass-if (= 1 (magnitude 0-i)))
2178 (pass-if (= 5 (magnitude 3+4i)))
2179 (pass-if (= 5 (magnitude 3-4i)))
2180 (pass-if (= 5 (magnitude -3+4i)))
2181 (pass-if (= 5 (magnitude -3-4i))))
2187 (with-test-prefix "angle"
2188 (define pi 3.14159265358979323846)
2189 (define (almost= x y)
2190 (> 0.01 (magnitude (- x y))))
2192 (pass-if "inum +ve" (= 0 (angle 1)))
2193 (pass-if "inum -ve" (almost= pi (angle -1)))
2195 (pass-if "bignum +ve" (= 0 (angle (1+ fixnum-max))))
2196 (pass-if "bignum -ve" (almost= pi (angle (1- fixnum-min))))
2198 (pass-if "flonum +ve" (= 0 (angle 1.5)))
2199 (pass-if "flonum -ve" (almost= pi (angle -1.5))))
2205 (with-test-prefix "inexact->exact"
2207 (pass-if-exception "+inf" exception:out-of-range
2208 (inexact->exact +inf.0))
2210 (pass-if-exception "-inf" exception:out-of-range
2211 (inexact->exact -inf.0))
2213 (pass-if-exception "nan" exception:out-of-range
2214 (inexact->exact +nan.0))
2216 (with-test-prefix "2.0**i to exact and back"
2221 (= n (inexact->exact (exact->inexact n)))))))
2227 (with-test-prefix "integer-length"
2229 (with-test-prefix "-2^i, ...11100..00"
2230 (do ((n -1 (ash n 1))
2233 (pass-if (list n "expect" i)
2234 (= i (integer-length n)))))
2236 (with-test-prefix "-2^i+1 ...11100..01"
2237 (do ((n -3 (logxor 3 (ash n 1)))
2241 (= i (integer-length n)))))
2243 (with-test-prefix "-2^i-1 ...111011..11"
2244 (do ((n -2 (1+ (ash n 1)))
2248 (= i (integer-length n))))))
2254 (with-test-prefix "logcount"
2256 (with-test-prefix "-2^i, meaning ...11100..00"
2257 (do ((n -1 (ash n 1))
2261 (= i (logcount n)))))
2263 (with-test-prefix "2^i"
2264 (do ((n 1 (ash n 1))
2268 (= 1 (logcount n)))))
2270 (with-test-prefix "2^i-1"
2271 (do ((n 0 (1+ (ash n 1)))
2275 (= i (logcount n))))))
2281 (with-test-prefix "lognot"
2282 (pass-if (= -1 (lognot 0)))
2283 (pass-if (= 0 (lognot -1)))
2284 (pass-if (= -2 (lognot 1)))
2285 (pass-if (= 1 (lognot -2)))
2287 (pass-if (= #x-100000000000000000000000000000000
2288 (lognot #xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)))
2289 (pass-if (= #xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
2290 (lognot #x-100000000000000000000000000000000))))