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 (use-modules (ice-9 documentation))
24 (define exception:numerical-overflow
25 (cons 'numerical-overflow "^Numerical overflow"))
27 (define (documented? object)
28 (not (not (object-documentation object))))
31 (inexact->exact (+ (/ (log (+ most-positive-fixnum 1)) (log 2)) 1)))
33 (define fixnum-min most-negative-fixnum)
34 (define fixnum-max most-positive-fixnum)
40 (with-test-prefix "exact?"
42 (pass-if "documented?"
45 (with-test-prefix "integers"
53 (pass-if "fixnum-max + 1"
54 (exact? (+ fixnum-max 1)))
59 (pass-if "fixnum-min - 1"
60 (exact? (- fixnum-min 1))))
62 (with-test-prefix "reals"
64 ;; (FIXME: need better examples.)
66 (pass-if "sqrt (fixnum-max^2 - 1)"
67 (eq? #f (exact? (sqrt (- (expt fixnum-max 2) 1)))))
69 (pass-if "sqrt ((fixnum-max+1)^2 - 1)"
70 (eq? #f (exact? (sqrt (- (expt (+ fixnum-max 1) 2) 1)))))))
76 (with-test-prefix "odd?"
77 (pass-if (documented? odd?))
80 (expect-fail (odd? 0))
81 (expect-fail (odd? 2))
82 (expect-fail (odd? -2))
83 (pass-if (odd? (+ (* 2 fixnum-max) 1)))
84 (expect-fail (odd? (* 2 fixnum-max)))
85 (pass-if (odd? (- (* 2 fixnum-min) 1)))
86 (expect-fail (odd? (* 2 fixnum-min))))
92 (with-test-prefix "even?"
93 (pass-if (documented? even?))
97 (expect-fail (even? 1))
98 (expect-fail (even? -1))
99 (expect-fail (even? (+ (* 2 fixnum-max) 1)))
100 (pass-if (even? (* 2 fixnum-max)))
101 (expect-fail (even? (- (* 2 fixnum-min) 1)))
102 (pass-if (even? (* 2 fixnum-min))))
108 (with-test-prefix "inf?"
109 (pass-if (documented? inf?))
110 (pass-if (inf? (inf)))
111 ;; FIXME: what are the expected behaviors?
112 ;; (pass-if (inf? (/ 1.0 0.0))
113 ;; (pass-if (inf? (/ 1 0.0))
114 (expect-fail (inf? 0))
115 (expect-fail (inf? 42.0))
116 (expect-fail (inf? (+ fixnum-max 1)))
117 (expect-fail (inf? (- fixnum-min 1))))
123 (with-test-prefix "nan?"
124 (pass-if (documented? nan?))
125 (pass-if (nan? (nan)))
126 ;; FIXME: other ways we should be able to generate NaN?
127 (expect-fail (nan? 0))
128 (expect-fail (nan? 42.0))
129 (expect-fail (nan? (+ fixnum-max 1)))
130 (expect-fail (nan? (- fixnum-min 1))))
136 (with-test-prefix "abs"
137 (pass-if (documented? abs))
138 (pass-if (zero? (abs 0)))
139 (pass-if (= 1 (abs 1)))
140 (pass-if (= 1 (abs -1)))
141 (pass-if (= (+ fixnum-max 1) (abs (+ fixnum-max 1))))
142 (pass-if (= (+ (- fixnum-min) 1) (abs (- fixnum-min 1))))
143 (pass-if (positive? (abs 1.0)))
144 (pass-if (positive? (abs -1.0))))
150 (with-test-prefix "quotient"
152 (expect-fail "documented?"
153 (documented? quotient))
155 (with-test-prefix "0 / n"
158 (eqv? 0 (quotient 0 1)))
161 (eqv? 0 (quotient 0 -1)))
164 (eqv? 0 (quotient 0 2)))
166 (pass-if "n = fixnum-max"
167 (eqv? 0 (quotient 0 fixnum-max)))
169 (pass-if "n = fixnum-max + 1"
170 (eqv? 0 (quotient 0 (+ fixnum-max 1))))
172 (pass-if "n = fixnum-min"
173 (eqv? 0 (quotient 0 fixnum-min)))
175 (pass-if "n = fixnum-min - 1"
176 (eqv? 0 (quotient 0 (- fixnum-min 1)))))
178 (with-test-prefix "1 / n"
181 (eqv? 1 (quotient 1 1)))
184 (eqv? -1 (quotient 1 -1)))
187 (eqv? 0 (quotient 1 2)))
189 (pass-if "n = fixnum-max"
190 (eqv? 0 (quotient 1 fixnum-max)))
192 (pass-if "n = fixnum-max + 1"
193 (eqv? 0 (quotient 1 (+ fixnum-max 1))))
195 (pass-if "n = fixnum-min"
196 (eqv? 0 (quotient 1 fixnum-min)))
198 (pass-if "n = fixnum-min - 1"
199 (eqv? 0 (quotient 1 (- fixnum-min 1)))))
201 (with-test-prefix "-1 / n"
204 (eqv? -1 (quotient -1 1)))
207 (eqv? 1 (quotient -1 -1)))
210 (eqv? 0 (quotient -1 2)))
212 (pass-if "n = fixnum-max"
213 (eqv? 0 (quotient -1 fixnum-max)))
215 (pass-if "n = fixnum-max + 1"
216 (eqv? 0 (quotient -1 (+ fixnum-max 1))))
218 (pass-if "n = fixnum-min"
219 (eqv? 0 (quotient -1 fixnum-min)))
221 (pass-if "n = fixnum-min - 1"
222 (eqv? 0 (quotient -1 (- fixnum-min 1)))))
224 (with-test-prefix "fixnum-max / n"
227 (eqv? fixnum-max (quotient fixnum-max 1)))
230 (eqv? (- fixnum-max) (quotient fixnum-max -1)))
233 (eqv? fixnum-max (+ (* (quotient fixnum-max 2) 2) 1)))
235 (pass-if "n = fixnum-max"
236 (eqv? 1 (quotient fixnum-max fixnum-max)))
238 (pass-if "n = fixnum-max + 1"
239 (eqv? 0 (quotient fixnum-max (+ fixnum-max 1))))
241 (pass-if "n = fixnum-min"
242 (eqv? 0 (quotient fixnum-max fixnum-min)))
244 (pass-if "n = fixnum-min - 1"
245 (eqv? 0 (quotient fixnum-max (- fixnum-min 1)))))
247 (with-test-prefix "(fixnum-max + 1) / n"
250 (eqv? (+ fixnum-max 1) (quotient (+ fixnum-max 1) 1)))
253 (eqv? (- (+ fixnum-max 1)) (quotient (+ fixnum-max 1) -1)))
256 (eqv? (+ fixnum-max 1) (* (quotient (+ fixnum-max 1) 2) 2)))
258 (pass-if "n = fixnum-max"
259 (eqv? 1 (quotient (+ fixnum-max 1) fixnum-max)))
261 (pass-if "n = fixnum-max + 1"
262 (eqv? 1 (quotient (+ fixnum-max 1) (+ fixnum-max 1))))
264 (pass-if "n = fixnum-min"
265 (eqv? -1 (quotient (+ fixnum-max 1) fixnum-min)))
267 (pass-if "n = fixnum-min - 1"
268 (eqv? 0 (quotient (+ fixnum-max 1) (- fixnum-min 1)))))
270 (with-test-prefix "fixnum-min / n"
273 (eqv? fixnum-min (quotient fixnum-min 1)))
276 (eqv? (- fixnum-min) (quotient fixnum-min -1)))
279 (eqv? fixnum-min (* (quotient fixnum-min 2) 2)))
281 (pass-if "n = fixnum-max"
282 (eqv? -1 (quotient fixnum-min fixnum-max)))
284 (pass-if "n = fixnum-max + 1"
285 (eqv? -1 (quotient fixnum-min (+ fixnum-max 1))))
287 (pass-if "n = fixnum-min"
288 (eqv? 1 (quotient fixnum-min fixnum-min)))
290 (pass-if "n = fixnum-min - 1"
291 (eqv? 0 (quotient fixnum-min (- fixnum-min 1)))))
293 (with-test-prefix "(fixnum-min - 1) / n"
296 (eqv? (- fixnum-min 1) (quotient (- fixnum-min 1) 1)))
299 (eqv? (- (- fixnum-min 1)) (quotient (- fixnum-min 1) -1)))
302 (eqv? fixnum-min (* (quotient (- fixnum-min 1) 2) 2)))
304 (pass-if "n = fixnum-max"
305 (eqv? -1 (quotient (- fixnum-min 1) fixnum-max)))
307 (pass-if "n = fixnum-max + 1"
308 (eqv? -1 (quotient (- fixnum-min 1) (+ fixnum-max 1))))
310 (pass-if "n = fixnum-min"
311 (eqv? 1 (quotient (- fixnum-min 1) fixnum-min)))
313 (pass-if "n = fixnum-min - 1"
314 (eqv? 1 (quotient (- fixnum-min 1) (- fixnum-min 1)))))
316 ;; Positive dividend and divisor
319 (eqv? 5 (quotient 35 7)))
321 ;; Negative dividend, positive divisor
324 (eqv? -5 (quotient -35 7)))
326 ;; Positive dividend, negative divisor
329 (eqv? -5 (quotient 35 -7)))
331 ;; Negative dividend and divisor
334 (eqv? 5 (quotient -35 -7)))
336 ;; Are numerical overflows detected correctly?
338 (with-test-prefix "division by zero"
340 (pass-if-exception "(quotient 1 0)"
341 exception:numerical-overflow
344 (pass-if-exception "(quotient bignum 0)"
345 exception:numerical-overflow
346 (quotient (+ fixnum-max 1) 0)))
348 ;; Are wrong type arguments detected correctly?
356 (with-test-prefix "remainder"
358 (expect-fail "documented?"
359 (documented? remainder))
361 (with-test-prefix "0 / n"
364 (eqv? 0 (remainder 0 1)))
367 (eqv? 0 (remainder 0 -1)))
369 (pass-if "n = fixnum-max"
370 (eqv? 0 (remainder 0 fixnum-max)))
372 (pass-if "n = fixnum-max + 1"
373 (eqv? 0 (remainder 0 (+ fixnum-max 1))))
375 (pass-if "n = fixnum-min"
376 (eqv? 0 (remainder 0 fixnum-min)))
378 (pass-if "n = fixnum-min - 1"
379 (eqv? 0 (remainder 0 (- fixnum-min 1)))))
381 (with-test-prefix "1 / n"
384 (eqv? 0 (remainder 1 1)))
387 (eqv? 0 (remainder 1 -1)))
389 (pass-if "n = fixnum-max"
390 (eqv? 1 (remainder 1 fixnum-max)))
392 (pass-if "n = fixnum-max + 1"
393 (eqv? 1 (remainder 1 (+ fixnum-max 1))))
395 (pass-if "n = fixnum-min"
396 (eqv? 1 (remainder 1 fixnum-min)))
398 (pass-if "n = fixnum-min - 1"
399 (eqv? 1 (remainder 1 (- fixnum-min 1)))))
401 (with-test-prefix "-1 / n"
404 (eqv? 0 (remainder -1 1)))
407 (eqv? 0 (remainder -1 -1)))
409 (pass-if "n = fixnum-max"
410 (eqv? -1 (remainder -1 fixnum-max)))
412 (pass-if "n = fixnum-max + 1"
413 (eqv? -1 (remainder -1 (+ fixnum-max 1))))
415 (pass-if "n = fixnum-min"
416 (eqv? -1 (remainder -1 fixnum-min)))
418 (pass-if "n = fixnum-min - 1"
419 (eqv? -1 (remainder -1 (- fixnum-min 1)))))
421 (with-test-prefix "fixnum-max / n"
424 (eqv? 0 (remainder fixnum-max 1)))
427 (eqv? 0 (remainder fixnum-max -1)))
429 (pass-if "n = fixnum-max"
430 (eqv? 0 (remainder fixnum-max fixnum-max)))
432 (pass-if "n = fixnum-max + 1"
433 (eqv? fixnum-max (remainder fixnum-max (+ fixnum-max 1))))
435 (pass-if "n = fixnum-min"
436 (eqv? fixnum-max (remainder fixnum-max fixnum-min)))
438 (pass-if "n = fixnum-min - 1"
439 (eqv? fixnum-max (remainder fixnum-max (- fixnum-min 1)))))
441 (with-test-prefix "(fixnum-max + 1) / n"
444 (eqv? 0 (remainder (+ fixnum-max 1) 1)))
447 (eqv? 0 (remainder (+ fixnum-max 1) -1)))
449 (pass-if "n = fixnum-max"
450 (eqv? 1 (remainder (+ fixnum-max 1) fixnum-max)))
452 (pass-if "n = fixnum-max + 1"
453 (eqv? 0 (remainder (+ fixnum-max 1) (+ fixnum-max 1))))
455 (pass-if "n = fixnum-min"
456 (eqv? 0 (remainder (+ fixnum-max 1) fixnum-min)))
458 (pass-if "n = fixnum-min - 1"
459 (eqv? (+ fixnum-max 1) (remainder (+ fixnum-max 1) (- fixnum-min 1)))))
461 (with-test-prefix "fixnum-min / n"
464 (eqv? 0 (remainder fixnum-min 1)))
467 (eqv? 0 (remainder fixnum-min -1)))
469 (pass-if "n = fixnum-max"
470 (eqv? -1 (remainder fixnum-min fixnum-max)))
472 (pass-if "n = fixnum-max + 1"
473 (eqv? 0 (remainder fixnum-min (+ fixnum-max 1))))
475 (pass-if "n = fixnum-min"
476 (eqv? 0 (remainder fixnum-min fixnum-min)))
478 (pass-if "n = fixnum-min - 1"
479 (eqv? fixnum-min (remainder fixnum-min (- fixnum-min 1)))))
481 (with-test-prefix "(fixnum-min - 1) / n"
484 (eqv? 0 (remainder (- fixnum-min 1) 1)))
487 (eqv? 0 (remainder (- fixnum-min 1) -1)))
489 (pass-if "n = fixnum-max"
490 (eqv? -2 (remainder (- fixnum-min 1) fixnum-max)))
492 (pass-if "n = fixnum-max + 1"
493 (eqv? -1 (remainder (- fixnum-min 1) (+ fixnum-max 1))))
495 (pass-if "n = fixnum-min"
496 (eqv? -1 (remainder (- fixnum-min 1) fixnum-min)))
498 (pass-if "n = fixnum-min - 1"
499 (eqv? 0 (remainder (- fixnum-min 1) (- fixnum-min 1)))))
501 ;; Positive dividend and divisor
504 (eqv? 0 (remainder 35 7)))
506 ;; Negative dividend, positive divisor
509 (eqv? 0 (remainder -35 7)))
511 ;; Positive dividend, negative divisor
514 (eqv? 0 (remainder 35 -7)))
516 ;; Negative dividend and divisor
519 (eqv? 0 (remainder -35 -7)))
521 ;; Are numerical overflows detected correctly?
523 (with-test-prefix "division by zero"
525 (pass-if-exception "(remainder 1 0)"
526 exception:numerical-overflow
529 (pass-if-exception "(remainder bignum 0)"
530 exception:numerical-overflow
531 (remainder (+ fixnum-max 1) 0)))
533 ;; Are wrong type arguments detected correctly?
541 (with-test-prefix "modulo"
543 (expect-fail "documented?"
544 (documented? modulo))
546 (with-test-prefix "0 % n"
549 (eqv? 0 (modulo 0 1)))
552 (eqv? 0 (modulo 0 -1)))
554 (pass-if "n = fixnum-max"
555 (eqv? 0 (modulo 0 fixnum-max)))
557 (pass-if "n = fixnum-max + 1"
558 (eqv? 0 (modulo 0 (+ fixnum-max 1))))
560 (pass-if "n = fixnum-min"
561 (eqv? 0 (modulo 0 fixnum-min)))
563 (pass-if "n = fixnum-min - 1"
564 (eqv? 0 (modulo 0 (- fixnum-min 1)))))
566 (with-test-prefix "1 % n"
569 (eqv? 0 (modulo 1 1)))
572 (eqv? 0 (modulo 1 -1)))
574 (pass-if "n = fixnum-max"
575 (eqv? 1 (modulo 1 fixnum-max)))
577 (pass-if "n = fixnum-max + 1"
578 (eqv? 1 (modulo 1 (+ fixnum-max 1))))
580 (pass-if "n = fixnum-min"
581 (eqv? (+ fixnum-min 1) (modulo 1 fixnum-min)))
583 (pass-if "n = fixnum-min - 1"
584 (eqv? fixnum-min (modulo 1 (- fixnum-min 1)))))
586 (with-test-prefix "-1 % n"
589 (eqv? 0 (modulo -1 1)))
592 (eqv? 0 (modulo -1 -1)))
594 (pass-if "n = fixnum-max"
595 (eqv? (- fixnum-max 1) (modulo -1 fixnum-max)))
597 (pass-if "n = fixnum-max + 1"
598 (eqv? fixnum-max (modulo -1 (+ fixnum-max 1))))
600 (pass-if "n = fixnum-min"
601 (eqv? -1 (modulo -1 fixnum-min)))
603 (pass-if "n = fixnum-min - 1"
604 (eqv? -1 (modulo -1 (- fixnum-min 1)))))
606 (with-test-prefix "fixnum-max % n"
609 (eqv? 0 (modulo fixnum-max 1)))
612 (eqv? 0 (modulo fixnum-max -1)))
614 (pass-if "n = fixnum-max"
615 (eqv? 0 (modulo fixnum-max fixnum-max)))
617 (pass-if "n = fixnum-max + 1"
618 (eqv? fixnum-max (modulo fixnum-max (+ fixnum-max 1))))
620 (pass-if "n = fixnum-min"
621 (eqv? -1 (modulo fixnum-max fixnum-min)))
623 (pass-if "n = fixnum-min - 1"
624 (eqv? -2 (modulo fixnum-max (- fixnum-min 1)))))
626 (with-test-prefix "(fixnum-max + 1) % n"
629 (eqv? 0 (modulo (+ fixnum-max 1) 1)))
632 (eqv? 0 (modulo (+ fixnum-max 1) -1)))
634 (pass-if "n = fixnum-max"
635 (eqv? 1 (modulo (+ fixnum-max 1) fixnum-max)))
637 (pass-if "n = fixnum-max + 1"
638 (eqv? 0 (modulo (+ fixnum-max 1) (+ fixnum-max 1))))
640 (pass-if "n = fixnum-min"
641 (eqv? 0 (modulo (+ fixnum-max 1) fixnum-min)))
643 (pass-if "n = fixnum-min - 1"
644 (eqv? -1 (modulo (+ fixnum-max 1) (- fixnum-min 1)))))
646 (with-test-prefix "fixnum-min % n"
649 (eqv? 0 (modulo fixnum-min 1)))
652 (eqv? 0 (modulo fixnum-min -1)))
654 (pass-if "n = fixnum-max"
655 (eqv? (- fixnum-max 1) (modulo fixnum-min fixnum-max)))
657 (pass-if "n = fixnum-max + 1"
658 (eqv? 0 (modulo fixnum-min (+ fixnum-max 1))))
660 (pass-if "n = fixnum-min"
661 (eqv? 0 (modulo fixnum-min fixnum-min)))
663 (pass-if "n = fixnum-min - 1"
664 (eqv? fixnum-min (modulo fixnum-min (- fixnum-min 1)))))
666 (with-test-prefix "(fixnum-min - 1) % n"
669 (eqv? 0 (modulo (- fixnum-min 1) 1)))
672 (eqv? 0 (modulo (- fixnum-min 1) -1)))
674 (pass-if "n = fixnum-max"
675 (eqv? (- fixnum-max 2) (modulo (- fixnum-min 1) fixnum-max)))
677 (pass-if "n = fixnum-max + 1"
678 (eqv? fixnum-max (modulo (- fixnum-min 1) (+ fixnum-max 1))))
680 (pass-if "n = fixnum-min"
681 (eqv? -1 (modulo (- fixnum-min 1) fixnum-min)))
683 (pass-if "n = fixnum-min - 1"
684 (eqv? 0 (modulo (- fixnum-min 1) (- fixnum-min 1)))))
686 ;; Positive dividend and divisor
689 (eqv? 1 (modulo 13 4)))
691 (pass-if "2177452800 % 86400"
692 (eqv? 0 (modulo 2177452800 86400)))
694 ;; Negative dividend, positive divisor
697 (eqv? 3 (modulo -13 4)))
699 (pass-if "-2177452800 % 86400"
700 (eqv? 0 (modulo -2177452800 86400)))
702 ;; Positive dividend, negative divisor
705 (eqv? -3 (modulo 13 -4)))
707 (pass-if "2177452800 % -86400"
708 (eqv? 0 (modulo 2177452800 -86400)))
710 ;; Negative dividend and divisor
713 (eqv? -1 (modulo -13 -4)))
715 (pass-if "-2177452800 % -86400"
716 (eqv? 0 (modulo -2177452800 -86400)))
718 ;; Are numerical overflows detected correctly?
720 (with-test-prefix "division by zero"
722 (pass-if-exception "(modulo 1 0)"
723 exception:numerical-overflow
726 (pass-if-exception "(modulo bignum 0)"
727 exception:numerical-overflow
728 (modulo (+ fixnum-max 1) 0)))
730 ;; Are wrong type arguments detected correctly?
738 (with-test-prefix "gcd"
740 (expect-fail "documented?"
743 (with-test-prefix "(0 n)"
754 (pass-if "n = fixnum-max"
755 (eqv? fixnum-max (gcd 0 fixnum-max)))
757 (pass-if "n = fixnum-max + 1"
758 (eqv? (+ fixnum-max 1) (gcd 0 (+ fixnum-max 1))))
760 (pass-if "n = fixnum-min"
761 (eqv? (- fixnum-min) (gcd 0 fixnum-min)))
763 (pass-if "n = fixnum-min - 1"
764 (eqv? (- (- fixnum-min 1)) (gcd 0 (- fixnum-min 1)))))
766 (with-test-prefix "(n 0)"
768 (pass-if "n = 2^128 * fixnum-max"
769 (eqv? (ash fixnum-max 128) (gcd (ash fixnum-max 128) 0))))
771 (with-test-prefix "(1 n)"
782 (pass-if "n = fixnum-max"
783 (eqv? 1 (gcd 1 fixnum-max)))
785 (pass-if "n = fixnum-max + 1"
786 (eqv? 1 (gcd 1 (+ fixnum-max 1))))
788 (pass-if "n = fixnum-min"
789 (eqv? 1 (gcd 1 fixnum-min)))
791 (pass-if "n = fixnum-min - 1"
792 (eqv? 1 (gcd 1 (- fixnum-min 1)))))
794 (with-test-prefix "(-1 n)"
803 (eqv? 1 (gcd -1 -1)))
805 (pass-if "n = fixnum-max"
806 (eqv? 1 (gcd -1 fixnum-max)))
808 (pass-if "n = fixnum-max + 1"
809 (eqv? 1 (gcd -1 (+ fixnum-max 1))))
811 (pass-if "n = fixnum-min"
812 (eqv? 1 (gcd -1 fixnum-min)))
814 (pass-if "n = fixnum-min - 1"
815 (eqv? 1 (gcd -1 (- fixnum-min 1)))))
817 (with-test-prefix "(fixnum-max n)"
820 (eqv? fixnum-max (gcd fixnum-max 0)))
823 (eqv? 1 (gcd fixnum-max 1)))
826 (eqv? 1 (gcd fixnum-max -1)))
828 (pass-if "n = fixnum-max"
829 (eqv? fixnum-max (gcd fixnum-max fixnum-max)))
831 (pass-if "n = fixnum-max + 1"
832 (eqv? 1 (gcd fixnum-max (+ fixnum-max 1))))
834 (pass-if "n = fixnum-min"
835 (eqv? 1 (gcd fixnum-max fixnum-min)))
837 (pass-if "n = fixnum-min - 1"
838 (eqv? 1 (gcd fixnum-max (- fixnum-min 1)))))
840 (with-test-prefix "((+ fixnum-max 1) n)"
843 (eqv? (+ fixnum-max 1) (gcd (+ fixnum-max 1) 0)))
846 (eqv? 1 (gcd (+ fixnum-max 1) 1)))
849 (eqv? 1 (gcd (+ fixnum-max 1) -1)))
851 (pass-if "n = fixnum-max"
852 (eqv? 1 (gcd (+ fixnum-max 1) fixnum-max)))
854 (pass-if "n = fixnum-max + 1"
855 (eqv? (+ fixnum-max 1) (gcd (+ fixnum-max 1) (+ fixnum-max 1))))
857 (pass-if "n = fixnum-min"
858 (eqv? (+ fixnum-max 1) (gcd (+ fixnum-max 1) fixnum-min)))
860 (pass-if "n = fixnum-min - 1"
861 (eqv? 1 (gcd (+ fixnum-max 1) (- fixnum-min 1)))))
863 (with-test-prefix "(fixnum-min n)"
866 (eqv? (- fixnum-min) (gcd fixnum-min 0)))
869 (eqv? 1 (gcd fixnum-min 1)))
872 (eqv? 1 (gcd fixnum-min -1)))
874 (pass-if "n = fixnum-max"
875 (eqv? 1 (gcd fixnum-min fixnum-max)))
877 (pass-if "n = fixnum-max + 1"
878 (eqv? (+ fixnum-max 1) (gcd fixnum-min (+ fixnum-max 1))))
880 (pass-if "n = fixnum-min"
881 (eqv? (- fixnum-min) (gcd fixnum-min fixnum-min)))
883 (pass-if "n = fixnum-min - 1"
884 (eqv? 1 (gcd fixnum-min (- fixnum-min 1)))))
886 (with-test-prefix "((- fixnum-min 1) n)"
889 (eqv? (- (- fixnum-min 1)) (gcd (- fixnum-min 1) 0)))
892 (eqv? 1 (gcd (- fixnum-min 1) 1)))
895 (eqv? 1 (gcd (- fixnum-min 1) -1)))
897 (pass-if "n = fixnum-max"
898 (eqv? 1 (gcd (- fixnum-min 1) fixnum-max)))
900 (pass-if "n = fixnum-max + 1"
901 (eqv? 1 (gcd (- fixnum-min 1) (+ fixnum-max 1))))
903 (pass-if "n = fixnum-min"
904 (eqv? 1 (gcd (- fixnum-min 1) fixnum-min)))
906 (pass-if "n = fixnum-min - 1"
907 (eqv? (- (- fixnum-min 1)) (gcd (- fixnum-min 1) (- fixnum-min 1)))))
909 ;; Are wrong type arguments detected correctly?
917 (with-test-prefix "lcm"
918 ;; FIXME: more tests?
919 ;; (some of these are already in r4rs.test)
920 (expect-fail (documented? lcm))
921 (pass-if (= (lcm) 1))
922 (pass-if (= (lcm 32 -36) 288))
923 (let ((big-n 115792089237316195423570985008687907853269984665640564039457584007913129639936) ; 2 ^ 256
924 (lcm-of-big-n-and-11 1273712981610478149659280835095566986385969831322046204434033424087044426039296))
925 (pass-if (= lcm-of-big-n-and-11 (lcm big-n 11)))
926 (pass-if (= lcm-of-big-n-and-11 (lcm 11 big-n 11)))))
932 (with-test-prefix "number->string"
935 (string->number (number->string n radix) radix))))
937 (pass-if (documented? number->string))
938 (pass-if (string=? (number->string 0) "0"))
939 (pass-if (string=? (number->string 171) "171"))
940 (pass-if (= (+ fixnum-max 1) (num->str->num (+ fixnum-max 1) 10)))
941 (pass-if (= (- fixnum-min 1) (num->str->num (- fixnum-min 1) 10)))
942 (pass-if (= (inf) (num->str->num (inf) 10)))
943 (pass-if (= 1.3 (num->str->num 1.3 10)))))
949 (with-test-prefix "string->number"
951 (pass-if "string->number"
952 (documented? string->number))
954 (pass-if "non number strings"
955 (for-each (lambda (x) (if (string->number x) (throw 'fail)))
956 '("" "q" "1q" "6+7iq" "8+9q" "10+11" "13+" "18@19q" "20@q" "23@"
957 "+25iq" "26i" "-q" "-iq" "i" "5#.0" "8/" "10#11" ".#" "."
958 "#o.2" "3.4q" "15.16e17q" "18.19e+q" ".q" ".17#18" "10q" "#b2"
959 "#b3" "#b4" "#b5" "#b6" "#b7" "#b8" "#b9" "#ba" "#bb" "#bc"
960 "#bd" "#be" "#bf" "#q" "#b#b1" "#o#o1" "#d#d1" "#x#x1" "#e#e1"
964 (pass-if "valid number strings"
965 (for-each (lambda (couple)
968 (let ((x (string->number x)))
969 (if (or (eq? x #f) (not (eqv? x y))) (throw 'fail))))
972 ("#b0" 0) ("#B0" 0) ("#b1" 1) ("#B1" 1) ("#o0" 0) ("#O0" 0)
973 ("#o1" 1) ("#O1" 1) ("#o2" 2) ("#O2" 2) ("#o3" 3) ("#O3" 3)
974 ("#o4" 4) ("#O4" 4) ("#o5" 5) ("#O5" 5) ("#o6" 6) ("#O6" 6)
975 ("#o7" 7) ("#O7" 7) ("#d0" 0) ("#D0" 0) ("#d1" 1) ("#D1" 1)
976 ("#d2" 2) ("#D2" 2) ("#d3" 3) ("#D3" 3) ("#d4" 4) ("#D4" 4)
977 ("#d5" 5) ("#D5" 5) ("#d6" 6) ("#D6" 6) ("#d7" 7) ("#D7" 7)
978 ("#d8" 8) ("#D8" 8) ("#d9" 9) ("#D9" 9)
979 ("#xa" 10) ("#Xa" 10) ("#xb" 11) ("#Xb" 11)
980 ("#xc" 12) ("#Xc" 12) ("#xd" 13) ("#Xd" 13)
981 ("#xe" 14) ("#Xe" 14) ("#xf" 15) ("#Xf" 15)
983 ("#o12345670" 2739128)
984 ("#d1234567890" 1234567890)
985 ("#x1234567890abcdef" 1311768467294899695)
987 ("#e1" 1) ("#e1.2" 1) ("#i1.1" 1.1) ("#i1" 1.0)
989 ("1" ,(1+ 0)) ("23" ,(+ 9 9 5)) ("-1" ,(- 0 1))
990 ("-45" ,(- 0 45)) ("2#" 20.0) ("2##" 200.0) ("12##" 1200.0)
993 ("1/1" 1) ("1/2" 0.5) ("-1/2" -0.5) ("1#/1" 10.0)
994 ("10/1#" 1.0) ("1#/1#" 1.0) ("#e9/10" 1) ("#e10/1#" 1)
995 ("#i6/8" 0.75) ("#i1/1" 1.0)
997 ;; * <uinteger 10> <suffix>
998 ("1e2" 100.0) ("1E2" 100.0) ("1s2" 100.0) ("1S2" 100.0)
999 ("1f2" 100.0) ("1F2" 100.0) ("1d2" 100.0) ("1D2" 100.0)
1000 ("1l2" 100.0) ("1L2" 100.0) ("1e+2" 100.0) ("1e-2" 0.01)
1001 ;; * . <digit 10>+ #* <suffix>
1002 (".1" .1) (".0123456789" 123456789e-10) (".16#" 0.16)
1003 (".0123456789e10" 123456789.0) (".16#e3" 160.0) ("#d.3" 0.3)
1004 ;; * <digit 10>+ . <digit 10>* #* <suffix>
1005 ("3." ,(exact->inexact 3)) ("3.e0" ,(exact->inexact 3))
1006 ("3.1" ,(exact->inexact 31/10)) ("3.1e0" 3.1) ("3.1#" 3.1)
1008 ;; * <digit 10>+ #+ . #* <suffix>
1009 ("3#." 30.0) ("3#.e0" 30.0) ("3#.#" 30.0) ("3#.#e0" 30.0)
1011 ("1@0" 1.0) ("1@+0" 1.0) ("1@-0" 1.0)
1012 ("2+3i" ,(+ 2 (* 3 +i))) ("4-5i" ,(- 4 (* 5 +i)))
1013 ("1+i" 1+1i) ("1-i" 1-1i) ("+1i" 0+1i) ("-1i" 0-1i)
1014 ("+i" +1i) ("-i" -1i)))
1017 (pass-if-exception "exponent too big"
1018 exception:out-of-range
1019 (string->number "12.13e141414")))
1025 (with-test-prefix "number?"
1026 (pass-if (documented? number?))
1027 (pass-if (number? 0))
1028 (pass-if (number? 7))
1029 (pass-if (number? -7))
1030 (pass-if (number? 1.3))
1031 (pass-if (number? (+ 1 fixnum-max)))
1032 (pass-if (number? (- 1 fixnum-min)))
1033 (pass-if (number? 3+4i))
1034 (expect-fail (number? #\a))
1035 (expect-fail (number? "a"))
1036 (expect-fail (number? (make-vector 0)))
1037 (expect-fail (number? (cons 1 2)))
1038 (expect-fail (number? #t))
1039 (expect-fail (number? (lambda () #t)))
1040 (expect-fail (number? (current-input-port))))
1046 (with-test-prefix "complex?"
1047 (pass-if (documented? complex?))
1048 (pass-if (complex? 0))
1049 (pass-if (complex? 7))
1050 (pass-if (complex? -7))
1051 (pass-if (complex? (+ 1 fixnum-max)))
1052 (pass-if (complex? (- 1 fixnum-min)))
1053 (pass-if (complex? 1.3))
1054 (pass-if (complex? 3+4i))
1055 (expect-fail (complex? #\a))
1056 (expect-fail (complex? "a"))
1057 (expect-fail (complex? (make-vector 0)))
1058 (expect-fail (complex? (cons 1 2)))
1059 (expect-fail (complex? #t))
1060 (expect-fail (complex? (lambda () #t)))
1061 (expect-fail (complex? (current-input-port))))
1067 (with-test-prefix "real?"
1068 (pass-if (documented? real?))
1071 (pass-if (real? -7))
1072 (pass-if (real? (+ 1 fixnum-max)))
1073 (pass-if (real? (- 1 fixnum-min)))
1074 (pass-if (real? 1.3))
1075 (expect-fail (real? 3+4i))
1076 (expect-fail (real? #\a))
1077 (expect-fail (real? "a"))
1078 (expect-fail (real? (make-vector 0)))
1079 (expect-fail (real? (cons 1 2)))
1080 (expect-fail (real? #t))
1081 (expect-fail (real? (lambda () #t)))
1082 (expect-fail (real? (current-input-port))))
1085 ;;; rational? (same as real? right now)
1088 (with-test-prefix "rational?"
1089 (pass-if (documented? rational?))
1090 (pass-if (rational? 0))
1091 (pass-if (rational? 7))
1092 (pass-if (rational? -7))
1093 (pass-if (rational? (+ 1 fixnum-max)))
1094 (pass-if (rational? (- 1 fixnum-min)))
1095 (pass-if (rational? 1.3))
1096 (expect-fail (rational? 3+4i))
1097 (expect-fail (rational? #\a))
1098 (expect-fail (rational? "a"))
1099 (expect-fail (rational? (make-vector 0)))
1100 (expect-fail (rational? (cons 1 2)))
1101 (expect-fail (rational? #t))
1102 (expect-fail (rational? (lambda () #t)))
1103 (expect-fail (rational? (current-input-port))))
1109 (with-test-prefix "integer?"
1110 (pass-if (documented? integer?))
1111 (pass-if (integer? 0))
1112 (pass-if (integer? 7))
1113 (pass-if (integer? -7))
1114 (pass-if (integer? (+ 1 fixnum-max)))
1115 (pass-if (integer? (- 1 fixnum-min)))
1116 (pass-if (and (= 3+0i (round 3+0i)) (integer? 3+0i)))
1117 (pass-if (and (= 1.0 (round 1.0)) (integer? 1.0)))
1118 (expect-fail (integer? 1.3))
1119 (expect-fail (integer? 3+4i))
1120 (expect-fail (integer? #\a))
1121 (expect-fail (integer? "a"))
1122 (expect-fail (integer? (make-vector 0)))
1123 (expect-fail (integer? (cons 1 2)))
1124 (expect-fail (integer? #t))
1125 (expect-fail (integer? (lambda () #t)))
1126 (expect-fail (integer? (current-input-port))))
1132 (with-test-prefix "inexact?"
1133 (pass-if (documented? inexact?))
1134 (expect-fail (inexact? 0))
1135 (expect-fail (inexact? 7))
1136 (expect-fail (inexact? -7))
1137 (expect-fail (inexact? (+ 1 fixnum-max)))
1138 (expect-fail (inexact? (- 1 fixnum-min)))
1139 (pass-if (inexact? 1.3))
1140 (pass-if (inexact? 3.1+4.2i))
1141 (expect-fail (inexact? #\a))
1142 (expect-fail (inexact? "a"))
1143 (expect-fail (inexact? (make-vector 0)))
1144 (expect-fail (inexact? (cons 1 2)))
1145 (expect-fail (inexact? #t))
1146 (expect-fail (inexact? (lambda () #t)))
1147 (expect-fail (inexact? (current-input-port))))
1153 (with-test-prefix "="
1154 (expect-fail (documented? =))
1158 (pass-if (= (+ 1 fixnum-max) (+ 1 fixnum-max)))
1159 (pass-if (= (- 1 fixnum-min) (- 1 fixnum-min)))
1160 (expect-fail (= 0 1))
1161 (expect-fail (= fixnum-max (+ 1 fixnum-max)))
1162 (expect-fail (= (+ 1 fixnum-max) fixnum-max))
1163 (expect-fail (= fixnum-min (- fixnum-min 1)))
1164 (expect-fail (= (- fixnum-min 1) fixnum-min))
1165 (expect-fail (= (+ fixnum-max 1) (- fixnum-min 1)))
1167 (pass-if (not (= +nan.0 +nan.0)))
1168 (pass-if (not (= 0 +nan.0)))
1169 (pass-if (not (= +nan.0 0)))
1170 (pass-if (not (= 1 +nan.0)))
1171 (pass-if (not (= +nan.0 1)))
1172 (pass-if (not (= -1 +nan.0)))
1173 (pass-if (not (= +nan.0 -1)))
1175 (pass-if (not (= (ash 1 256) +nan.0)))
1176 (pass-if (not (= +nan.0 (ash 1 256))))
1177 (pass-if (not (= (- (ash 1 256)) +nan.0)))
1178 (pass-if (not (= +nan.0 (- (ash 1 256)))))
1180 (pass-if (not (= (ash 1 8192) +nan.0)))
1181 (pass-if (not (= +nan.0 (ash 1 8192))))
1182 (pass-if (not (= (- (ash 1 8192)) +nan.0)))
1183 (pass-if (not (= +nan.0 (- (ash 1 8192)))))
1185 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating NaN as 3*2^1023, make
1186 ;; sure we've avoided that
1187 (pass-if (not (= (ash 3 1023) +nan.0)))
1188 (pass-if (not (= +nan.0 (ash 3 1023)))))
1194 (with-test-prefix "<"
1196 (expect-fail "documented?"
1199 (with-test-prefix "(< 0 n)"
1219 (pass-if "n = fixnum-max"
1222 (pass-if "n = fixnum-max + 1"
1223 (< 0 (+ fixnum-max 1)))
1225 (pass-if "n = fixnum-min"
1226 (not (< 0 fixnum-min)))
1228 (pass-if "n = fixnum-min - 1"
1229 (not (< 0 (- fixnum-min 1)))))
1231 (with-test-prefix "(< 0.0 n)"
1251 (pass-if "n = fixnum-max"
1254 (pass-if "n = fixnum-max + 1"
1255 (< 0.0 (+ fixnum-max 1)))
1257 (pass-if "n = fixnum-min"
1258 (not (< 0.0 fixnum-min)))
1260 (pass-if "n = fixnum-min - 1"
1261 (not (< 0.0 (- fixnum-min 1)))))
1263 (with-test-prefix "(< 1 n)"
1283 (pass-if "n = fixnum-max"
1286 (pass-if "n = fixnum-max + 1"
1287 (< 1 (+ fixnum-max 1)))
1289 (pass-if "n = fixnum-min"
1290 (not (< 1 fixnum-min)))
1292 (pass-if "n = fixnum-min - 1"
1293 (not (< 1 (- fixnum-min 1)))))
1295 (with-test-prefix "(< 1.0 n)"
1315 (pass-if "n = fixnum-max"
1318 (pass-if "n = fixnum-max + 1"
1319 (< 1.0 (+ fixnum-max 1)))
1321 (pass-if "n = fixnum-min"
1322 (not (< 1.0 fixnum-min)))
1324 (pass-if "n = fixnum-min - 1"
1325 (not (< 1.0 (- fixnum-min 1)))))
1327 (with-test-prefix "(< -1 n)"
1347 (pass-if "n = fixnum-max"
1350 (pass-if "n = fixnum-max + 1"
1351 (< -1 (+ fixnum-max 1)))
1353 (pass-if "n = fixnum-min"
1354 (not (< -1 fixnum-min)))
1356 (pass-if "n = fixnum-min - 1"
1357 (not (< -1 (- fixnum-min 1)))))
1359 (with-test-prefix "(< -1.0 n)"
1377 (not (< -1.0 -1.0)))
1379 (pass-if "n = fixnum-max"
1380 (< -1.0 fixnum-max))
1382 (pass-if "n = fixnum-max + 1"
1383 (< -1.0 (+ fixnum-max 1)))
1385 (pass-if "n = fixnum-min"
1386 (not (< -1.0 fixnum-min)))
1388 (pass-if "n = fixnum-min - 1"
1389 (not (< -1.0 (- fixnum-min 1)))))
1391 (with-test-prefix "(< fixnum-max n)"
1394 (not (< fixnum-max 0)))
1397 (not (< fixnum-max 0.0)))
1400 (not (< fixnum-max 1)))
1403 (not (< fixnum-max 1.0)))
1406 (not (< fixnum-max -1)))
1409 (not (< fixnum-max -1.0)))
1411 (pass-if "n = fixnum-max"
1412 (not (< fixnum-max fixnum-max)))
1414 (pass-if "n = fixnum-max + 1"
1415 (< fixnum-max (+ fixnum-max 1)))
1417 (pass-if "n = fixnum-min"
1418 (not (< fixnum-max fixnum-min)))
1420 (pass-if "n = fixnum-min - 1"
1421 (not (< fixnum-max (- fixnum-min 1)))))
1423 (with-test-prefix "(< (+ fixnum-max 1) n)"
1426 (not (< (+ fixnum-max 1) 0)))
1429 (not (< (+ fixnum-max 1) 0.0)))
1432 (not (< (+ fixnum-max 1) 1)))
1435 (not (< (+ fixnum-max 1) 1.0)))
1438 (not (< (+ fixnum-max 1) -1)))
1441 (not (< (+ fixnum-max 1) -1.0)))
1443 (pass-if "n = fixnum-max"
1444 (not (< (+ fixnum-max 1) fixnum-max)))
1446 (pass-if "n = fixnum-max + 1"
1447 (not (< (+ fixnum-max 1) (+ fixnum-max 1))))
1449 (pass-if "n = fixnum-min"
1450 (not (< (+ fixnum-max 1) fixnum-min)))
1452 (pass-if "n = fixnum-min - 1"
1453 (not (< (+ fixnum-max 1) (- fixnum-min 1)))))
1455 (with-test-prefix "(< fixnum-min n)"
1473 (< fixnum-min -1.0))
1475 (pass-if "n = fixnum-max"
1476 (< fixnum-min fixnum-max))
1478 (pass-if "n = fixnum-max + 1"
1479 (< fixnum-min (+ fixnum-max 1)))
1481 (pass-if "n = fixnum-min"
1482 (not (< fixnum-min fixnum-min)))
1484 (pass-if "n = fixnum-min - 1"
1485 (not (< fixnum-min (- fixnum-min 1)))))
1487 (with-test-prefix "(< (- fixnum-min 1) n)"
1490 (< (- fixnum-min 1) 0))
1493 (< (- fixnum-min 1) 0.0))
1496 (< (- fixnum-min 1) 1))
1499 (< (- fixnum-min 1) 1.0))
1502 (< (- fixnum-min 1) -1))
1505 (< (- fixnum-min 1) -1.0))
1507 (pass-if "n = fixnum-max"
1508 (< (- fixnum-min 1) fixnum-max))
1510 (pass-if "n = fixnum-max + 1"
1511 (< (- fixnum-min 1) (+ fixnum-max 1)))
1513 (pass-if "n = fixnum-min"
1514 (< (- fixnum-min 1) fixnum-min))
1516 (pass-if "n = fixnum-min - 1"
1517 (not (< (- fixnum-min 1) (- fixnum-min 1)))))
1519 (pass-if (not (< +nan.0 +nan.0)))
1520 (pass-if (not (< 0 +nan.0)))
1521 (pass-if (not (< +nan.0 0)))
1522 (pass-if (not (< 1 +nan.0)))
1523 (pass-if (not (< +nan.0 1)))
1524 (pass-if (not (< -1 +nan.0)))
1525 (pass-if (not (< +nan.0 -1)))
1527 (pass-if (not (< (ash 1 256) +nan.0)))
1528 (pass-if (not (< +nan.0 (ash 1 256))))
1529 (pass-if (not (< (- (ash 1 256)) +nan.0)))
1530 (pass-if (not (< +nan.0 (- (ash 1 256)))))
1532 (pass-if (not (< (ash 1 8192) +nan.0)))
1533 (pass-if (not (< +nan.0 (ash 1 8192))))
1534 (pass-if (not (< (- (ash 1 8192)) +nan.0)))
1535 (pass-if (not (< +nan.0 (- (ash 1 8192)))))
1537 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating NaN as 3*2^1023, make
1538 ;; sure we've avoided that
1539 (pass-if (not (< (ash 3 1023) +nan.0)))
1540 (pass-if (not (< (1+ (ash 3 1023)) +nan.0)))
1541 (pass-if (not (< (1- (ash 3 1023)) +nan.0)))
1542 (pass-if (not (< +nan.0 (ash 3 1023))))
1543 (pass-if (not (< +nan.0 (1+ (ash 3 1023)))))
1544 (pass-if (not (< +nan.0 (1- (ash 3 1023))))))
1550 ;; currently not tested -- implementation is trivial
1551 ;; (> x y) is implemented as (< y x)
1552 ;; FIXME: tests should probably be added in case we change implementation.
1558 ;; currently not tested -- implementation is trivial
1559 ;; (<= x y) is implemented as (not (< y x))
1560 ;; FIXME: tests should probably be added in case we change implementation.
1566 ;; currently not tested -- implementation is trivial
1567 ;; (>= x y) is implemented as (not (< x y))
1568 ;; FIXME: tests should probably be added in case we change implementation.
1574 (with-test-prefix "zero?"
1575 (expect-fail (documented? zero?))
1577 (expect-fail (zero? 7))
1578 (expect-fail (zero? -7))
1579 (expect-fail (zero? (+ 1 fixnum-max)))
1580 (expect-fail (zero? (- 1 fixnum-min)))
1581 (expect-fail (zero? 1.3))
1582 (expect-fail (zero? 3.1+4.2i)))
1588 (with-test-prefix "positive?"
1589 (expect-fail (documented? positive?))
1590 (pass-if (positive? 1))
1591 (pass-if (positive? (+ fixnum-max 1)))
1592 (pass-if (positive? 1.3))
1593 (expect-fail (positive? 0))
1594 (expect-fail (positive? -1))
1595 (expect-fail (positive? (- fixnum-min 1)))
1596 (expect-fail (positive? -1.3)))
1602 (with-test-prefix "negative?"
1603 (expect-fail (documented? negative?))
1604 (expect-fail (negative? 1))
1605 (expect-fail (negative? (+ fixnum-max 1)))
1606 (expect-fail (negative? 1.3))
1607 (expect-fail (negative? 0))
1608 (pass-if (negative? -1))
1609 (pass-if (negative? (- fixnum-min 1)))
1610 (pass-if (negative? -1.3)))
1620 ;; FIXME: unfinished...
1622 (with-test-prefix "min"
1623 (let ((big*2 (* fixnum-max 2))
1624 (big*3 (* fixnum-max 3))
1625 (big*4 (* fixnum-max 4))
1626 (big*5 (* fixnum-max 5)))
1628 (expect-fail (documented? max))
1629 (pass-if (= 1 (min 7 3 1 5)))
1630 (pass-if (= 1 (min 1 7 3 5)))
1631 (pass-if (= 1 (min 7 3 5 1)))
1632 (pass-if (= -7 (min 2 3 4 -2 5 -7 1 -1 4 2)))
1633 (pass-if (= -7 (min -7 2 3 4 -2 5 1 -1 4 2)))
1634 (pass-if (= -7 (min 2 3 4 -2 5 1 -1 4 2 -7)))
1635 (pass-if (= big*2 (min big*3 big*5 big*2 big*4)))
1636 (pass-if (= big*2 (min big*2 big*3 big*5 big*4)))
1637 (pass-if (= big*2 (min big*3 big*5 big*4 big*2)))
1639 (= (- fixnum-min 1) (min 2 4 (- fixnum-min 1) 3 (* 2 fixnum-max))))
1641 (= (- fixnum-min 1) (min (- fixnum-min 1) 2 4 3 (* 2 fixnum-max))))
1643 (= (- fixnum-min 1) (min 2 4 3 (* 2 fixnum-max) (- fixnum-min 1))))))
1649 (with-test-prefix "+"
1651 (expect-fail "documented?"
1654 (with-test-prefix "wrong type argument"
1656 (pass-if-exception "1st argument string"
1657 exception:wrong-type-arg
1660 (pass-if-exception "2nd argument bool"
1661 exception:wrong-type-arg
1667 (with-test-prefix "-"
1669 (pass-if "-inum - +bignum"
1670 (= #x-100000000000000000000000000000001
1671 (- -1 #x100000000000000000000000000000000))))
1681 (with-test-prefix "/"
1683 (expect-fail "documented?"
1686 (with-test-prefix "division by zero"
1688 (pass-if-exception "(/ 0)"
1689 exception:numerical-overflow
1695 (pass-if-exception "(/ 1 0)"
1696 exception:numerical-overflow
1699 (pass-if "(/ 1 0.0)"
1700 (= +inf.0 (/ 1 0.0)))
1702 (pass-if-exception "(/ bignum 0)"
1703 exception:numerical-overflow
1704 (/ (+ fixnum-max 1) 0))
1706 (pass-if "(/ bignum 0.0)"
1707 (= +inf.0 (/ (+ fixnum-max 1) 0.0)))
1709 (pass-if-exception "(/ 1.0 0)"
1710 exception:numerical-overflow
1713 (pass-if "(/ 1.0 0.0)"
1714 (= +inf.0 (/ 1.0 0.0)))
1716 (pass-if-exception "(/ +i 0)"
1717 exception:numerical-overflow
1720 (pass-if "(/ +i 0.0)"
1721 (= +inf.0 (imag-part (/ +i 0.0)))))
1723 (with-test-prefix "complex division"
1726 (= (/ 3+4i) 0.12-0.16i))
1729 (= (/ 4+3i) 0.16-0.12i))
1731 (pass-if "(/ 25+125i 3+4i)"
1732 (= (/ 25+125i 3+4i) 23.0+11.0i))
1734 (pass-if "(/ 25+125i 4+3i)"
1735 (= (/ 25+125i 4+3i) 19.0+17.0i))
1737 (pass-if "(/ 25 3+4i)"
1738 (= (/ 25 3+4i) 3.0-4.0i))
1740 (pass-if "(/ 25 4+3i)"
1741 (= (/ 25 4+3i) 4.0-3.0i))
1743 (pass-if "(/ 1e200+1e200i)"
1744 (= (/ 1e200+1e200i) 5.0e-201-5.0e-201i))))
1770 (with-test-prefix "expt"
1771 (pass-if "(= 1 (expt 0 0))" (= 1 (expt 0 0)))
1772 (pass-if "(= 1 (expt 0 0.0))" (= 1 (expt 0 0.0)))
1773 (pass-if "(= 1 (expt 0.0 0))" (= 1 (expt 0.0 0)))
1774 (pass-if "(= 1 (expt 0.0 0.0))" (= 1 (expt 0.0 0.0))))
1777 ;;; make-rectangular
1808 (with-test-prefix "integer-length"
1810 (with-test-prefix "-2^i, ...11100..00"
1811 (do ((n -1 (ash n 1))
1814 (pass-if (list n "expect" i)
1815 (= i (integer-length n)))))
1817 (with-test-prefix "-2^i+1 ...11100..01"
1818 (do ((n -3 (logxor 3 (ash n 1)))
1822 (= i (integer-length n)))))
1824 (with-test-prefix "-2^i-1 ...111011..11"
1825 (do ((n -2 (1+ (ash n 1)))
1829 (= i (integer-length n))))))
1835 (with-test-prefix "logcount"
1837 (with-test-prefix "-2^i, meaning ...11100..00"
1838 (do ((n -1 (ash n 1))
1842 (= i (logcount n))))))