(linenum→info "unix/slp.c:2238")

gauche/0.8.12/test/number.scm

    1: ;;
    2: ;; test numeric system implementation
    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)                      ;Fermat's number
   13:   (+ (expt 2 (expt 2 n)) 1))
   14: 
   15: (test-start "numbers")
   16: 
   17: ;;==================================================================
   18: ;; Reader/writer
   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: ;; test for reader's overflow detection code
   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: ;; Conversions
  434: ;;
  435: 
  436: ;; We first test expt, for we need to use it to test exact<->inexact
  437: ;; conversion stuff.
  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