123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- ; Part of Scheme 48 1.9. See file COPYING for notices and license.
- ; Authors: Richard Kelsey, Jonathan Rees
- ;Date: Mon, 24 Jan 94 15:10:30 -0500
- ;To: jar@ai.mit.edu
- ;Subject: integer->string
- ;From: kelsey@research.nj.nec.com
- ;Sender: kelsey@research.nj.nec.com
- ;
- ;
- ;I have gotten tired of waiting for bignums to print out.
- ;Here is a somewhat more complex and faster version of integer->string.
- ;
- ;Converting 10**100 to a string:
- ; Current: 0.44 seconds
- ; This: 0.12 seconds
- ; This using integer-divide: 0.06 seconds
- ;
- ;There is no overwhelming reason to use this, but here it is.
- (define integer->string
- (let ()
- (define (integer->string n radix)
- (define (small-integer->magnitude n l)
- (if (= n 0)
- l
- (small-integer->magnitude (quotient n radix)
- (cons (integer->digit (remainder n radix))
- l))))
-
- (define (integer->magnitude n)
- (let ((rrrr (* (* radix radix) (* radix radix))))
-
- (let recur ((n n) (l '()))
- (if (< n rrrr)
- (small-integer->magnitude n l)
- (do ((i 4 (- i 1))
- (n0 (remainder n rrrr) (quotient n0 radix))
- (l l (cons (integer->digit (remainder n0 radix)) l)))
- ((= 0 i)
- (recur (quotient n rrrr) l)))))))
- (let ((magnitude (cond ((= n 0) '(#\0))
- ((< n 1000000)
- (small-integer->magnitude (abs n) '()))
- (else
- (integer->magnitude (abs n))))))
- (list->string (if (>= n 0)
- magnitude
- (cons #\- magnitude)))))
- (define (integer->digit n)
- (ascii->char (+ n (if (< n 10)
- zero
- a-minus-10))))
- (define zero (char->ascii #\0))
- (define a-minus-10 (- (char->ascii #\a) 10))
- integer->string))
|