1:
2:
3:
4:
5: (use gauche.test)
6:
7: (define (exp2 pow)
8: (do ((i 0 (+ i 1))
9: (m 1 (+ m m)))
10: ((>= i pow) m)))
11:
12: (define (fermat n)
13: (+ (expt 2 (expt 2 n)) 1))
14:
15: (test-start "numbers")
16:
17:
18:
19:
20:
21:
22: (test-section "integer addition & reader")
23:
24: (define (i-tester x)
25: (list x (+ x -1 x) (+ x x) (- x) (- (+ x -1 x)) (- 0 x x) (- 0 x x 1)))
26:
27: (test* "around 2^28"
28: '(268435456 536870911 536870912
29: -268435456 -536870911 -536870912 -536870913)
30: (i-tester (exp2 28)))
31:
32: (test* "around 2^31"
33: '(2147483648 4294967295 4294967296
34: -2147483648 -4294967295 -4294967296 -4294967297)
35: (i-tester (exp2 31)))
36:
37: (test* "around 2^60"
38: '(1152921504606846976 2305843009213693951 2305843009213693952
39: -1152921504606846976 -2305843009213693951 -2305843009213693952
40: -2305843009213693953)
41: (i-tester (exp2 60)))
42:
43: (test* "around 2^63"
44: '(9223372036854775808 18446744073709551615 18446744073709551616
45: -9223372036854775808 -18446744073709551615 -18446744073709551616
46: -18446744073709551617)
47: (i-tester (exp2 63)))
48:
49: (test* "around 2^127"
50: '(170141183460469231731687303715884105728
51: 340282366920938463463374607431768211455
52: 340282366920938463463374607431768211456
53: -170141183460469231731687303715884105728
54: -340282366920938463463374607431768211455
55: -340282366920938463463374607431768211456
56: -340282366920938463463374607431768211457)
57: (i-tester (exp2 127)))
58:
59:
60: (test* "peculiarity around 2^32"
61: (* 477226729 10) 4772267290)
62:
63: (test* "radix" '(43605 342391 718048024785
64: 123456789 123456789987654321
65: 1193046 3735928559 3735928559)
66: (list #b1010101001010101
67: #o1234567
68: #o12345677654321
69: #d123456789
70: #d123456789987654321
71: #x123456
72: #xdeadbeef
73: #xDeadBeef))
74:
75: (test* "exactness" #t (exact? #e10))
76: (test* "exactness" #t (exact? #e10.0))
77: (test* "exactness" #t (exact? #e10e10))
78: (test* "exactness" #t (exact? #e12.34))
79: (test* "inexactness" #f (exact? #i10))
80: (test* "inexactness" #f (exact? #i10.0))
81: (test* "inexactness" #f (exact? #i12.34))
82:
83: (test* "exactness & radix" '(#t 3735928559 #t 3735928559)
84: (list (exact? #e#xdeadbeef)
85: #e#xdeadbeef
86: (exact? #x#edeadbeef)
87: #x#edeadbeef))
88: (test* "inexactness & radix" '(#f 3735928559.0 #f 3735928559.0)
89: (list (exact? #i#xdeadbeef)
90: #i#xdeadbeef
91: (exact? #x#ideadbeef)
92: #x#ideadbeef))
93:
94: (test* "invalid exactness/radix spec" #f
95: (or (string->number "#e")
96: (string->number "#i")
97: (string->number "#e#i3")
98: (string->number "#i#e5")
99: (string->number "#x#o13")
100: (string->number "#e#b#i00101")))
101:
102: (define (radix-tester radix)
103: (list
104: (let loop ((digits 0)
105: (input "1")
106: (value 1))
107: (cond ((> digits 64) #t)
108: ((eqv? (string->number input radix) value)
109: (loop (+ digits 1) (string-append input "0") (* value radix)))
110: (else #f)))
111: (let loop ((digits 0)
112: (input (string (integer->digit (- radix 1) radix)))
113: (value (- radix 1)))
114: (cond ((> digits 64) #t)
115: ((eqv? (string->number input radix) value)
116: (loop (+ digits 1)
117: (string-append input (string (integer->digit (- radix 1) radix)))
118: (+ (* value radix) (- radix 1))))
119: (else #f)))))
120:
121: (test* "base-2 reader" '(#t #t) (radix-tester 2))
122: (test* "base-3 reader" '(#t #t) (radix-tester 3))
123: (test* "base-4 reader" '(#t #t) (radix-tester 4))
124: (test* "base-5 reader" '(#t #t) (radix-tester 5))
125: (test* "base-6 reader" '(#t #t) (radix-tester 6))
126: (test* "base-7 reader" '(#t #t) (radix-tester 7))
127: (test* "base-8 reader" '(#t #t) (radix-tester 8))
128: (test* "base-9 reader" '(#t #t) (radix-tester 9))
129: (test* "base-10 reader" '(#t #t) (radix-tester 10))
130: (test* "base-11 reader" '(#t #t) (radix-tester 11))
131: (test* "base-12 reader" '(#t #t) (radix-tester 12))
132: (test* "base-13 reader" '(#t #t) (radix-tester 13))
133: (test* "base-14 reader" '(#t #t) (radix-tester 14))
134: (test* "base-15 reader" '(#t #t) (radix-tester 15))
135: (test* "base-16 reader" '(#t #t) (radix-tester 16))
136: (test* "base-17 reader" '(#t #t) (radix-tester 17))
137: (test* "base-18 reader" '(#t #t) (radix-tester 18))
138: (test* "base-19 reader" '(#t #t) (radix-tester 19))
139: (test* "base-20 reader" '(#t #t) (radix-tester 20))
140: (test* "base-21 reader" '(#t #t) (radix-tester 21))
141: (test* "base-22 reader" '(#t #t) (radix-tester 22))
142: (test* "base-23 reader" '(#t #t) (radix-tester 23))
143: (test* "base-24 reader" '(#t #t) (radix-tester 24))
144: (test* "base-25 reader" '(#t #t) (radix-tester 25))
145: (test* "base-26 reader" '(#t #t) (radix-tester 26))
146: (test* "base-27 reader" '(#t #t) (radix-tester 27))
147: (test* "base-28 reader" '(#t #t) (radix-tester 28))
148: (test* "base-29 reader" '(#t #t) (radix-tester 29))
149: (test* "base-30 reader" '(#t #t) (radix-tester 30))
150: (test* "base-31 reader" '(#t #t) (radix-tester 31))
151: (test* "base-32 reader" '(#t #t) (radix-tester 32))
152: (test* "base-33 reader" '(#t #t) (radix-tester 33))
153: (test* "base-34 reader" '(#t #t) (radix-tester 34))
154: (test* "base-35 reader" '(#t #t) (radix-tester 35))
155: (test* "base-36 reader" '(#t #t) (radix-tester 36))
156:
157:
158: (test-section "rational reader")
159:
160: (define (rational-test v)
161: (if (number? v) (list v (exact? v)) v))
162:
163: (test* "rational reader" '(1234 #t) (rational-test '1234/1))
164: (test* "rational reader" '(-1234 #t) (rational-test '-1234/1))
165: (test* "rational reader" '(1234 #t) (rational-test '+1234/1))
166: (test* "rational reader" '|1234/-1| (rational-test '1234/-1))
167: (test* "rational reader" '(1234 #t) (rational-test '2468/2))
168: (test* "rational reader" '(1/2 #t) (rational-test '1/2))
169: (test* "rational reader" '(-1/2 #t) (rational-test '-1/2))
170: (test* "rational reader" '(1/2 #t) (rational-test '+1/2))
171: (test* "rational reader" '(1/2 #t) (rational-test '751/1502))
172:
173: (test* "rational reader" '(1 #t)
174: (rational-test (string->number "3/03")))
175: (test* "rational reader" '(+inf.0 #f)
176: (rational-test (string->number "3/0")))
177: (test* "rational reader" '(-inf.0 #f)
178: (rational-test (string->number "-3/0")))
179: (test* "rational reader" #f
180: (rational-test (string->number "3/3/4")))
181: (test* "rational reader" #f
182: (rational-test (string->number "1/2.")))
183: (test* "rational reader" #f
184: (rational-test (string->number "1.3/2")))
185:
186: (test* "rational reader" *test-error*
187: (rational-test (read-from-string "#e3/0")))
188: (test* "rational reader" *test-error*
189: (rational-test (read-from-string "#e-3/0")))
190:
191: (test* "rational reader w/#e" '(1234 #t)
192: (rational-test '#e1234/1))
193: (test* "rational reader w/#e" '(-1234 #t)
194: (rational-test '#e-1234/1))
195: (test* "rational reader w/#e" '(32/7 #t)
196: (rational-test '#e32/7))
197: (test* "rational reader w/#e" '(-32/7 #t)
198: (rational-test '#e-32/7))
199: (test* "rational reader w/#i" '(1234.0 #f)
200: (rational-test '#i1234/1))
201: (test* "rational reader w/#i" '(-1234.0 #f)
202: (rational-test '#i-1234/1))
203: (test* "rational reader w/#i" '(-0.125 #f)
204: (rational-test '#i-4/32))
205:
206: (test* "rational reader w/radix" '(15 #t)
207: (rational-test '#e#xff/11))
208: (test* "rational reader w/radix" '(56 #t)
209: (rational-test '#o770/11))
210: (test* "rational reader w/radix" '(15.0 #f)
211: (rational-test '#x#iff/11))
212:
213:
214:
215: (test-section "flonum reader")
216:
217: (define (flonum-test v)
218: (if (number? v) (list v (inexact? v)) v))
219:
220: (test* "flonum reader" '(3.14 #t) (flonum-test 3.14))
221: (test* "flonum reader" '(0.14 #t) (flonum-test 0.14))
222: (test* "flonum reader" '(0.14 #t) (flonum-test .14))
223: (test* "flonum reader" '(3.0 #t) (flonum-test 3.))
224: (test* "flonum reader" '(-3.14 #t) (flonum-test -3.14))
225: (test* "flonum reader" '(-0.14 #t) (flonum-test -0.14))
226: (test* "flonum reader" '(-0.14 #t) (flonum-test -.14))
227: (test* "flonum reader" '(-3.0 #t) (flonum-test -3.))
228: (test* "flonum reader" '(3.14 #t) (flonum-test +3.14))
229: (test* "flonum reader" '(0.14 #t) (flonum-test +0.14))
230: (test* "flonum reader" '(0.14 #t) (flonum-test +.14))
231: (test* "flonum reader" '(3.0 #t) (flonum-test +3.))
232: (test* "flonum reader" '(0.0 #t) (flonum-test .0))
233: (test* "flonum reader" '(0.0 #t) (flonum-test 0.))
234: (test* "flonum reader" #f (string->number "."))
235: (test* "flonum reader" #f (string->number "-."))
236: (test* "flonum reader" #f (string->number "+."))
237:
238: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test 3.14e2))
239: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test .314e3))
240: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test 314e0))
241: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test 314e-0))
242: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test 3140000e-4))
243: (test* "flonum reader (exp)" '(-314.0 #t) (flonum-test -3.14e2))
244: (test* "flonum reader (exp)" '(-314.0 #t) (flonum-test -.314e3))
245: (test* "flonum reader (exp)" '(-314.0 #t) (flonum-test -314e0))
246: (test* "flonum reader (exp)" '(-314.0 #t) (flonum-test -314.e-0))
247: (test* "flonum reader (exp)" '(-314.0 #t) (flonum-test -3140000e-4))
248: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test +3.14e2))
249: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test +.314e3))
250: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test +314.e0))
251: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test +314e-0))
252: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test +3140000.000e-4))
253:
254: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test .314E3))
255: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test .314s3))
256: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test .314S3))
257: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test .314l3))
258: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test .314L3))
259: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test .314f3))
260: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test .314F3))
261: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test .314d3))
262: (test* "flonum reader (exp)" '(314.0 #t) (flonum-test .314D3))
263:
264: (test* "padding" '(10.0 #t) (flonum-test '1#))
265: (test* "padding" '(10.0 #t) (flonum-test '1#.))
266: (test* "padding" '(10.0 #t) (flonum-test '1#.#))
267: (test* "padding" '(100.0 #t) (flonum-test '10#.#))
268: (test* "padding" '(100.0 #t) (flonum-test '1##.#))
269: (test* "padding" '(100.0 #t) (flonum-test '100.0#))
270: (test* "padding" '(1.0 #t) (flonum-test '1.#))
271:
272: (test* "padding" '|1#1| (flonum-test '1#1))
273: (test* "padding" '|1##1| (flonum-test '1##1))
274: (test* "padding" '|1#.1| (flonum-test '1#.1))
275: (test* "padding" '|1.#1| (flonum-test '1.#1))
276:
277: (test* "padding" '|.#| (flonum-test '.#))
278: (test* "padding" '(0.0 #t) (flonum-test '0.#))
279: (test* "padding" '(0.0 #t) (flonum-test '.0#))
280: (test* "padding" '(0.0 #t) (flonum-test '0#))
281: (test* "padding" '(0.0 #t) (flonum-test '0#.#))
282: (test* "padding" '|0#.0| (flonum-test '0#.0))
283:
284: (test* "padding" '(1000.0 #t) (flonum-test '1#e2))
285: (test* "padding" '(1000.0 #t) (flonum-test '1##e1))
286: (test* "padding" '(1000.0 #t) (flonum-test '1#.##e2))
287: (test* "padding" '(0.0 #t) (flonum-test '0.#e2))
288: (test* "padding" '(0.0 #t) (flonum-test '.0#e2))
289: (test* "padding" '|.##e2| (flonum-test '.##e2))
290:
291: (test* "padding (exactness)" '(100 #f) (flonum-test '#e1##))
292: (test* "padding (exactness)" '(120 #f) (flonum-test '#e12#))
293: (test* "padding (exactness)" '(120 #f) (flonum-test '#e12#.#))
294: (test* "padding (exactness)" '(100.0 #t) (flonum-test '#i1##))
295: (test* "padding (exactness)" '(120.0 #t) (flonum-test '#i12#))
296: (test* "padding (exactness)" '(120.0 #t) (flonum-test '#i12#.#))
297:
298: (test* "exponent out-of-range 1" '(+inf.0 #t) (flonum-test '1e309))
299: (test* "exponent out-of-range 2" '(+inf.0 #t) (flonum-test '1e10000))
300: (test* "exponent out-of-range 3" '(+inf.0 #t) (flonum-test '1e1000000000000000000000000000000000000000000000000000000000000000))
301: (test* "exponent out-of-range 4" '(-inf.0 #t) (flonum-test '-1e309))
302: (test* "exponent out-of-range 5" '(-inf.0 #t) (flonum-test '-1e10000))
303: (test* "exponent out-of-range 6" '(-inf.0 #t) (flonum-test '-1e1000000000000000000000000000000000000000000000000000000000000000))
304: (test* "exponent out-of-range 7" '(0.0 #t) (flonum-test '1e-324))
305: (test* "exponent out-of-range 8" '(0.0 #t) (flonum-test '1e-1000))
306: (test* "exponent out-of-range 9" '(0.0 #t) (flonum-test '1e-1000000000000000000000000000000000000000000000000000000000000000000))
307:
308:
309: (test-section "exact fractional number")
310:
311: (test* "exact fractonal number" 12345
312: (string->number "#e1.2345e4"))
313: (test* "exact fractonal number" 123450000000000
314: (string->number "#e1.2345e14"))
315: (test* "exact fractonal number" 12345/100
316: (string->number "#e1.2345e2"))
317: (test* "exact fractonal number" 12345/1000000
318: (string->number "#e1.2345e-2"))
319: (test* "exact fractonal number" -12345
320: (string->number "#e-1.2345e4"))
321: (test* "exact fractonal number" -123450000000000
322: (string->number "#e-1.2345e14"))
323: (test* "exact fractonal number" -12345/100
324: (string->number "#e-1.2345e2"))
325: (test* "exact fractonal number" -12345/1000000
326: (string->number "#e-1.2345e-2"))
327:
328: (test* "exact fractonal number" (%expt 10 296)
329: (string->number "#e0.0001e300"))
330: (test* "exact fractonal number" (- (%expt 10 296))
331: (string->number "#e-0.0001e300"))
332:
333: (test* "exact fractonal number" *test-error*
334: (read-from-stirng "#e1e330"))
335: (test* "exact fractonal number" *test-error*
336: (read-from-stirng "#e1e-330"))
337:
338:
339:
340: (test-section "complex reader")
341:
342: (define (decompose-complex z)
343: (cond ((real? z) z)
344: ((complex? z)
345: (list (real-part z) (imag-part z)))
346: (else z)))
347:
348: (test* "complex reader" '(1.0 1.0) (decompose-complex '1+i))
349: (test* "complex reader" '(1.0 1.0) (decompose-complex '1+1i))
350: (test* "complex reader" '(1.0 -1.0) (decompose-complex '1-i))
351: (test* "complex reader" '(1.0 -1.0) (decompose-complex '1-1i))
352: (test* "complex reader" '(1.0 1.0) (decompose-complex '1.0+1i))
353: (test* "complex reader" '(1.0 1.0) (decompose-complex '1.0+1.0i))
354: (test* "complex reader" '(1e-5 1.0) (decompose-complex '1e-5+1i))
355: (test* "complex reader" '(1e+5 1.0) (decompose-complex '1e+5+1i))
356: (test* "complex reader" '(1.0 1e-5) (decompose-complex '1+1e-5i))
357: (test* "complex reader" '(1.0 1e+5) (decompose-complex '1+1e+5i))
358: (test* "complex reader" '(0.1 1e+4) (decompose-complex '0.1+0.1e+5i))
359: (test* "complex reader" '(0.0 1.0) (decompose-complex '+i))
360: (test* "complex reader" '(0.0 -1.0) (decompose-complex '-i))
361: (test* "complex reader" '(0.0 1.0) (decompose-complex '+1i))
362: (test* "complex reader" '(0.0 -1.0) (decompose-complex '-1i))
363: (test* "complex reader" '(0.0 1.0) (decompose-complex '+1.i))
364: (test* "complex reader" '(0.0 -1.0) (decompose-complex '-1.i))
365: (test* "complex reader" '(0.0 1.0) (decompose-complex '+1.0i))
366: (test* "complex reader" '(0.0 -1.0) (decompose-complex '-1.0i))
367: (test* "complex reader" 1.0 (decompose-complex '1+0.0i))
368: (test* "complex reader" 1.0 (decompose-complex '1+.0i))
369: (test* "complex reader" 1.0 (decompose-complex '1+0.i))
370: (test* "complex reader" 1.0 (decompose-complex '1+0.0e-43i))
371: (test* "complex reader" 100.0 (decompose-complex '1e2+0.0e-43i))
372:
373: (test* "complex reader" 'i (decompose-complex 'i))
374: (test* "complex reader" #f (decompose-complex (string->number ".i")))
375: (test* "complex reader" #f (decompose-complex (string->number "+.i")))
376: (test* "complex reader" #f (decompose-complex (string->number "-.i")))
377: (test* "complex reader" '33i (decompose-complex '33i))
378: (test* "complex reader" 'i+1 (decompose-complex 'i+1))
379:
380: (test* "complex reader" '(0.5 0.5) (decompose-complex 1/2+1/2i))
381: (test* "complex reader" '(0.0 0.5) (decompose-complex 0+1/2i))
382: (test* "complex reader" '(0.0 -0.5) (decompose-complex -1/2i))
383: (test* "complex reader" 1/2 (decompose-complex 1/2-0/2i))
384: (test* "complex reader" '(0.5 -inf.0) (decompose-complex (string->number "1/2-1/0i")))
385:
386: (test* "complex reader (polar)" (make-polar 1.0 1.0) 1.0@1.0)
387: (test* "complex reader (polar)" (make-polar 1.0 -1.0) 1.0@-1.0)
388: (test* "complex reader (polar)" (make-polar 1.0 1.0) 1.0@+1.0)
389: (test* "complex reader (polar)" (make-polar -7.0 -3.0) -7@-3.0)
390: (test* "complex reader (polar)" (make-polar 3.5 -3.0) 7/2@-3.0)
391: (test* "complex reader (polar)" #f (string->number "7/2@-3.14i"))
392:
393:
394:
395: (test-section "integer writer syntax")
396:
397: (define (i-tester2 x)
398: (map number->string (i-tester x)))
399:
400: (test* "around 2^28"
401: '("268435456" "536870911" "536870912"
402: "-268435456" "-536870911" "-536870912" "-536870913")
403: (i-tester2 (exp2 28)))
404:
405: (test* "around 2^31"
406: '("2147483648" "4294967295" "4294967296"
407: "-2147483648" "-4294967295" "-4294967296" "-4294967297")
408: (i-tester2 (exp2 31)))
409:
410: (test* "around 2^60"
411: '("1152921504606846976" "2305843009213693951" "2305843009213693952"
412: "-1152921504606846976" "-2305843009213693951" "-2305843009213693952"
413: "-2305843009213693953")
414: (i-tester2 (exp2 60)))
415:
416: (test* "around 2^63"
417: '("9223372036854775808" "18446744073709551615" "18446744073709551616"
418: "-9223372036854775808" "-18446744073709551615" "-18446744073709551616"
419: "-18446744073709551617")
420: (i-tester2 (exp2 63)))
421:
422: (test* "around 2^127"
423: '("170141183460469231731687303715884105728"
424: "340282366920938463463374607431768211455"
425: "340282366920938463463374607431768211456"
426: "-170141183460469231731687303715884105728"
427: "-340282366920938463463374607431768211455"
428: "-340282366920938463463374607431768211456"
429: "-340282366920938463463374607431768211457")
430: (i-tester2 (exp2 127)))
431:
432:
433:
434:
435:
436:
437:
438: (test-section "expt")
439:
440: (test* "exact expt" 1 (expt 5 0))
441: (test* "exact expt" 9765625 (expt 5 10))
442: (test* "exact expt" 1220703125 (expt 5 13))
443: (test* "exact expt" 94039548065783000637498922977779654225493244541767001720700136502273380756378173828125 (expt 5 123))
444: (test* "exact expt" 1/94039548065783000637498922977779654225493244541767001720700136502273380756378173828125 (expt 5 -123))
445: (test* "exact expt" 1 (expt -5 0))
446: (test* "exact expt" 9765625 (expt -5 10))
447: (test* "exact expt" -1220703125 (expt -5 13))
448: (test* "exact expt" -94039548065783000637498922977779654225493244541767001720700136502273380756378173828125 (expt -5 123))
449: (test* "exact expt" -1/94039548065783000637498922977779654225493244541767001720700136502273380756378173828125 (expt -5 -123))
450: (test* "exact expt" 1 (expt 1 720000))
451: (test* "exact expt" 1 (expt -1 720000))
452: (test* "exact expt" -1 (expt -1 720001))
453:
454: (test* "exact expt (ratinoal)" 8589934592/5559060566555523
455: (expt 2/3 33))
456: (test* "exact expt (rational)" -8589934592/5559060566555523
457: (expt -2/3