(scm_system_star): new prototype.
[bpt/guile.git] / test-suite / tests / numbers.test
CommitLineData
de142bea 1;;;; numbers.test --- tests guile's numbers -*- scheme -*-
072e6de2 2;;;; Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
de142bea 3;;;;
73be1d9e
MV
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.
8;;;;
9;;;; This library is distributed in the hope that it will be useful,
de142bea 10;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
73be1d9e
MV
11;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12;;;; Lesser General Public License for more details.
13;;;;
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
de142bea 17
a1fb3b1c
KR
18(define-module (test-suite test-numbers)
19 #:use-module (test-suite lib)
20 #:use-module (ice-9 documentation))
de142bea 21
de142bea
DH
22;;;
23;;; miscellaneous
24;;;
25
1b3a7932
DH
26(define exception:numerical-overflow
27 (cons 'numerical-overflow "^Numerical overflow"))
28
cb18f2a8 29(define (documented? object)
5c96bc39 30 (not (not (object-documentation object))))
de142bea 31
8b7838b5
RB
32(define fixnum-bit
33 (inexact->exact (+ (/ (log (+ most-positive-fixnum 1)) (log 2)) 1)))
34
21e39e8f
DH
35(define fixnum-min most-negative-fixnum)
36(define fixnum-max most-positive-fixnum)
de142bea 37
a1fb3b1c
KR
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
44;; the usual 53.
45;;
46(define dbl-mant-dig
47 (let more ((i 1)
48 (d 2.0))
49 (if (> i 1024)
50 (error "Oops, cannot determine number of bits in mantissa of inexact"))
51 (let* ((sum (+ 1.0 d))
52 (diff (- sum d)))
53 (if (= diff 1.0)
54 (more (1+ i) (* 2.0 d))
55 i))))
56
57;; like ash, but working on a flonum
58(define (ash-flo x n)
59 (while (> n 0)
60 (set! x (* 2.0 x))
61 (set! n (1- n)))
62 (while (< n 0)
63 (set! x (* 0.5 x))
64 (set! n (1+ n)))
65 x)
66
67
de142bea
DH
68;;;
69;;; exact?
70;;;
71
72(with-test-prefix "exact?"
73
de142bea 74 (pass-if "documented?"
cb18f2a8 75 (documented? exact?))
de142bea 76
21e39e8f 77 (with-test-prefix "integers"
de142bea 78
21e39e8f
DH
79 (pass-if "0"
80 (exact? 0))
de142bea 81
21e39e8f
DH
82 (pass-if "fixnum-max"
83 (exact? fixnum-max))
de142bea 84
21e39e8f
DH
85 (pass-if "fixnum-max + 1"
86 (exact? (+ fixnum-max 1)))
de142bea 87
21e39e8f
DH
88 (pass-if "fixnum-min"
89 (exact? fixnum-min))
de142bea 90
21e39e8f
DH
91 (pass-if "fixnum-min - 1"
92 (exact? (- fixnum-min 1))))
93
94 (with-test-prefix "reals"
95
96 ;; (FIXME: need better examples.)
97
98 (pass-if "sqrt (fixnum-max^2 - 1)"
99 (eq? #f (exact? (sqrt (- (expt fixnum-max 2) 1)))))
100
101 (pass-if "sqrt ((fixnum-max+1)^2 - 1)"
102 (eq? #f (exact? (sqrt (- (expt (+ fixnum-max 1) 2) 1)))))))
de142bea
DH
103
104;;;
105;;; odd?
106;;;
107
7c24e528
RB
108(with-test-prefix "odd?"
109 (pass-if (documented? odd?))
110 (pass-if (odd? 1))
111 (pass-if (odd? -1))
4d332f19
DH
112 (pass-if (not (odd? 0)))
113 (pass-if (not (odd? 2)))
114 (pass-if (not (odd? -2)))
7c24e528 115 (pass-if (odd? (+ (* 2 fixnum-max) 1)))
4d332f19 116 (pass-if (not (odd? (* 2 fixnum-max))))
7c24e528 117 (pass-if (odd? (- (* 2 fixnum-min) 1)))
4d332f19 118 (pass-if (not (odd? (* 2 fixnum-min)))))
de142bea
DH
119
120;;;
121;;; even?
122;;;
123
7c24e528
RB
124(with-test-prefix "even?"
125 (pass-if (documented? even?))
126 (pass-if (even? 2))
127 (pass-if (even? -2))
128 (pass-if (even? 0))
4d332f19
DH
129 (pass-if (not (even? 1)))
130 (pass-if (not (even? -1)))
131 (pass-if (not (even? (+ (* 2 fixnum-max) 1))))
7c24e528 132 (pass-if (even? (* 2 fixnum-max)))
4d332f19 133 (pass-if (not (even? (- (* 2 fixnum-min) 1))))
7c24e528 134 (pass-if (even? (* 2 fixnum-min))))
de142bea
DH
135
136;;;
7c24e528
RB
137;;; inf? and inf
138;;;
139
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))
4d332f19
DH
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)))))
7c24e528
RB
150
151;;;
152;;; nan? and nan
de142bea
DH
153;;;
154
7c24e528
RB
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?
4d332f19
DH
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)))))
de142bea 163
7c24e528
RB
164;;;
165;;; abs
166;;;
167
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))))
177
de142bea
DH
178;;;
179;;; quotient
180;;;
181
182(with-test-prefix "quotient"
183
de142bea 184 (expect-fail "documented?"
cb18f2a8 185 (documented? quotient))
de142bea 186
de142bea
DH
187 (with-test-prefix "0 / n"
188
189 (pass-if "n = 1"
190 (eqv? 0 (quotient 0 1)))
191
192 (pass-if "n = -1"
193 (eqv? 0 (quotient 0 -1)))
194
21e39e8f
DH
195 (pass-if "n = 2"
196 (eqv? 0 (quotient 0 2)))
197
198 (pass-if "n = fixnum-max"
199 (eqv? 0 (quotient 0 fixnum-max)))
200
201 (pass-if "n = fixnum-max + 1"
202 (eqv? 0 (quotient 0 (+ fixnum-max 1))))
203
204 (pass-if "n = fixnum-min"
205 (eqv? 0 (quotient 0 fixnum-min)))
206
207 (pass-if "n = fixnum-min - 1"
208 (eqv? 0 (quotient 0 (- fixnum-min 1)))))
de142bea 209
21e39e8f 210 (with-test-prefix "1 / n"
de142bea
DH
211
212 (pass-if "n = 1"
213 (eqv? 1 (quotient 1 1)))
214
215 (pass-if "n = -1"
21e39e8f
DH
216 (eqv? -1 (quotient 1 -1)))
217
218 (pass-if "n = 2"
219 (eqv? 0 (quotient 1 2)))
de142bea 220
21e39e8f
DH
221 (pass-if "n = fixnum-max"
222 (eqv? 0 (quotient 1 fixnum-max)))
de142bea 223
21e39e8f
DH
224 (pass-if "n = fixnum-max + 1"
225 (eqv? 0 (quotient 1 (+ fixnum-max 1))))
de142bea 226
21e39e8f
DH
227 (pass-if "n = fixnum-min"
228 (eqv? 0 (quotient 1 fixnum-min)))
229
230 (pass-if "n = fixnum-min - 1"
231 (eqv? 0 (quotient 1 (- fixnum-min 1)))))
232
233 (with-test-prefix "-1 / n"
de142bea
DH
234
235 (pass-if "n = 1"
21e39e8f 236 (eqv? -1 (quotient -1 1)))
de142bea
DH
237
238 (pass-if "n = -1"
239 (eqv? 1 (quotient -1 -1)))
240
21e39e8f
DH
241 (pass-if "n = 2"
242 (eqv? 0 (quotient -1 2)))
243
244 (pass-if "n = fixnum-max"
245 (eqv? 0 (quotient -1 fixnum-max)))
246
247 (pass-if "n = fixnum-max + 1"
248 (eqv? 0 (quotient -1 (+ fixnum-max 1))))
249
250 (pass-if "n = fixnum-min"
251 (eqv? 0 (quotient -1 fixnum-min)))
252
253 (pass-if "n = fixnum-min - 1"
254 (eqv? 0 (quotient -1 (- fixnum-min 1)))))
255
256 (with-test-prefix "fixnum-max / n"
257
258 (pass-if "n = 1"
259 (eqv? fixnum-max (quotient fixnum-max 1)))
260
261 (pass-if "n = -1"
262 (eqv? (- fixnum-max) (quotient fixnum-max -1)))
263
264 (pass-if "n = 2"
265 (eqv? fixnum-max (+ (* (quotient fixnum-max 2) 2) 1)))
266
267 (pass-if "n = fixnum-max"
268 (eqv? 1 (quotient fixnum-max fixnum-max)))
269
270 (pass-if "n = fixnum-max + 1"
271 (eqv? 0 (quotient fixnum-max (+ fixnum-max 1))))
272
273 (pass-if "n = fixnum-min"
274 (eqv? 0 (quotient fixnum-max fixnum-min)))
275
276 (pass-if "n = fixnum-min - 1"
277 (eqv? 0 (quotient fixnum-max (- fixnum-min 1)))))
278
279 (with-test-prefix "(fixnum-max + 1) / n"
280
281 (pass-if "n = 1"
282 (eqv? (+ fixnum-max 1) (quotient (+ fixnum-max 1) 1)))
283
284 (pass-if "n = -1"
285 (eqv? (- (+ fixnum-max 1)) (quotient (+ fixnum-max 1) -1)))
286
287 (pass-if "n = 2"
288 (eqv? (+ fixnum-max 1) (* (quotient (+ fixnum-max 1) 2) 2)))
289
290 (pass-if "n = fixnum-max"
291 (eqv? 1 (quotient (+ fixnum-max 1) fixnum-max)))
292
293 (pass-if "n = fixnum-max + 1"
294 (eqv? 1 (quotient (+ fixnum-max 1) (+ fixnum-max 1))))
295
296 (pass-if "n = fixnum-min"
297 (eqv? -1 (quotient (+ fixnum-max 1) fixnum-min)))
298
299 (pass-if "n = fixnum-min - 1"
300 (eqv? 0 (quotient (+ fixnum-max 1) (- fixnum-min 1)))))
301
302 (with-test-prefix "fixnum-min / n"
303
304 (pass-if "n = 1"
305 (eqv? fixnum-min (quotient fixnum-min 1)))
306
307 (pass-if "n = -1"
308 (eqv? (- fixnum-min) (quotient fixnum-min -1)))
309
310 (pass-if "n = 2"
311 (eqv? fixnum-min (* (quotient fixnum-min 2) 2)))
312
313 (pass-if "n = fixnum-max"
314 (eqv? -1 (quotient fixnum-min fixnum-max)))
315
316 (pass-if "n = fixnum-max + 1"
317 (eqv? -1 (quotient fixnum-min (+ fixnum-max 1))))
318
319 (pass-if "n = fixnum-min"
320 (eqv? 1 (quotient fixnum-min fixnum-min)))
321
322 (pass-if "n = fixnum-min - 1"
323 (eqv? 0 (quotient fixnum-min (- fixnum-min 1)))))
324
325 (with-test-prefix "(fixnum-min - 1) / n"
326
327 (pass-if "n = 1"
328 (eqv? (- fixnum-min 1) (quotient (- fixnum-min 1) 1)))
329
330 (pass-if "n = -1"
331 (eqv? (- (- fixnum-min 1)) (quotient (- fixnum-min 1) -1)))
332
333 (pass-if "n = 2"
334 (eqv? fixnum-min (* (quotient (- fixnum-min 1) 2) 2)))
335
336 (pass-if "n = fixnum-max"
337 (eqv? -1 (quotient (- fixnum-min 1) fixnum-max)))
338
339 (pass-if "n = fixnum-max + 1"
340 (eqv? -1 (quotient (- fixnum-min 1) (+ fixnum-max 1))))
341
342 (pass-if "n = fixnum-min"
343 (eqv? 1 (quotient (- fixnum-min 1) fixnum-min)))
344
345 (pass-if "n = fixnum-min - 1"
346 (eqv? 1 (quotient (- fixnum-min 1) (- fixnum-min 1)))))
de142bea
DH
347
348 ;; Positive dividend and divisor
349
350 (pass-if "35 / 7"
351 (eqv? 5 (quotient 35 7)))
352
353 ;; Negative dividend, positive divisor
354
355 (pass-if "-35 / 7"
356 (eqv? -5 (quotient -35 7)))
357
358 ;; Positive dividend, negative divisor
359
360 (pass-if "35 / -7"
361 (eqv? -5 (quotient 35 -7)))
362
363 ;; Negative dividend and divisor
364
365 (pass-if "-35 / -7"
366 (eqv? 5 (quotient -35 -7)))
367
368 ;; Are numerical overflows detected correctly?
369
80074d77
DH
370 (with-test-prefix "division by zero"
371
372 (pass-if-exception "(quotient 1 0)"
373 exception:numerical-overflow
374 (quotient 1 0))
375
376 (pass-if-exception "(quotient bignum 0)"
377 exception:numerical-overflow
378 (quotient (+ fixnum-max 1) 0)))
379
de142bea
DH
380 ;; Are wrong type arguments detected correctly?
381
382 )
383
384;;;
385;;; remainder
386;;;
387
388(with-test-prefix "remainder"
389
de142bea 390 (expect-fail "documented?"
cb18f2a8 391 (documented? remainder))
de142bea 392
de142bea
DH
393 (with-test-prefix "0 / n"
394
395 (pass-if "n = 1"
396 (eqv? 0 (remainder 0 1)))
397
398 (pass-if "n = -1"
399 (eqv? 0 (remainder 0 -1)))
400
21e39e8f
DH
401 (pass-if "n = fixnum-max"
402 (eqv? 0 (remainder 0 fixnum-max)))
403
404 (pass-if "n = fixnum-max + 1"
405 (eqv? 0 (remainder 0 (+ fixnum-max 1))))
406
407 (pass-if "n = fixnum-min"
408 (eqv? 0 (remainder 0 fixnum-min)))
de142bea 409
21e39e8f
DH
410 (pass-if "n = fixnum-min - 1"
411 (eqv? 0 (remainder 0 (- fixnum-min 1)))))
de142bea 412
21e39e8f 413 (with-test-prefix "1 / n"
de142bea
DH
414
415 (pass-if "n = 1"
416 (eqv? 0 (remainder 1 1)))
417
418 (pass-if "n = -1"
21e39e8f
DH
419 (eqv? 0 (remainder 1 -1)))
420
421 (pass-if "n = fixnum-max"
422 (eqv? 1 (remainder 1 fixnum-max)))
de142bea 423
21e39e8f
DH
424 (pass-if "n = fixnum-max + 1"
425 (eqv? 1 (remainder 1 (+ fixnum-max 1))))
de142bea 426
21e39e8f
DH
427 (pass-if "n = fixnum-min"
428 (eqv? 1 (remainder 1 fixnum-min)))
de142bea 429
21e39e8f
DH
430 (pass-if "n = fixnum-min - 1"
431 (eqv? 1 (remainder 1 (- fixnum-min 1)))))
432
433 (with-test-prefix "-1 / n"
de142bea
DH
434
435 (pass-if "n = 1"
21e39e8f 436 (eqv? 0 (remainder -1 1)))
de142bea
DH
437
438 (pass-if "n = -1"
439 (eqv? 0 (remainder -1 -1)))
440
21e39e8f
DH
441 (pass-if "n = fixnum-max"
442 (eqv? -1 (remainder -1 fixnum-max)))
443
444 (pass-if "n = fixnum-max + 1"
445 (eqv? -1 (remainder -1 (+ fixnum-max 1))))
446
447 (pass-if "n = fixnum-min"
448 (eqv? -1 (remainder -1 fixnum-min)))
449
450 (pass-if "n = fixnum-min - 1"
451 (eqv? -1 (remainder -1 (- fixnum-min 1)))))
452
453 (with-test-prefix "fixnum-max / n"
454
455 (pass-if "n = 1"
456 (eqv? 0 (remainder fixnum-max 1)))
457
458 (pass-if "n = -1"
459 (eqv? 0 (remainder fixnum-max -1)))
460
461 (pass-if "n = fixnum-max"
462 (eqv? 0 (remainder fixnum-max fixnum-max)))
463
464 (pass-if "n = fixnum-max + 1"
465 (eqv? fixnum-max (remainder fixnum-max (+ fixnum-max 1))))
466
467 (pass-if "n = fixnum-min"
468 (eqv? fixnum-max (remainder fixnum-max fixnum-min)))
469
470 (pass-if "n = fixnum-min - 1"
471 (eqv? fixnum-max (remainder fixnum-max (- fixnum-min 1)))))
472
473 (with-test-prefix "(fixnum-max + 1) / n"
474
475 (pass-if "n = 1"
476 (eqv? 0 (remainder (+ fixnum-max 1) 1)))
477
478 (pass-if "n = -1"
479 (eqv? 0 (remainder (+ fixnum-max 1) -1)))
480
481 (pass-if "n = fixnum-max"
482 (eqv? 1 (remainder (+ fixnum-max 1) fixnum-max)))
483
484 (pass-if "n = fixnum-max + 1"
485 (eqv? 0 (remainder (+ fixnum-max 1) (+ fixnum-max 1))))
486
487 (pass-if "n = fixnum-min"
488 (eqv? 0 (remainder (+ fixnum-max 1) fixnum-min)))
489
490 (pass-if "n = fixnum-min - 1"
491 (eqv? (+ fixnum-max 1) (remainder (+ fixnum-max 1) (- fixnum-min 1)))))
492
493 (with-test-prefix "fixnum-min / n"
494
495 (pass-if "n = 1"
496 (eqv? 0 (remainder fixnum-min 1)))
497
498 (pass-if "n = -1"
499 (eqv? 0 (remainder fixnum-min -1)))
500
501 (pass-if "n = fixnum-max"
502 (eqv? -1 (remainder fixnum-min fixnum-max)))
503
504 (pass-if "n = fixnum-max + 1"
505 (eqv? 0 (remainder fixnum-min (+ fixnum-max 1))))
506
507 (pass-if "n = fixnum-min"
508 (eqv? 0 (remainder fixnum-min fixnum-min)))
509
510 (pass-if "n = fixnum-min - 1"
511 (eqv? fixnum-min (remainder fixnum-min (- fixnum-min 1)))))
512
513 (with-test-prefix "(fixnum-min - 1) / n"
514
515 (pass-if "n = 1"
516 (eqv? 0 (remainder (- fixnum-min 1) 1)))
517
518 (pass-if "n = -1"
519 (eqv? 0 (remainder (- fixnum-min 1) -1)))
520
521 (pass-if "n = fixnum-max"
522 (eqv? -2 (remainder (- fixnum-min 1) fixnum-max)))
523
524 (pass-if "n = fixnum-max + 1"
525 (eqv? -1 (remainder (- fixnum-min 1) (+ fixnum-max 1))))
526
527 (pass-if "n = fixnum-min"
528 (eqv? -1 (remainder (- fixnum-min 1) fixnum-min)))
529
530 (pass-if "n = fixnum-min - 1"
531 (eqv? 0 (remainder (- fixnum-min 1) (- fixnum-min 1)))))
de142bea
DH
532
533 ;; Positive dividend and divisor
534
535 (pass-if "35 / 7"
536 (eqv? 0 (remainder 35 7)))
537
538 ;; Negative dividend, positive divisor
539
540 (pass-if "-35 / 7"
541 (eqv? 0 (remainder -35 7)))
542
543 ;; Positive dividend, negative divisor
544
545 (pass-if "35 / -7"
546 (eqv? 0 (remainder 35 -7)))
547
548 ;; Negative dividend and divisor
549
550 (pass-if "-35 / -7"
551 (eqv? 0 (remainder -35 -7)))
552
553 ;; Are numerical overflows detected correctly?
554
80074d77
DH
555 (with-test-prefix "division by zero"
556
557 (pass-if-exception "(remainder 1 0)"
558 exception:numerical-overflow
559 (remainder 1 0))
560
561 (pass-if-exception "(remainder bignum 0)"
562 exception:numerical-overflow
563 (remainder (+ fixnum-max 1) 0)))
564
de142bea
DH
565 ;; Are wrong type arguments detected correctly?
566
567 )
568
569;;;
570;;; modulo
571;;;
572
573(with-test-prefix "modulo"
574
de142bea 575 (expect-fail "documented?"
cb18f2a8 576 (documented? modulo))
de142bea 577
de142bea
DH
578 (with-test-prefix "0 % n"
579
580 (pass-if "n = 1"
581 (eqv? 0 (modulo 0 1)))
582
583 (pass-if "n = -1"
584 (eqv? 0 (modulo 0 -1)))
585
21e39e8f
DH
586 (pass-if "n = fixnum-max"
587 (eqv? 0 (modulo 0 fixnum-max)))
588
589 (pass-if "n = fixnum-max + 1"
590 (eqv? 0 (modulo 0 (+ fixnum-max 1))))
de142bea 591
21e39e8f
DH
592 (pass-if "n = fixnum-min"
593 (eqv? 0 (modulo 0 fixnum-min)))
de142bea 594
21e39e8f
DH
595 (pass-if "n = fixnum-min - 1"
596 (eqv? 0 (modulo 0 (- fixnum-min 1)))))
597
598 (with-test-prefix "1 % n"
de142bea
DH
599
600 (pass-if "n = 1"
601 (eqv? 0 (modulo 1 1)))
602
603 (pass-if "n = -1"
21e39e8f 604 (eqv? 0 (modulo 1 -1)))
de142bea 605
21e39e8f
DH
606 (pass-if "n = fixnum-max"
607 (eqv? 1 (modulo 1 fixnum-max)))
de142bea 608
21e39e8f
DH
609 (pass-if "n = fixnum-max + 1"
610 (eqv? 1 (modulo 1 (+ fixnum-max 1))))
de142bea 611
21e39e8f
DH
612 (pass-if "n = fixnum-min"
613 (eqv? (+ fixnum-min 1) (modulo 1 fixnum-min)))
614
615 (pass-if "n = fixnum-min - 1"
616 (eqv? fixnum-min (modulo 1 (- fixnum-min 1)))))
617
618 (with-test-prefix "-1 % n"
de142bea
DH
619
620 (pass-if "n = 1"
21e39e8f 621 (eqv? 0 (modulo -1 1)))
de142bea
DH
622
623 (pass-if "n = -1"
624 (eqv? 0 (modulo -1 -1)))
625
21e39e8f
DH
626 (pass-if "n = fixnum-max"
627 (eqv? (- fixnum-max 1) (modulo -1 fixnum-max)))
628
629 (pass-if "n = fixnum-max + 1"
630 (eqv? fixnum-max (modulo -1 (+ fixnum-max 1))))
631
632 (pass-if "n = fixnum-min"
633 (eqv? -1 (modulo -1 fixnum-min)))
634
635 (pass-if "n = fixnum-min - 1"
636 (eqv? -1 (modulo -1 (- fixnum-min 1)))))
637
638 (with-test-prefix "fixnum-max % n"
639
640 (pass-if "n = 1"
641 (eqv? 0 (modulo fixnum-max 1)))
642
643 (pass-if "n = -1"
644 (eqv? 0 (modulo fixnum-max -1)))
645
646 (pass-if "n = fixnum-max"
647 (eqv? 0 (modulo fixnum-max fixnum-max)))
648
649 (pass-if "n = fixnum-max + 1"
650 (eqv? fixnum-max (modulo fixnum-max (+ fixnum-max 1))))
651
652 (pass-if "n = fixnum-min"
653 (eqv? -1 (modulo fixnum-max fixnum-min)))
654
655 (pass-if "n = fixnum-min - 1"
656 (eqv? -2 (modulo fixnum-max (- fixnum-min 1)))))
657
658 (with-test-prefix "(fixnum-max + 1) % n"
659
660 (pass-if "n = 1"
661 (eqv? 0 (modulo (+ fixnum-max 1) 1)))
662
663 (pass-if "n = -1"
664 (eqv? 0 (modulo (+ fixnum-max 1) -1)))
665
666 (pass-if "n = fixnum-max"
667 (eqv? 1 (modulo (+ fixnum-max 1) fixnum-max)))
668
669 (pass-if "n = fixnum-max + 1"
670 (eqv? 0 (modulo (+ fixnum-max 1) (+ fixnum-max 1))))
671
672 (pass-if "n = fixnum-min"
673 (eqv? 0 (modulo (+ fixnum-max 1) fixnum-min)))
674
675 (pass-if "n = fixnum-min - 1"
676 (eqv? -1 (modulo (+ fixnum-max 1) (- fixnum-min 1)))))
677
678 (with-test-prefix "fixnum-min % n"
679
680 (pass-if "n = 1"
681 (eqv? 0 (modulo fixnum-min 1)))
682
683 (pass-if "n = -1"
684 (eqv? 0 (modulo fixnum-min -1)))
685
686 (pass-if "n = fixnum-max"
687 (eqv? (- fixnum-max 1) (modulo fixnum-min fixnum-max)))
688
689 (pass-if "n = fixnum-max + 1"
690 (eqv? 0 (modulo fixnum-min (+ fixnum-max 1))))
691
692 (pass-if "n = fixnum-min"
693 (eqv? 0 (modulo fixnum-min fixnum-min)))
694
695 (pass-if "n = fixnum-min - 1"
696 (eqv? fixnum-min (modulo fixnum-min (- fixnum-min 1)))))
697
698 (with-test-prefix "(fixnum-min - 1) % n"
699
700 (pass-if "n = 1"
701 (eqv? 0 (modulo (- fixnum-min 1) 1)))
702
703 (pass-if "n = -1"
704 (eqv? 0 (modulo (- fixnum-min 1) -1)))
705
706 (pass-if "n = fixnum-max"
707 (eqv? (- fixnum-max 2) (modulo (- fixnum-min 1) fixnum-max)))
708
709 (pass-if "n = fixnum-max + 1"
710 (eqv? fixnum-max (modulo (- fixnum-min 1) (+ fixnum-max 1))))
711
712 (pass-if "n = fixnum-min"
713 (eqv? -1 (modulo (- fixnum-min 1) fixnum-min)))
714
715 (pass-if "n = fixnum-min - 1"
716 (eqv? 0 (modulo (- fixnum-min 1) (- fixnum-min 1)))))
de142bea
DH
717
718 ;; Positive dividend and divisor
719
720 (pass-if "13 % 4"
721 (eqv? 1 (modulo 13 4)))
722
723 (pass-if "2177452800 % 86400"
724 (eqv? 0 (modulo 2177452800 86400)))
725
726 ;; Negative dividend, positive divisor
727
728 (pass-if "-13 % 4"
729 (eqv? 3 (modulo -13 4)))
730
731 (pass-if "-2177452800 % 86400"
732 (eqv? 0 (modulo -2177452800 86400)))
733
734 ;; Positive dividend, negative divisor
735
736 (pass-if "13 % -4"
737 (eqv? -3 (modulo 13 -4)))
738
739 (pass-if "2177452800 % -86400"
740 (eqv? 0 (modulo 2177452800 -86400)))
741
742 ;; Negative dividend and divisor
743
744 (pass-if "-13 % -4"
745 (eqv? -1 (modulo -13 -4)))
746
747 (pass-if "-2177452800 % -86400"
748 (eqv? 0 (modulo -2177452800 -86400)))
749
750 ;; Are numerical overflows detected correctly?
751
80074d77
DH
752 (with-test-prefix "division by zero"
753
754 (pass-if-exception "(modulo 1 0)"
755 exception:numerical-overflow
756 (modulo 1 0))
757
758 (pass-if-exception "(modulo bignum 0)"
759 exception:numerical-overflow
760 (modulo (+ fixnum-max 1) 0)))
761
de142bea
DH
762 ;; Are wrong type arguments detected correctly?
763
764 )
765
766;;;
767;;; gcd
768;;;
769
770(with-test-prefix "gcd"
771
de142bea 772 (expect-fail "documented?"
cb18f2a8 773 (documented? gcd))
de142bea 774
de142bea
DH
775 (with-test-prefix "(0 n)"
776
21e39e8f
DH
777 (pass-if "n = 0"
778 (eqv? 0 (gcd 0 0)))
779
de142bea
DH
780 (pass-if "n = 1"
781 (eqv? 1 (gcd 0 1)))
782
783 (pass-if "n = -1"
784 (eqv? 1 (gcd 0 -1)))
785
21e39e8f
DH
786 (pass-if "n = fixnum-max"
787 (eqv? fixnum-max (gcd 0 fixnum-max)))
de142bea 788
21e39e8f
DH
789 (pass-if "n = fixnum-max + 1"
790 (eqv? (+ fixnum-max 1) (gcd 0 (+ fixnum-max 1))))
de142bea 791
21e39e8f
DH
792 (pass-if "n = fixnum-min"
793 (eqv? (- fixnum-min) (gcd 0 fixnum-min)))
de142bea 794
21e39e8f
DH
795 (pass-if "n = fixnum-min - 1"
796 (eqv? (- (- fixnum-min 1)) (gcd 0 (- fixnum-min 1)))))
797
db386f80
KR
798 (with-test-prefix "(n 0)"
799
800 (pass-if "n = 2^128 * fixnum-max"
801 (eqv? (ash fixnum-max 128) (gcd (ash fixnum-max 128) 0))))
802
21e39e8f
DH
803 (with-test-prefix "(1 n)"
804
805 (pass-if "n = 0"
de142bea
DH
806 (eqv? 1 (gcd 1 0)))
807
21e39e8f
DH
808 (pass-if "n = 1"
809 (eqv? 1 (gcd 1 1)))
810
de142bea 811 (pass-if "n = -1"
21e39e8f
DH
812 (eqv? 1 (gcd 1 -1)))
813
814 (pass-if "n = fixnum-max"
815 (eqv? 1 (gcd 1 fixnum-max)))
816
817 (pass-if "n = fixnum-max + 1"
818 (eqv? 1 (gcd 1 (+ fixnum-max 1))))
819
820 (pass-if "n = fixnum-min"
821 (eqv? 1 (gcd 1 fixnum-min)))
822
823 (pass-if "n = fixnum-min - 1"
824 (eqv? 1 (gcd 1 (- fixnum-min 1)))))
825
826 (with-test-prefix "(-1 n)"
827
828 (pass-if "n = 0"
de142bea
DH
829 (eqv? 1 (gcd -1 0)))
830
21e39e8f
DH
831 (pass-if "n = 1"
832 (eqv? 1 (gcd -1 1)))
de142bea 833
21e39e8f
DH
834 (pass-if "n = -1"
835 (eqv? 1 (gcd -1 -1)))
de142bea 836
21e39e8f
DH
837 (pass-if "n = fixnum-max"
838 (eqv? 1 (gcd -1 fixnum-max)))
839
840 (pass-if "n = fixnum-max + 1"
841 (eqv? 1 (gcd -1 (+ fixnum-max 1))))
842
843 (pass-if "n = fixnum-min"
844 (eqv? 1 (gcd -1 fixnum-min)))
845
846 (pass-if "n = fixnum-min - 1"
847 (eqv? 1 (gcd -1 (- fixnum-min 1)))))
848
849 (with-test-prefix "(fixnum-max n)"
850
851 (pass-if "n = 0"
852 (eqv? fixnum-max (gcd fixnum-max 0)))
de142bea
DH
853
854 (pass-if "n = 1"
21e39e8f 855 (eqv? 1 (gcd fixnum-max 1)))
de142bea
DH
856
857 (pass-if "n = -1"
21e39e8f
DH
858 (eqv? 1 (gcd fixnum-max -1)))
859
860 (pass-if "n = fixnum-max"
861 (eqv? fixnum-max (gcd fixnum-max fixnum-max)))
de142bea 862
21e39e8f
DH
863 (pass-if "n = fixnum-max + 1"
864 (eqv? 1 (gcd fixnum-max (+ fixnum-max 1))))
de142bea 865
21e39e8f
DH
866 (pass-if "n = fixnum-min"
867 (eqv? 1 (gcd fixnum-max fixnum-min)))
de142bea 868
21e39e8f
DH
869 (pass-if "n = fixnum-min - 1"
870 (eqv? 1 (gcd fixnum-max (- fixnum-min 1)))))
871
872 (with-test-prefix "((+ fixnum-max 1) n)"
873
874 (pass-if "n = 0"
875 (eqv? (+ fixnum-max 1) (gcd (+ fixnum-max 1) 0)))
876
877 (pass-if "n = 1"
878 (eqv? 1 (gcd (+ fixnum-max 1) 1)))
de142bea
DH
879
880 (pass-if "n = -1"
21e39e8f 881 (eqv? 1 (gcd (+ fixnum-max 1) -1)))
de142bea 882
21e39e8f
DH
883 (pass-if "n = fixnum-max"
884 (eqv? 1 (gcd (+ fixnum-max 1) fixnum-max)))
de142bea 885
21e39e8f
DH
886 (pass-if "n = fixnum-max + 1"
887 (eqv? (+ fixnum-max 1) (gcd (+ fixnum-max 1) (+ fixnum-max 1))))
de142bea 888
21e39e8f
DH
889 (pass-if "n = fixnum-min"
890 (eqv? (+ fixnum-max 1) (gcd (+ fixnum-max 1) fixnum-min)))
891
892 (pass-if "n = fixnum-min - 1"
893 (eqv? 1 (gcd (+ fixnum-max 1) (- fixnum-min 1)))))
894
895 (with-test-prefix "(fixnum-min n)"
896
897 (pass-if "n = 0"
898 (eqv? (- fixnum-min) (gcd fixnum-min 0)))
899
900 (pass-if "n = 1"
901 (eqv? 1 (gcd fixnum-min 1)))
de142bea
DH
902
903 (pass-if "n = -1"
21e39e8f
DH
904 (eqv? 1 (gcd fixnum-min -1)))
905
906 (pass-if "n = fixnum-max"
907 (eqv? 1 (gcd fixnum-min fixnum-max)))
908
909 (pass-if "n = fixnum-max + 1"
910 (eqv? (+ fixnum-max 1) (gcd fixnum-min (+ fixnum-max 1))))
de142bea 911
21e39e8f
DH
912 (pass-if "n = fixnum-min"
913 (eqv? (- fixnum-min) (gcd fixnum-min fixnum-min)))
914
915 (pass-if "n = fixnum-min - 1"
916 (eqv? 1 (gcd fixnum-min (- fixnum-min 1)))))
917
918 (with-test-prefix "((- fixnum-min 1) n)"
919
920 (pass-if "n = 0"
921 (eqv? (- (- fixnum-min 1)) (gcd (- fixnum-min 1) 0)))
922
923 (pass-if "n = 1"
924 (eqv? 1 (gcd (- fixnum-min 1) 1)))
925
926 (pass-if "n = -1"
927 (eqv? 1 (gcd (- fixnum-min 1) -1)))
928
929 (pass-if "n = fixnum-max"
930 (eqv? 1 (gcd (- fixnum-min 1) fixnum-max)))
931
932 (pass-if "n = fixnum-max + 1"
933 (eqv? 1 (gcd (- fixnum-min 1) (+ fixnum-max 1))))
934
935 (pass-if "n = fixnum-min"
936 (eqv? 1 (gcd (- fixnum-min 1) fixnum-min)))
937
938 (pass-if "n = fixnum-min - 1"
939 (eqv? (- (- fixnum-min 1)) (gcd (- fixnum-min 1) (- fixnum-min 1)))))
de142bea
DH
940
941 ;; Are wrong type arguments detected correctly?
942
943 )
944
f29b3454
DH
945;;;
946;;; lcm
947;;;
948
7c24e528
RB
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)))))
959
f29b3454
DH
960;;;
961;;; number->string
962;;;
963
7c24e528
RB
964(with-test-prefix "number->string"
965 (let ((num->str->num
966 (lambda (n radix)
967 (string->number (number->string n radix) radix))))
968
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)))))
976
f29b3454
DH
977;;;
978;;; string->number
979;;;
980
2f4a254a
DH
981(with-test-prefix "string->number"
982
983 (pass-if "string->number"
984 (documented? string->number))
985
986 (pass-if "non number strings"
987 (for-each (lambda (x) (if (string->number x) (throw 'fail)))
569c483b 988 '("" "q" "1q" "6+7iq" "8+9q" "10+11" "13+" "18@19q" "20@q" "23@"
2f4a254a 989 "+25iq" "26i" "-q" "-iq" "i" "5#.0" "8/" "10#11" ".#" "."
569c483b 990 "#o.2" "3.4q" "15.16e17q" "18.19e+q" ".q" ".17#18" "10q" "#b2"
2f4a254a
DH
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"
993 "#i#i1" "12@12+0i"))
994 #t)
995
b7d9b1cf
DH
996 (pass-if "valid number strings"
997 (for-each (lambda (couple)
998 (apply
999 (lambda (x y)
9dd9857f
MV
1000 (let ((xx (string->number x)))
1001 (if (or (eq? xx #f) (not (eqv? xx y)))
1002 (throw 'fail))))
b7d9b1cf
DH
1003 couple))
1004 `(;; Radix:
1005 ("#b0" 0) ("#B0" 0) ("#b1" 1) ("#B1" 1) ("#o0" 0) ("#O0" 0)
1006 ("#o1" 1) ("#O1" 1) ("#o2" 2) ("#O2" 2) ("#o3" 3) ("#O3" 3)
1007 ("#o4" 4) ("#O4" 4) ("#o5" 5) ("#O5" 5) ("#o6" 6) ("#O6" 6)
1008 ("#o7" 7) ("#O7" 7) ("#d0" 0) ("#D0" 0) ("#d1" 1) ("#D1" 1)
1009 ("#d2" 2) ("#D2" 2) ("#d3" 3) ("#D3" 3) ("#d4" 4) ("#D4" 4)
1010 ("#d5" 5) ("#D5" 5) ("#d6" 6) ("#D6" 6) ("#d7" 7) ("#D7" 7)
1011 ("#d8" 8) ("#D8" 8) ("#d9" 9) ("#D9" 9)
1012 ("#xa" 10) ("#Xa" 10) ("#xb" 11) ("#Xb" 11)
1013 ("#xc" 12) ("#Xc" 12) ("#xd" 13) ("#Xd" 13)
1014 ("#xe" 14) ("#Xe" 14) ("#xf" 15) ("#Xf" 15)
1015 ("#b1010" 10)
1016 ("#o12345670" 2739128)
1017 ("#d1234567890" 1234567890)
1018 ("#x1234567890abcdef" 1311768467294899695)
1019 ;; Exactness:
9dd9857f
MV
1020 ("#e1" 1) ("#e1.2" ,(inexact->exact 1.2))
1021 ("#i1.1" 1.1) ("#i1" 1.0)
b7d9b1cf
DH
1022 ;; Integers:
1023 ("1" ,(1+ 0)) ("23" ,(+ 9 9 5)) ("-1" ,(- 0 1))
1024 ("-45" ,(- 0 45)) ("2#" 20.0) ("2##" 200.0) ("12##" 1200.0)
1025 ("#b#i100" 4.0)
9dd9857f
MV
1026 ;; Fractions:
1027 ("1/1" 1) ("1/2" 1/2) ("-1/2" -1/2) ("1#/1" 10.0)
1028 ("10/1#" 1.0) ("1#/1#" 1.0) ("#e9/10" 9/10) ("#e10/1#" 1)
b7d9b1cf
DH
1029 ("#i6/8" 0.75) ("#i1/1" 1.0)
1030 ;; Decimal numbers:
1031 ;; * <uinteger 10> <suffix>
1032 ("1e2" 100.0) ("1E2" 100.0) ("1s2" 100.0) ("1S2" 100.0)
1033 ("1f2" 100.0) ("1F2" 100.0) ("1d2" 100.0) ("1D2" 100.0)
1034 ("1l2" 100.0) ("1L2" 100.0) ("1e+2" 100.0) ("1e-2" 0.01)
1035 ;; * . <digit 10>+ #* <suffix>
1036 (".1" .1) (".0123456789" 123456789e-10) (".16#" 0.16)
1037 (".0123456789e10" 123456789.0) (".16#e3" 160.0) ("#d.3" 0.3)
1038 ;; * <digit 10>+ . <digit 10>* #* <suffix>
1039 ("3." ,(exact->inexact 3)) ("3.e0" ,(exact->inexact 3))
1040 ("3.1" ,(exact->inexact 31/10)) ("3.1e0" 3.1) ("3.1#" 3.1)
1041 ("3.1#e0" 3.1)
1042 ;; * <digit 10>+ #+ . #* <suffix>
1043 ("3#." 30.0) ("3#.e0" 30.0) ("3#.#" 30.0) ("3#.#e0" 30.0)
1044 ;; Complex:
1045 ("1@0" 1.0) ("1@+0" 1.0) ("1@-0" 1.0)
1046 ("2+3i" ,(+ 2 (* 3 +i))) ("4-5i" ,(- 4 (* 5 +i)))
1047 ("1+i" 1+1i) ("1-i" 1-1i) ("+1i" 0+1i) ("-1i" 0-1i)
1048 ("+i" +1i) ("-i" -1i)))
1049 #t)
1050
2f4a254a
DH
1051 (pass-if-exception "exponent too big"
1052 exception:out-of-range
1053 (string->number "12.13e141414")))
1054
f29b3454
DH
1055;;;
1056;;; number?
1057;;;
1058
7c24e528
RB
1059(with-test-prefix "number?"
1060 (pass-if (documented? number?))
1061 (pass-if (number? 0))
1062 (pass-if (number? 7))
1063 (pass-if (number? -7))
1064 (pass-if (number? 1.3))
1065 (pass-if (number? (+ 1 fixnum-max)))
1066 (pass-if (number? (- 1 fixnum-min)))
1067 (pass-if (number? 3+4i))
4d332f19
DH
1068 (pass-if (not (number? #\a)))
1069 (pass-if (not (number? "a")))
1070 (pass-if (not (number? (make-vector 0))))
1071 (pass-if (not (number? (cons 1 2))))
1072 (pass-if (not (number? #t)))
1073 (pass-if (not (number? (lambda () #t))))
1074 (pass-if (not (number? (current-input-port)))))
7c24e528 1075
f29b3454
DH
1076;;;
1077;;; complex?
1078;;;
1079
7c24e528
RB
1080(with-test-prefix "complex?"
1081 (pass-if (documented? complex?))
1082 (pass-if (complex? 0))
1083 (pass-if (complex? 7))
1084 (pass-if (complex? -7))
1085 (pass-if (complex? (+ 1 fixnum-max)))
1086 (pass-if (complex? (- 1 fixnum-min)))
1087 (pass-if (complex? 1.3))
1088 (pass-if (complex? 3+4i))
4d332f19
DH
1089 (pass-if (not (complex? #\a)))
1090 (pass-if (not (complex? "a")))
1091 (pass-if (not (complex? (make-vector 0))))
1092 (pass-if (not (complex? (cons 1 2))))
1093 (pass-if (not (complex? #t)))
1094 (pass-if (not (complex? (lambda () #t))))
1095 (pass-if (not (complex? (current-input-port)))))
7c24e528 1096
f29b3454
DH
1097;;;
1098;;; real?
1099;;;
1100
7c24e528
RB
1101(with-test-prefix "real?"
1102 (pass-if (documented? real?))
1103 (pass-if (real? 0))
1104 (pass-if (real? 7))
1105 (pass-if (real? -7))
1106 (pass-if (real? (+ 1 fixnum-max)))
1107 (pass-if (real? (- 1 fixnum-min)))
1108 (pass-if (real? 1.3))
4d332f19
DH
1109 (pass-if (not (real? 3+4i)))
1110 (pass-if (not (real? #\a)))
1111 (pass-if (not (real? "a")))
1112 (pass-if (not (real? (make-vector 0))))
1113 (pass-if (not (real? (cons 1 2))))
1114 (pass-if (not (real? #t)))
1115 (pass-if (not (real? (lambda () #t))))
1116 (pass-if (not (real? (current-input-port)))))
7c24e528 1117
f29b3454 1118;;;
7c24e528 1119;;; rational? (same as real? right now)
f29b3454
DH
1120;;;
1121
7c24e528
RB
1122(with-test-prefix "rational?"
1123 (pass-if (documented? rational?))
1124 (pass-if (rational? 0))
1125 (pass-if (rational? 7))
1126 (pass-if (rational? -7))
1127 (pass-if (rational? (+ 1 fixnum-max)))
1128 (pass-if (rational? (- 1 fixnum-min)))
1129 (pass-if (rational? 1.3))
4d332f19
DH
1130 (pass-if (not (rational? 3+4i)))
1131 (pass-if (not (rational? #\a)))
1132 (pass-if (not (rational? "a")))
1133 (pass-if (not (rational? (make-vector 0))))
1134 (pass-if (not (rational? (cons 1 2))))
1135 (pass-if (not (rational? #t)))
1136 (pass-if (not (rational? (lambda () #t))))
1137 (pass-if (not (rational? (current-input-port)))))
7c24e528 1138
f29b3454
DH
1139;;;
1140;;; integer?
1141;;;
1142
7c24e528
RB
1143(with-test-prefix "integer?"
1144 (pass-if (documented? integer?))
1145 (pass-if (integer? 0))
1146 (pass-if (integer? 7))
1147 (pass-if (integer? -7))
1148 (pass-if (integer? (+ 1 fixnum-max)))
1149 (pass-if (integer? (- 1 fixnum-min)))
1150 (pass-if (and (= 3+0i (round 3+0i)) (integer? 3+0i)))
1151 (pass-if (and (= 1.0 (round 1.0)) (integer? 1.0)))
4d332f19
DH
1152 (pass-if (not (integer? 1.3)))
1153 (pass-if (not (integer? 3+4i)))
1154 (pass-if (not (integer? #\a)))
1155 (pass-if (not (integer? "a")))
1156 (pass-if (not (integer? (make-vector 0))))
1157 (pass-if (not (integer? (cons 1 2))))
1158 (pass-if (not (integer? #t)))
1159 (pass-if (not (integer? (lambda () #t))))
1160 (pass-if (not (integer? (current-input-port)))))
7c24e528 1161
f29b3454
DH
1162;;;
1163;;; inexact?
1164;;;
1165
7c24e528
RB
1166(with-test-prefix "inexact?"
1167 (pass-if (documented? inexact?))
4d332f19
DH
1168 (pass-if (not (inexact? 0)))
1169 (pass-if (not (inexact? 7)))
1170 (pass-if (not (inexact? -7)))
1171 (pass-if (not (inexact? (+ 1 fixnum-max))))
1172 (pass-if (not (inexact? (- 1 fixnum-min))))
7c24e528
RB
1173 (pass-if (inexact? 1.3))
1174 (pass-if (inexact? 3.1+4.2i))
4d332f19
DH
1175 (pass-if (not (inexact? #\a)))
1176 (pass-if (not (inexact? "a")))
1177 (pass-if (not (inexact? (make-vector 0))))
1178 (pass-if (not (inexact? (cons 1 2))))
1179 (pass-if (not (inexact? #t)))
1180 (pass-if (not (inexact? (lambda () #t))))
1181 (pass-if (not (inexact? (current-input-port)))))
7c24e528 1182
47ae1f0e
DH
1183;;;
1184;;; equal?
1185;;;
1186
1187(with-test-prefix "equal?"
1188 (pass-if (documented? equal?))
1189 (pass-if (equal? 0 0))
1190 (pass-if (equal? 7 7))
1191 (pass-if (equal? -7 -7))
1192 (pass-if (equal? (+ 1 fixnum-max) (+ 1 fixnum-max)))
1193 (pass-if (equal? (- fixnum-min 1) (- fixnum-min 1)))
1194 (pass-if (not (equal? 0 1)))
1195 (pass-if (not (equal? fixnum-max (+ 1 fixnum-max))))
1196 (pass-if (not (equal? (+ 1 fixnum-max) fixnum-max)))
1197 (pass-if (not (equal? (+ 1 fixnum-max) (+ 2 fixnum-max))))
1198 (pass-if (not (equal? fixnum-min (- fixnum-min 1))))
1199 (pass-if (not (equal? (- fixnum-min 1) fixnum-min)))
1200 (pass-if (not (equal? (- fixnum-min 1) (- fixnum-min 2))))
1201 (pass-if (not (equal? (+ fixnum-max 1) (- fixnum-min 1))))
1202
1203 (pass-if (not (equal? (ash 1 256) +inf.0)))
1204 (pass-if (not (equal? +inf.0 (ash 1 256))))
1205 (pass-if (not (equal? (ash 1 256) -inf.0)))
1206 (pass-if (not (equal? -inf.0 (ash 1 256))))
1207
1208 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating Inf as 2^1024, make
1209 ;; sure we've avoided that
1210 (pass-if (not (equal? (ash 1 1024) +inf.0)))
1211 (pass-if (not (equal? +inf.0 (ash 1 1024))))
1212 (pass-if (not (equal? (- (ash 1 1024)) -inf.0)))
1213 (pass-if (not (equal? -inf.0 (- (ash 1 1024)))))
1214
1215 (pass-if (not (equal? +nan.0 +nan.0)))
1216 (pass-if (not (equal? 0 +nan.0)))
1217 (pass-if (not (equal? +nan.0 0)))
1218 (pass-if (not (equal? 1 +nan.0)))
1219 (pass-if (not (equal? +nan.0 1)))
1220 (pass-if (not (equal? -1 +nan.0)))
1221 (pass-if (not (equal? +nan.0 -1)))
1222
1223 (pass-if (not (equal? (ash 1 256) +nan.0)))
1224 (pass-if (not (equal? +nan.0 (ash 1 256))))
1225 (pass-if (not (equal? (- (ash 1 256)) +nan.0)))
1226 (pass-if (not (equal? +nan.0 (- (ash 1 256)))))
1227
1228 (pass-if (not (equal? (ash 1 8192) +nan.0)))
1229 (pass-if (not (equal? +nan.0 (ash 1 8192))))
1230 (pass-if (not (equal? (- (ash 1 8192)) +nan.0)))
1231 (pass-if (not (equal? +nan.0 (- (ash 1 8192)))))
1232
1233 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating NaN as 3*2^1023, make
1234 ;; sure we've avoided that
1235 (pass-if (not (equal? (ash 3 1023) +nan.0)))
1236 (pass-if (not (equal? +nan.0 (ash 3 1023)))))
1237
f29b3454
DH
1238;;;
1239;;; =
1240;;;
1241
7c24e528
RB
1242(with-test-prefix "="
1243 (expect-fail (documented? =))
1244 (pass-if (= 0 0))
1245 (pass-if (= 7 7))
1246 (pass-if (= -7 -7))
1247 (pass-if (= (+ 1 fixnum-max) (+ 1 fixnum-max)))
47ae1f0e 1248 (pass-if (= (- fixnum-min 1) (- fixnum-min 1)))
4d332f19
DH
1249 (pass-if (not (= 0 1)))
1250 (pass-if (not (= fixnum-max (+ 1 fixnum-max))))
1251 (pass-if (not (= (+ 1 fixnum-max) fixnum-max)))
47ae1f0e 1252 (pass-if (not (= (+ 1 fixnum-max) (+ 2 fixnum-max))))
4d332f19
DH
1253 (pass-if (not (= fixnum-min (- fixnum-min 1))))
1254 (pass-if (not (= (- fixnum-min 1) fixnum-min)))
47ae1f0e 1255 (pass-if (not (= (- fixnum-min 1) (- fixnum-min 2))))
4d332f19 1256 (pass-if (not (= (+ fixnum-max 1) (- fixnum-min 1))))
2cfcaed5 1257
adda36ed
KR
1258 (pass-if (not (= (ash 1 256) +inf.0)))
1259 (pass-if (not (= +inf.0 (ash 1 256))))
1260 (pass-if (not (= (ash 1 256) -inf.0)))
1261 (pass-if (not (= -inf.0 (ash 1 256))))
1262
1263 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating Inf as 2^1024, make
1264 ;; sure we've avoided that
1265 (pass-if (not (= (ash 1 1024) +inf.0)))
1266 (pass-if (not (= +inf.0 (ash 1 1024))))
1267 (pass-if (not (= (- (ash 1 1024)) -inf.0)))
1268 (pass-if (not (= -inf.0 (- (ash 1 1024)))))
1269
2cfcaed5
KR
1270 (pass-if (not (= +nan.0 +nan.0)))
1271 (pass-if (not (= 0 +nan.0)))
1272 (pass-if (not (= +nan.0 0)))
1273 (pass-if (not (= 1 +nan.0)))
1274 (pass-if (not (= +nan.0 1)))
1275 (pass-if (not (= -1 +nan.0)))
1276 (pass-if (not (= +nan.0 -1)))
1277
1278 (pass-if (not (= (ash 1 256) +nan.0)))
1279 (pass-if (not (= +nan.0 (ash 1 256))))
1280 (pass-if (not (= (- (ash 1 256)) +nan.0)))
1281 (pass-if (not (= +nan.0 (- (ash 1 256)))))
1282
1283 (pass-if (not (= (ash 1 8192) +nan.0)))
1284 (pass-if (not (= +nan.0 (ash 1 8192))))
1285 (pass-if (not (= (- (ash 1 8192)) +nan.0)))
1286 (pass-if (not (= +nan.0 (- (ash 1 8192)))))
1287
1288 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating NaN as 3*2^1023, make
1289 ;; sure we've avoided that
1290 (pass-if (not (= (ash 3 1023) +nan.0)))
1291 (pass-if (not (= +nan.0 (ash 3 1023)))))
7c24e528 1292
de142bea
DH
1293;;;
1294;;; <
1295;;;
1296
1297(with-test-prefix "<"
1298
de142bea 1299 (expect-fail "documented?"
cb18f2a8 1300 (documented? <))
de142bea 1301
de142bea
DH
1302 (with-test-prefix "(< 0 n)"
1303
1304 (pass-if "n = 0"
1305 (not (< 0 0)))
1306
1307 (pass-if "n = 0.0"
1308 (not (< 0 0.0)))
1309
1310 (pass-if "n = 1"
1311 (< 0 1))
1312
1313 (pass-if "n = 1.0"
1314 (< 0 1.0))
1315
1316 (pass-if "n = -1"
1317 (not (< 0 -1)))
1318
1319 (pass-if "n = -1.0"
1320 (not (< 0 -1.0)))
1321
21e39e8f
DH
1322 (pass-if "n = fixnum-max"
1323 (< 0 fixnum-max))
1324
1325 (pass-if "n = fixnum-max + 1"
1326 (< 0 (+ fixnum-max 1)))
1327
1328 (pass-if "n = fixnum-min"
1329 (not (< 0 fixnum-min)))
de142bea 1330
21e39e8f
DH
1331 (pass-if "n = fixnum-min - 1"
1332 (not (< 0 (- fixnum-min 1)))))
1333
de142bea
DH
1334 (with-test-prefix "(< 0.0 n)"
1335
1336 (pass-if "n = 0"
1337 (not (< 0.0 0)))
1338
1339 (pass-if "n = 0.0"
1340 (not (< 0.0 0.0)))
1341
1342 (pass-if "n = 1"
1343 (< 0.0 1))
1344
1345 (pass-if "n = 1.0"
1346 (< 0.0 1.0))
1347
1348 (pass-if "n = -1"
1349 (not (< 0.0 -1)))
1350
1351 (pass-if "n = -1.0"
1352 (not (< 0.0 -1.0)))
1353
21e39e8f
DH
1354 (pass-if "n = fixnum-max"
1355 (< 0.0 fixnum-max))
1356
1357 (pass-if "n = fixnum-max + 1"
1358 (< 0.0 (+ fixnum-max 1)))
de142bea 1359
21e39e8f
DH
1360 (pass-if "n = fixnum-min"
1361 (not (< 0.0 fixnum-min)))
1362
1363 (pass-if "n = fixnum-min - 1"
1364 (not (< 0.0 (- fixnum-min 1)))))
1365
1366 (with-test-prefix "(< 1 n)"
de142bea 1367
21e39e8f 1368 (pass-if "n = 0"
de142bea
DH
1369 (not (< 1 0)))
1370
21e39e8f
DH
1371 (pass-if "n = 0.0"
1372 (not (< 1 0.0)))
1373
1374 (pass-if "n = 1"
1375 (not (< 1 1)))
1376
de142bea 1377 (pass-if "n = 1.0"
21e39e8f
DH
1378 (not (< 1 1.0)))
1379
1380 (pass-if "n = -1"
1381 (not (< 1 -1)))
1382
1383 (pass-if "n = -1.0"
1384 (not (< 1 -1.0)))
1385
1386 (pass-if "n = fixnum-max"
1387 (< 1 fixnum-max))
1388
1389 (pass-if "n = fixnum-max + 1"
1390 (< 1 (+ fixnum-max 1)))
1391
1392 (pass-if "n = fixnum-min"
1393 (not (< 1 fixnum-min)))
1394
1395 (pass-if "n = fixnum-min - 1"
1396 (not (< 1 (- fixnum-min 1)))))
1397
1398 (with-test-prefix "(< 1.0 n)"
1399
1400 (pass-if "n = 0"
de142bea
DH
1401 (not (< 1.0 0)))
1402
21e39e8f
DH
1403 (pass-if "n = 0.0"
1404 (not (< 1.0 0.0)))
1405
1406 (pass-if "n = 1"
1407 (not (< 1.0 1)))
1408
1409 (pass-if "n = 1.0"
1410 (not (< 1.0 1.0)))
1411
de142bea 1412 (pass-if "n = -1"
21e39e8f
DH
1413 (not (< 1.0 -1)))
1414
1415 (pass-if "n = -1.0"
1416 (not (< 1.0 -1.0)))
1417
1418 (pass-if "n = fixnum-max"
1419 (< 1.0 fixnum-max))
1420
1421 (pass-if "n = fixnum-max + 1"
1422 (< 1.0 (+ fixnum-max 1)))
1423
1424 (pass-if "n = fixnum-min"
1425 (not (< 1.0 fixnum-min)))
1426
1427 (pass-if "n = fixnum-min - 1"
1428 (not (< 1.0 (- fixnum-min 1)))))
1429
1430 (with-test-prefix "(< -1 n)"
1431
1432 (pass-if "n = 0"
de142bea
DH
1433 (< -1 0))
1434
21e39e8f
DH
1435 (pass-if "n = 0.0"
1436 (< -1 0.0))
1437
1438 (pass-if "n = 1"
1439 (< -1 1))
1440
1441 (pass-if "n = 1.0"
1442 (< -1 1.0))
1443
1444 (pass-if "n = -1"
1445 (not (< -1 -1)))
1446
de142bea 1447 (pass-if "n = -1.0"
21e39e8f
DH
1448 (not (< -1 -1.0)))
1449
1450 (pass-if "n = fixnum-max"
1451 (< -1 fixnum-max))
1452
1453 (pass-if "n = fixnum-max + 1"
1454 (< -1 (+ fixnum-max 1)))
1455
1456 (pass-if "n = fixnum-min"
1457 (not (< -1 fixnum-min)))
1458
1459 (pass-if "n = fixnum-min - 1"
1460 (not (< -1 (- fixnum-min 1)))))
1461
1462 (with-test-prefix "(< -1.0 n)"
1463
1464 (pass-if "n = 0"
de142bea
DH
1465 (< -1.0 0))
1466
21e39e8f
DH
1467 (pass-if "n = 0.0"
1468 (< -1.0 0.0))
1469
1470 (pass-if "n = 1"
1471 (< -1.0 1))
1472
1473 (pass-if "n = 1.0"
1474 (< -1.0 1.0))
1475
1476 (pass-if "n = -1"
1477 (not (< -1.0 -1)))
1478
1479 (pass-if "n = -1.0"
1480 (not (< -1.0 -1.0)))
1481
1482 (pass-if "n = fixnum-max"
1483 (< -1.0 fixnum-max))
1484
1485 (pass-if "n = fixnum-max + 1"
1486 (< -1.0 (+ fixnum-max 1)))
de142bea 1487
21e39e8f
DH
1488 (pass-if "n = fixnum-min"
1489 (not (< -1.0 fixnum-min)))
1490
1491 (pass-if "n = fixnum-min - 1"
1492 (not (< -1.0 (- fixnum-min 1)))))
1493
1494 (with-test-prefix "(< fixnum-max n)"
1495
1496 (pass-if "n = 0"
1497 (not (< fixnum-max 0)))
1498
1499 (pass-if "n = 0.0"
1500 (not (< fixnum-max 0.0)))
de142bea
DH
1501
1502 (pass-if "n = 1"
21e39e8f 1503 (not (< fixnum-max 1)))
de142bea
DH
1504
1505 (pass-if "n = 1.0"
21e39e8f 1506 (not (< fixnum-max 1.0)))
de142bea
DH
1507
1508 (pass-if "n = -1"
21e39e8f 1509 (not (< fixnum-max -1)))
de142bea
DH
1510
1511 (pass-if "n = -1.0"
21e39e8f 1512 (not (< fixnum-max -1.0)))
de142bea 1513
21e39e8f
DH
1514 (pass-if "n = fixnum-max"
1515 (not (< fixnum-max fixnum-max)))
de142bea 1516
21e39e8f
DH
1517 (pass-if "n = fixnum-max + 1"
1518 (< fixnum-max (+ fixnum-max 1)))
1519
1520 (pass-if "n = fixnum-min"
1521 (not (< fixnum-max fixnum-min)))
1522
1523 (pass-if "n = fixnum-min - 1"
1524 (not (< fixnum-max (- fixnum-min 1)))))
1525
1526 (with-test-prefix "(< (+ fixnum-max 1) n)"
1527
1528 (pass-if "n = 0"
1529 (not (< (+ fixnum-max 1) 0)))
1530
1531 (pass-if "n = 0.0"
1532 (not (< (+ fixnum-max 1) 0.0)))
de142bea
DH
1533
1534 (pass-if "n = 1"
21e39e8f 1535 (not (< (+ fixnum-max 1) 1)))
de142bea
DH
1536
1537 (pass-if "n = 1.0"
21e39e8f 1538 (not (< (+ fixnum-max 1) 1.0)))
de142bea
DH
1539
1540 (pass-if "n = -1"
21e39e8f 1541 (not (< (+ fixnum-max 1) -1)))
de142bea
DH
1542
1543 (pass-if "n = -1.0"
21e39e8f 1544 (not (< (+ fixnum-max 1) -1.0)))
de142bea 1545
21e39e8f
DH
1546 (pass-if "n = fixnum-max"
1547 (not (< (+ fixnum-max 1) fixnum-max)))
de142bea 1548
21e39e8f
DH
1549 (pass-if "n = fixnum-max + 1"
1550 (not (< (+ fixnum-max 1) (+ fixnum-max 1))))
de142bea 1551
21e39e8f
DH
1552 (pass-if "n = fixnum-min"
1553 (not (< (+ fixnum-max 1) fixnum-min)))
1554
1555 (pass-if "n = fixnum-min - 1"
1556 (not (< (+ fixnum-max 1) (- fixnum-min 1)))))
1557
1558 (with-test-prefix "(< fixnum-min n)"
1559
1560 (pass-if "n = 0"
1561 (< fixnum-min 0))
1562
1563 (pass-if "n = 0.0"
1564 (< fixnum-min 0.0))
de142bea
DH
1565
1566 (pass-if "n = 1"
21e39e8f 1567 (< fixnum-min 1))
de142bea
DH
1568
1569 (pass-if "n = 1.0"
21e39e8f 1570 (< fixnum-min 1.0))
de142bea
DH
1571
1572 (pass-if "n = -1"
21e39e8f 1573 (< fixnum-min -1))
de142bea
DH
1574
1575 (pass-if "n = -1.0"
21e39e8f 1576 (< fixnum-min -1.0))
de142bea 1577
21e39e8f
DH
1578 (pass-if "n = fixnum-max"
1579 (< fixnum-min fixnum-max))
1580
1581 (pass-if "n = fixnum-max + 1"
1582 (< fixnum-min (+ fixnum-max 1)))
de142bea 1583
21e39e8f
DH
1584 (pass-if "n = fixnum-min"
1585 (not (< fixnum-min fixnum-min)))
de142bea 1586
21e39e8f
DH
1587 (pass-if "n = fixnum-min - 1"
1588 (not (< fixnum-min (- fixnum-min 1)))))
1589
1590 (with-test-prefix "(< (- fixnum-min 1) n)"
1591
1592 (pass-if "n = 0"
1593 (< (- fixnum-min 1) 0))
1594
1595 (pass-if "n = 0.0"
1596 (< (- fixnum-min 1) 0.0))
1597
1598 (pass-if "n = 1"
1599 (< (- fixnum-min 1) 1))
1600
1601 (pass-if "n = 1.0"
1602 (< (- fixnum-min 1) 1.0))
de142bea
DH
1603
1604 (pass-if "n = -1"
21e39e8f 1605 (< (- fixnum-min 1) -1))
de142bea
DH
1606
1607 (pass-if "n = -1.0"
21e39e8f
DH
1608 (< (- fixnum-min 1) -1.0))
1609
1610 (pass-if "n = fixnum-max"
1611 (< (- fixnum-min 1) fixnum-max))
1612
1613 (pass-if "n = fixnum-max + 1"
1614 (< (- fixnum-min 1) (+ fixnum-max 1)))
1615
1616 (pass-if "n = fixnum-min"
1617 (< (- fixnum-min 1) fixnum-min))
1618
1619 (pass-if "n = fixnum-min - 1"
2cfcaed5
KR
1620 (not (< (- fixnum-min 1) (- fixnum-min 1)))))
1621
adda36ed
KR
1622 (pass-if (< (ash 1 256) +inf.0))
1623 (pass-if (not (< +inf.0 (ash 1 256))))
1624 (pass-if (not (< (ash 1 256) -inf.0)))
1625 (pass-if (< -inf.0 (ash 1 256)))
1626
1627 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating Inf as 2^1024, make
1628 ;; sure we've avoided that
1629 (pass-if (< (1- (ash 1 1024)) +inf.0))
1630 (pass-if (< (ash 1 1024) +inf.0))
1631 (pass-if (< (1+ (ash 1 1024)) +inf.0))
1632 (pass-if (not (< +inf.0 (1- (ash 1 1024)))))
1633 (pass-if (not (< +inf.0 (ash 1 1024))))
1634 (pass-if (not (< +inf.0 (1+ (ash 1 1024)))))
1635 (pass-if (< -inf.0 (- (1- (ash 1 1024)))))
1636 (pass-if (< -inf.0 (- (ash 1 1024))))
1637 (pass-if (< -inf.0 (- (1+ (ash 1 1024)))))
1638 (pass-if (not (< (- (1- (ash 1 1024))) -inf.0)))
1639 (pass-if (not (< (- (ash 1 1024)) -inf.0)))
1640 (pass-if (not (< (- (1+ (ash 1 1024))) -inf.0)))
1641
2cfcaed5
KR
1642 (pass-if (not (< +nan.0 +nan.0)))
1643 (pass-if (not (< 0 +nan.0)))
1644 (pass-if (not (< +nan.0 0)))
1645 (pass-if (not (< 1 +nan.0)))
1646 (pass-if (not (< +nan.0 1)))
1647 (pass-if (not (< -1 +nan.0)))
1648 (pass-if (not (< +nan.0 -1)))
1649
1650 (pass-if (not (< (ash 1 256) +nan.0)))
1651 (pass-if (not (< +nan.0 (ash 1 256))))
1652 (pass-if (not (< (- (ash 1 256)) +nan.0)))
1653 (pass-if (not (< +nan.0 (- (ash 1 256)))))
1654
1655 (pass-if (not (< (ash 1 8192) +nan.0)))
1656 (pass-if (not (< +nan.0 (ash 1 8192))))
1657 (pass-if (not (< (- (ash 1 8192)) +nan.0)))
1658 (pass-if (not (< +nan.0 (- (ash 1 8192)))))
1659
1660 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating NaN as 3*2^1023, make
1661 ;; sure we've avoided that
1662 (pass-if (not (< (ash 3 1023) +nan.0)))
1663 (pass-if (not (< (1+ (ash 3 1023)) +nan.0)))
1664 (pass-if (not (< (1- (ash 3 1023)) +nan.0)))
1665 (pass-if (not (< +nan.0 (ash 3 1023))))
1666 (pass-if (not (< +nan.0 (1+ (ash 3 1023)))))
1667 (pass-if (not (< +nan.0 (1- (ash 3 1023))))))
f29b3454
DH
1668
1669;;;
1670;;; >
1671;;;
1672
7c24e528
RB
1673;; currently not tested -- implementation is trivial
1674;; (> x y) is implemented as (< y x)
1675;; FIXME: tests should probably be added in case we change implementation.
1676
f29b3454
DH
1677;;;
1678;;; <=
1679;;;
1680
7c24e528
RB
1681;; currently not tested -- implementation is trivial
1682;; (<= x y) is implemented as (not (< y x))
1683;; FIXME: tests should probably be added in case we change implementation.
1684
f29b3454
DH
1685;;;
1686;;; >=
1687;;;
1688
7c24e528
RB
1689;; currently not tested -- implementation is trivial
1690;; (>= x y) is implemented as (not (< x y))
1691;; FIXME: tests should probably be added in case we change implementation.
1692
f29b3454
DH
1693;;;
1694;;; zero?
1695;;;
1696
7c24e528
RB
1697(with-test-prefix "zero?"
1698 (expect-fail (documented? zero?))
1699 (pass-if (zero? 0))
4d332f19
DH
1700 (pass-if (not (zero? 7)))
1701 (pass-if (not (zero? -7)))
1702 (pass-if (not (zero? (+ 1 fixnum-max))))
1703 (pass-if (not (zero? (- 1 fixnum-min))))
1704 (pass-if (not (zero? 1.3)))
1705 (pass-if (not (zero? 3.1+4.2i))))
7c24e528 1706
f29b3454
DH
1707;;;
1708;;; positive?
1709;;;
1710
7c24e528
RB
1711(with-test-prefix "positive?"
1712 (expect-fail (documented? positive?))
1713 (pass-if (positive? 1))
1714 (pass-if (positive? (+ fixnum-max 1)))
1715 (pass-if (positive? 1.3))
4d332f19
DH
1716 (pass-if (not (positive? 0)))
1717 (pass-if (not (positive? -1)))
1718 (pass-if (not (positive? (- fixnum-min 1))))
1719 (pass-if (not (positive? -1.3))))
7c24e528 1720
f29b3454
DH
1721;;;
1722;;; negative?
1723;;;
1724
7c24e528
RB
1725(with-test-prefix "negative?"
1726 (expect-fail (documented? negative?))
4d332f19
DH
1727 (pass-if (not (negative? 1)))
1728 (pass-if (not (negative? (+ fixnum-max 1))))
1729 (pass-if (not (negative? 1.3)))
1730 (pass-if (not (negative? 0)))
7c24e528
RB
1731 (pass-if (negative? -1))
1732 (pass-if (negative? (- fixnum-min 1)))
1733 (pass-if (negative? -1.3)))
1734
f29b3454
DH
1735;;;
1736;;; max
1737;;;
1738
adda36ed 1739(with-test-prefix "max"
501da403
KR
1740 (pass-if (= 456.0 (max 123.0 456.0)))
1741 (pass-if (= 456.0 (max 456.0 123.0)))
1742
adda36ed
KR
1743 (let ((big*2 (* fixnum-max 2))
1744 (big*3 (* fixnum-max 3))
1745 (big*4 (* fixnum-max 4))
1746 (big*5 (* fixnum-max 5)))
1747
1748 (pass-if (= +inf.0 (max big*5 +inf.0)))
1749 (pass-if (= +inf.0 (max +inf.0 big*5)))
1750 (pass-if (= big*5 (max big*5 -inf.0)))
501da403
KR
1751 (pass-if (= big*5 (max -inf.0 big*5)))
1752
1753 (pass-if (nan? (max 123 +nan.0)))
1754 (pass-if (nan? (max big*5 +nan.0)))
1755 (pass-if (nan? (max 123.0 +nan.0)))
1756 (pass-if (nan? (max +nan.0 123)))
1757 (pass-if (nan? (max +nan.0 big*5)))
1758 (pass-if (nan? (max +nan.0 123.0)))
1759 (pass-if (nan? (max +nan.0 +nan.0))))
adda36ed
KR
1760
1761 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating Inf as 2^1024, make
1762 ;; sure we've avoided that
1763 (for-each (lambda (b)
1764 (pass-if (list b +inf.0)
1765 (= +inf.0 (max b +inf.0)))
1766 (pass-if (list +inf.0 b)
1767 (= +inf.0 (max b +inf.0)))
1768 (pass-if (list b -inf.0)
1769 (= b (max b -inf.0)))
1770 (pass-if (list -inf.0 b)
1771 (= b (max b -inf.0))))
1772 (list (1- (ash 1 1024))
1773 (ash 1 1024)
1774 (1+ (ash 1 1024))
1775 (- (1- (ash 1 1024)))
1776 (- (ash 1 1024))
501da403
KR
1777 (- (1+ (ash 1 1024)))))
1778
1779 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating NaN as 3*2^1023, make
1780 ;; sure we've avoided that
1781 (pass-if (nan? (max (ash 1 2048) +nan.0)))
1782 (pass-if (nan? (max +nan.0 (ash 1 2048)))))
adda36ed 1783
f29b3454
DH
1784;;;
1785;;; min
1786;;;
1787
7c24e528
RB
1788;; FIXME: unfinished...
1789
1790(with-test-prefix "min"
501da403
KR
1791 (pass-if (= 123.0 (min 123.0 456.0)))
1792 (pass-if (= 123.0 (min 456.0 123.0)))
1793
7c24e528
RB
1794 (let ((big*2 (* fixnum-max 2))
1795 (big*3 (* fixnum-max 3))
1796 (big*4 (* fixnum-max 4))
1797 (big*5 (* fixnum-max 5)))
1798
1799 (expect-fail (documented? max))
1800 (pass-if (= 1 (min 7 3 1 5)))
1801 (pass-if (= 1 (min 1 7 3 5)))
1802 (pass-if (= 1 (min 7 3 5 1)))
1803 (pass-if (= -7 (min 2 3 4 -2 5 -7 1 -1 4 2)))
1804 (pass-if (= -7 (min -7 2 3 4 -2 5 1 -1 4 2)))
1805 (pass-if (= -7 (min 2 3 4 -2 5 1 -1 4 2 -7)))
1806 (pass-if (= big*2 (min big*3 big*5 big*2 big*4)))
1807 (pass-if (= big*2 (min big*2 big*3 big*5 big*4)))
1808 (pass-if (= big*2 (min big*3 big*5 big*4 big*2)))
1809 (pass-if
1810 (= (- fixnum-min 1) (min 2 4 (- fixnum-min 1) 3 (* 2 fixnum-max))))
1811 (pass-if
1812 (= (- fixnum-min 1) (min (- fixnum-min 1) 2 4 3 (* 2 fixnum-max))))
1813 (pass-if
adda36ed 1814 (= (- fixnum-min 1) (min 2 4 3 (* 2 fixnum-max) (- fixnum-min 1))))
7c24e528 1815
adda36ed
KR
1816 (pass-if (= big*5 (min big*5 +inf.0)))
1817 (pass-if (= big*5 (min +inf.0 big*5)))
1818 (pass-if (= -inf.0 (min big*5 -inf.0)))
501da403
KR
1819 (pass-if (= -inf.0 (min -inf.0 big*5)))
1820
1821 (pass-if (nan? (min 123 +nan.0)))
1822 (pass-if (nan? (min big*5 +nan.0)))
1823 (pass-if (nan? (min 123.0 +nan.0)))
1824 (pass-if (nan? (min +nan.0 123)))
1825 (pass-if (nan? (min +nan.0 big*5)))
1826 (pass-if (nan? (min +nan.0 123.0)))
1827 (pass-if (nan? (min +nan.0 +nan.0))))
adda36ed
KR
1828
1829 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating Inf as 2^1024, make
1830 ;; sure we've avoided that
1831 (for-each (lambda (b)
1832 (pass-if (list b +inf.0)
1833 (= b (min b +inf.0)))
1834 (pass-if (list +inf.0 b)
1835 (= b (min b +inf.0)))
1836 (pass-if (list b -inf.0)
1837 (= -inf.0 (min b -inf.0)))
1838 (pass-if (list -inf.0 b)
1839 (= -inf.0 (min b -inf.0))))
1840 (list (1- (ash 1 1024))
1841 (ash 1 1024)
1842 (1+ (ash 1 1024))
1843 (- (1- (ash 1 1024)))
1844 (- (ash 1 1024))
501da403
KR
1845 (- (1+ (ash 1 1024)))))
1846
1847 ;; in gmp prior to 4.2, mpz_cmp_d ended up treating NaN as 3*2^1023, make
1848 ;; sure we've avoided that
1849 (pass-if (nan? (min (- (ash 1 2048)) (- +nan.0))))
1850 (pass-if (nan? (min (- +nan.0) (- (ash 1 2048))))))
adda36ed 1851
f29b3454
DH
1852;;;
1853;;; +
1854;;;
1855
1856(with-test-prefix "+"
1857
1858 (expect-fail "documented?"
1859 (documented? +))
1860
1861 (with-test-prefix "wrong type argument"
1862
1863 (pass-if-exception "1st argument string"
1864 exception:wrong-type-arg
1865 (+ "1" 2))
1866
1867 (pass-if-exception "2nd argument bool"
1868 exception:wrong-type-arg
1869 (+ 1 #f))))
1870;;;
1871;;; -
1872;;;
1873
072e6de2
KR
1874(with-test-prefix "-"
1875
1876 (pass-if "-inum - +bignum"
1877 (= #x-100000000000000000000000000000001
ef016629
KR
1878 (- -1 #x100000000000000000000000000000000)))
1879
1880 (pass-if "big - inum"
1881 (= #xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
1882 (- #x100000000000000000000000000000000 1)))
1883
1884 (pass-if "big - -inum"
1885 (= #x100000000000000000000000000000001
1886 (- #x100000000000000000000000000000000 -1))))
072e6de2 1887
f29b3454
DH
1888;;;
1889;;; *
1890;;;
1891
65ea251e
KR
1892(with-test-prefix "*"
1893
1894 (pass-if "complex * bignum"
1895 (let ((big (ash 1 90)))
1896 (= (make-rectangular big big)
1897 (* 1+1i big)))))
1898
f29b3454
DH
1899;;;
1900;;; /
1901;;;
1902
1b3a7932
DH
1903(with-test-prefix "/"
1904
1905 (expect-fail "documented?"
1906 (documented? /))
1907
1908 (with-test-prefix "division by zero"
1909
1910 (pass-if-exception "(/ 0)"
1911 exception:numerical-overflow
1912 (/ 0))
1913
cdf52e3d
MV
1914 (pass-if "(/ 0.0)"
1915 (= +inf.0 (/ 0.0)))
80074d77 1916
1b3a7932
DH
1917 (pass-if-exception "(/ 1 0)"
1918 exception:numerical-overflow
80074d77
DH
1919 (/ 1 0))
1920
cdf52e3d
MV
1921 (pass-if "(/ 1 0.0)"
1922 (= +inf.0 (/ 1 0.0)))
80074d77
DH
1923
1924 (pass-if-exception "(/ bignum 0)"
1925 exception:numerical-overflow
1926 (/ (+ fixnum-max 1) 0))
1927
cdf52e3d
MV
1928 (pass-if "(/ bignum 0.0)"
1929 (= +inf.0 (/ (+ fixnum-max 1) 0.0)))
80074d77
DH
1930
1931 (pass-if-exception "(/ 1.0 0)"
1932 exception:numerical-overflow
1933 (/ 1.0 0))
1934
cdf52e3d
MV
1935 (pass-if "(/ 1.0 0.0)"
1936 (= +inf.0 (/ 1.0 0.0)))
80074d77
DH
1937
1938 (pass-if-exception "(/ +i 0)"
1939 exception:numerical-overflow
1940 (/ +i 0))
1941
cdf52e3d
MV
1942 (pass-if "(/ +i 0.0)"
1943 (= +inf.0 (imag-part (/ +i 0.0)))))
469b963c
MV
1944
1945 (with-test-prefix "complex division"
1946
1947 (pass-if "(/ 3+4i)"
1948 (= (/ 3+4i) 0.12-0.16i))
1949
1950 (pass-if "(/ 4+3i)"
1951 (= (/ 4+3i) 0.16-0.12i))
1952
1953 (pass-if "(/ 25+125i 3+4i)"
1954 (= (/ 25+125i 3+4i) 23.0+11.0i))
1955
1956 (pass-if "(/ 25+125i 4+3i)"
1957 (= (/ 25+125i 4+3i) 19.0+17.0i))
1958
1959 (pass-if "(/ 25 3+4i)"
1960 (= (/ 25 3+4i) 3.0-4.0i))
1961
1962 (pass-if "(/ 25 4+3i)"
1963 (= (/ 25 4+3i) 4.0-3.0i))
1964
1965 (pass-if "(/ 1e200+1e200i)"
1966 (= (/ 1e200+1e200i) 5.0e-201-5.0e-201i))))
1b3a7932 1967
f29b3454
DH
1968;;;
1969;;; truncate
1970;;;
1971
14a6784c
KR
1972(with-test-prefix "truncate"
1973 (pass-if (= 1 (truncate 1.75)))
1974 (pass-if (= 1 (truncate 1.5)))
1975 (pass-if (= 1 (truncate 1.25)))
1976 (pass-if (= 0 (truncate 0.75)))
1977 (pass-if (= 0 (truncate 0.5)))
1978 (pass-if (= 0 (truncate 0.0)))
1979 (pass-if (= 0 (truncate -0.5)))
1980 (pass-if (= -1 (truncate -1.25)))
1981 (pass-if (= -1 (truncate -1.5))))
1982
f29b3454
DH
1983;;;
1984;;; round
1985;;;
1986
14a6784c
KR
1987(with-test-prefix "round"
1988 (pass-if (= 2 (round 1.75)))
1989 (pass-if (= 2 (round 1.5)))
1990 (pass-if (= 1 (round 1.25)))
1991 (pass-if (= 1 (round 0.75)))
1992 (pass-if (= 0 (round 0.5)))
1993 (pass-if (= 0 (round 0.0)))
1994 (pass-if (= 0 (round -0.5)))
1995 (pass-if (= -1 (round -1.25)))
1996 (pass-if (= -2 (round -1.5))))
1997
f29b3454
DH
1998;;;
1999;;; exact->inexact
2000;;;
2001
a1fb3b1c
KR
2002(with-test-prefix "exact->inexact"
2003
2004 ;; Test "(exact->inexact n)", expect "want".
2005 ;; "i" is a index, for diagnostic purposes.
2006 (define (try-i i n want)
2007 (with-test-prefix (list i n want)
2008 (with-test-prefix "pos"
2009 (let ((got (exact->inexact n)))
2010 (pass-if "inexact?" (inexact? got))
2011 (pass-if (list "=" got) (= want got))))
2012 (set! n (- n))
2013 (set! want (- want))
2014 (with-test-prefix "neg"
2015 (let ((got (exact->inexact n)))
2016 (pass-if "inexact?" (inexact? got))
2017 (pass-if (list "=" got) (= want got))))))
2018
2019 (with-test-prefix "2^i, no round"
2020 (do ((i 0 (1+ i))
2021 (n 1 (* 2 n))
2022 (want 1.0 (* 2.0 want)))
2023 ((> i 100))
2024 (try-i i n want)))
2025
2026 (with-test-prefix "2^i+1, no round"
2027 (do ((i 1 (1+ i))
2028 (n 3 (1- (* 2 n)))
2029 (want 3.0 (- (* 2.0 want) 1.0)))
2030 ((>= i dbl-mant-dig))
2031 (try-i i n want)))
2032
2033 (with-test-prefix "(2^i+1)*2^100, no round"
2034 (do ((i 1 (1+ i))
2035 (n 3 (1- (* 2 n)))
2036 (want 3.0 (- (* 2.0 want) 1.0)))
2037 ((>= i dbl-mant-dig))
2038 (try-i i (ash n 100) (ash-flo want 100))))
2039
2040 ;; bit pattern: 1111....11100.00
2041 ;; <-mantdig-><-i->
2042 ;;
2043 (with-test-prefix "mantdig ones then zeros, no rounding"
2044 (do ((i 0 (1+ i))
2045 (n (- (ash 1 dbl-mant-dig) 1) (* 2 n))
2046 (want (- (ash-flo 1.0 dbl-mant-dig) 1.0) (* 2.0 want)))
2047 ((> i 100))
2048 (try-i i n want)))
2049
2050 ;; bit pattern: 1111....111011..1
2051 ;; <-mantdig-> <-i->
2052 ;; This sort of value was incorrectly rounded upwards in Guile 1.6.4 when
2053 ;; i >= 11 (that's when the total is 65 or more bits).
2054 ;;
2055 (with-test-prefix "mantdig ones then 011..11, round down"
2056 (do ((i 0 (1+ i))
2057 (n (- (ash 1 (+ 1 dbl-mant-dig)) 2) (+ 1 (* 2 n)))
2058 (want (- (ash-flo 1.0 (+ 1 dbl-mant-dig)) 2.0) (* 2.0 want)))
2059 ((> i 100))
2060 (try-i i n want)))
2061
2062 ;; bit pattern: 1111....111100..001
2063 ;; <-mantdig-> <--i->
2064 ;;
2065 (with-test-prefix "mantdig ones then 100..001, round up"
2066 (do ((i 0 (1+ i))
2067 (n (- (ash 1 (+ 2 dbl-mant-dig)) 1) (1- (* 2 n)))
2068 (want (ash-flo 1.0 (+ 2 dbl-mant-dig)) (* 2.0 want)))
2069 ((> i 100))
2070 (try-i i n want)))
2071
2072 ;; bit pattern: 1000....000100..001
2073 ;; <-mantdig-> <--i->
2074 ;;
2075 (with-test-prefix "2^mantdig then 100..001, round up"
2076 (do ((i 0 (1+ i))
2077 (n (- (ash 1 (+ 2 dbl-mant-dig)) 1) (1- (* 2 n)))
2078 (want (+ (ash-flo 1.0 (+ 2 dbl-mant-dig)) 4.0) (* 2.0 want)))
2079 ((> i 100))
2080 (try-i i n want))))
2081
f29b3454
DH
2082;;;
2083;;; floor
2084;;;
2085
2086;;;
2087;;; ceiling
2088;;;
2089
46f2c0f1
RB
2090;;;
2091;;; expt
2092;;;
2093
2094(with-test-prefix "expt"
2095 (pass-if "(= 1 (expt 0 0))" (= 1 (expt 0 0)))
2096 (pass-if "(= 1 (expt 0 0.0))" (= 1 (expt 0 0.0)))
2097 (pass-if "(= 1 (expt 0.0 0))" (= 1 (expt 0.0 0)))
2098 (pass-if "(= 1 (expt 0.0 0.0))" (= 1 (expt 0.0 0.0))))
2099
14a6784c
KR
2100;;;
2101;;; asinh
2102;;;
2103
2104(with-test-prefix "asinh"
2105 (pass-if (= 0 (asinh 0))))
2106
2107;;;
2108;;; acosh
2109;;;
2110
2111(with-test-prefix "acosh"
2112 (pass-if (= 0 (acosh 1))))
2113
2114;;;
2115;;; atanh
2116;;;
2117
2118(with-test-prefix "atanh"
2119 (pass-if (= 0 (atanh 0))))
2120
f29b3454
DH
2121;;;
2122;;; make-rectangular
2123;;;
2124
2125;;;
2126;;; make-polar
2127;;;
2128
d40681ec
KR
2129(with-test-prefix "make-polar"
2130 (define pi 3.14159265358979323846)
2131 (define (almost= x y)
2132 (> 0.01 (magnitude (- x y))))
2133
2134 (pass-if (= 0 (make-polar 0 0)))
2135 (pass-if (= 0 (make-polar 0 123.456)))
2136 (pass-if (= 1 (make-polar 1 0)))
2137 (pass-if (= -1 (make-polar -1 0)))
2138
2139 (pass-if (almost= 0+i (make-polar 1 (* 0.5 pi))))
2140 (pass-if (almost= -1 (make-polar 1 (* 1.0 pi))))
2141 (pass-if (almost= 0-i (make-polar 1 (* 1.5 pi))))
2142 (pass-if (almost= 1 (make-polar 1 (* 2.0 pi)))))
2143
f29b3454
DH
2144;;;
2145;;; real-part
2146;;;
2147
2148;;;
2149;;; imag-part
2150;;;
2151
2152;;;
2153;;; magnitude
2154;;;
2155
d40681ec
KR
2156(with-test-prefix "magnitude"
2157 (pass-if (= 0 (magnitude 0)))
2158 (pass-if (= 1 (magnitude 1)))
2159 (pass-if (= 1 (magnitude -1)))
2160 (pass-if (= 1 (magnitude 0+i)))
2161 (pass-if (= 1 (magnitude 0-i)))
2162 (pass-if (= 5 (magnitude 3+4i)))
2163 (pass-if (= 5 (magnitude 3-4i)))
2164 (pass-if (= 5 (magnitude -3+4i)))
2165 (pass-if (= 5 (magnitude -3-4i))))
2166
f29b3454
DH
2167;;;
2168;;; angle
2169;;;
2170
cfc9fc1c
KR
2171(with-test-prefix "angle"
2172 (define pi 3.14159265358979323846)
2173 (define (almost= x y)
2174 (> 0.01 (magnitude (- x y))))
2175
2176 (pass-if "inum +ve" (= 0 (angle 1)))
2177 (pass-if "inum -ve" (almost= pi (angle -1)))
2178
2179 (pass-if "bignum +ve" (= 0 (angle (1+ fixnum-max))))
2180 (pass-if "bignum -ve" (almost= pi (angle (1- fixnum-min))))
2181
2182 (pass-if "flonum +ve" (= 0 (angle 1.5)))
2183 (pass-if "flonum -ve" (almost= pi (angle -1.5))))
2184
f29b3454
DH
2185;;;
2186;;; inexact->exact
2187;;;
300c6a76 2188
1259cb26
KR
2189(with-test-prefix "inexact->exact"
2190
9dd9857f 2191 (pass-if-exception "+inf" exception:out-of-range
a409f865 2192 (inexact->exact +inf.0))
1259cb26 2193
9dd9857f 2194 (pass-if-exception "-inf" exception:out-of-range
a409f865 2195 (inexact->exact -inf.0))
1259cb26 2196
9dd9857f 2197 (pass-if-exception "nan" exception:out-of-range
a409f865 2198 (inexact->exact +nan.0))
1259cb26
KR
2199
2200 (with-test-prefix "2.0**i to exact and back"
2201 (do ((i 0 (1+ i))
2202 (n 1.0 (* 2.0 n)))
2203 ((> i 100))
2204 (pass-if (list i n)
2205 (= n (inexact->exact (exact->inexact n)))))))
2206
a04a3604
KR
2207;;;
2208;;; integer-length
2209;;;
2210
2211(with-test-prefix "integer-length"
2212
2213 (with-test-prefix "-2^i, ...11100..00"
2214 (do ((n -1 (ash n 1))
2215 (i 0 (1+ i)))
2216 ((> i 256))
2217 (pass-if (list n "expect" i)
2218 (= i (integer-length n)))))
2219
2220 (with-test-prefix "-2^i+1 ...11100..01"
2221 (do ((n -3 (logxor 3 (ash n 1)))
2222 (i 2 (1+ i)))
2223 ((> i 256))
2224 (pass-if n
2225 (= i (integer-length n)))))
2226
2227 (with-test-prefix "-2^i-1 ...111011..11"
2228 (do ((n -2 (1+ (ash n 1)))
2229 (i 1 (1+ i)))
2230 ((> i 256))
2231 (pass-if n
2232 (= i (integer-length n))))))
2233
300c6a76
KR
2234;;;
2235;;; logcount
2236;;;
2237
2238(with-test-prefix "logcount"
2239
2240 (with-test-prefix "-2^i, meaning ...11100..00"
2241 (do ((n -1 (ash n 1))
2242 (i 0 (1+ i)))
2243 ((> i 256))
795c0bae
KR
2244 (pass-if n
2245 (= i (logcount n)))))
2246
2247 (with-test-prefix "2^i"
2248 (do ((n 1 (ash n 1))
2249 (i 0 (1+ i)))
2250 ((> i 256))
2251 (pass-if n
2252 (= 1 (logcount n)))))
2253
2254 (with-test-prefix "2^i-1"
2255 (do ((n 0 (1+ (ash n 1)))
2256 (i 0 (1+ i)))
2257 ((> i 256))
300c6a76
KR
2258 (pass-if n
2259 (= i (logcount n))))))
795c0bae 2260
1ec2dd6f
KR
2261;;;
2262;;; lognot
2263;;;
2264
2265(with-test-prefix "lognot"
2266 (pass-if (= -1 (lognot 0)))
2267 (pass-if (= 0 (lognot -1)))
2268 (pass-if (= -2 (lognot 1)))
2269 (pass-if (= 1 (lognot -2)))
2270
2271 (pass-if (= #x-100000000000000000000000000000000
2272 (lognot #xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)))
2273 (pass-if (= #xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
2274 (lognot #x-100000000000000000000000000000000))))