Changeset 287


Ignore:
Timestamp:
Jan 13, 2004, 5:09:32 PM (21 years ago)
Author:
Gary Byers
Message:

IMAGPART uses * vice FLOAT, to get the sign of 0.0 right.
PHASE of a negative rational returns single-float PI.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/level-0/l0-numbers.lisp

    r78 r287  
    783783    (rational
    784784     (if (minusp number)
    785        (%double-float pi) ; is it (will it be) always double float?
     785       (%short-float pi)
    786786       0.0f0))
    787787    (double-float
     
    13821382  (number-case number
    13831383    (complex (%imagpart number))
    1384     (float (float 0.0 number))
     1384    (float (* 0 number))
    13851385    (rational 0)))
    13861386
     
    15171517(defun ash (integer count)
    15181518  "Shifts integer left by count places preserving sign.  - count shifts right."
    1519   (number-case integer
    1520    (fixnum
    1521     (cond ((eql 0 integer)
    1522            0)
    1523           (t (number-case count
    1524               (fixnum
    1525                (if (eql count 0)
    1526                  integer
    1527                  (let ((length (integer-length (the fixnum integer))))
    1528                    (declare (fixnum length count))
    1529                    (cond ((and (plusp count)
    1530                                (> (+ length count)
    1531                                   (- 31 ppc32::fixnumshift)))                         
    1532                           (with-small-bignum-buffers ((bi integer))
    1533                             (bignum-ashift-left bi count)))
    1534                          ((and (minusp count) (< count -31))
    1535                           (if (minusp integer) -1 0))
    1536                          (t (%iash (the fixnum integer) count))))))
    1537                (bignum
    1538                 (if (minusp count)
    1539                   (if (minusp integer) -1 0)         
    1540                   (error "Count ~s too large for ASH" count)))))))
     1519  (etypecase integer
     1520    (fixnum
     1521     (etypecase count
     1522       (fixnum
     1523        (if (eql integer 0)
     1524          0
     1525          (if (eql count 0)
     1526            integer
     1527            (let ((length (integer-length (the fixnum integer))))
     1528              (declare (fixnum length count))
     1529              (cond ((and (plusp count)
     1530                          (> (+ length count)
     1531                             (- 31 ppc32::fixnumshift)))                         
     1532                     (with-small-bignum-buffers ((bi integer))
     1533                       (bignum-ashift-left bi count)))
     1534                    ((and (minusp count) (< count -31))
     1535                     (if (minusp integer) -1 0))
     1536                    (t (%iash (the fixnum integer) count)))))))
     1537       (bignum
     1538        (if (minusp count)
     1539          (if (minusp integer) -1 0)         
     1540          (error "Count ~s too large for ASH" count)))))
    15411541    (bignum
    1542      (number-case count
     1542     (etypecase count
    15431543       (fixnum
    15441544        (if (eql count 0)
     
    15871587(defun random (number &optional (state *random-state*))
    15881588  (if (not (typep state 'random-state)) (report-bad-arg state 'random-state))
    1589   ; below doesn't boot
    1590   ;(setq state (require-type (or state *random-state*) 'random-state))
    1591   (if (eql number 0)
    1592     0
    1593     (cond
    1594      ((and (fixnump number) (>= (the fixnum number) 0))
     1589  (cond
     1590     ((and (fixnump number) (> (the fixnum number) 0))
    15951591      (locally (declare (fixnum number))
    15961592        (if (< number 65536)
    15971593          (mod (%next-random-seed state) number)
    15981594          (%bignum-random number state))))
    1599      ((and (typep number 'double-float) (>= (the double-float number) 0.0))
     1595     ((and (typep number 'double-float) (> (the double-float number) 0.0))
    16001596      (%float-random number state))
    1601      ((and (typep number 'short-float) (>= (the short-float number) 0.0s0))
     1597     ((and (typep number 'short-float) (> (the short-float number) 0.0s0))
    16021598      (%float-random number state))
    1603      ((and (bignump number) (>= number 0))
     1599     ((and (bignump number) (> number 0))
    16041600      (%bignum-random number state))
    1605      (t (report-bad-arg number '(or (integer 0) (float 0.0)))))))
     1601     (t (report-bad-arg number '(or (integer (0)) (float (0.0)))))))
    16061602
    16071603(defun %bignum-random (number &optional state)
     
    16271623      (incf  index 2))
    16281624    ; The bignum code expects normalized bignums
    1629     (mod dividend number)))
     1625    (let* ((result (mod dividend number)))
     1626      (if (eq dividend result)
     1627        (copy-uvector result)
     1628        result))))
    16301629
    16311630(defun %float-random (number state)
Note: See TracChangeset for help on using the changeset viewer.