+Complex numbers handled better
authorAlex Klinkhamer <grencez@gmail.com>
Fri, 25 Jul 2008 01:49:20 +0000 (24 21:49 -0400)
committerAlex Klinkhamer <grencez@gmail.com>
Fri, 25 Jul 2008 01:49:20 +0000 (24 21:49 -0400)
src/globals.lisp
src/overload/format.lisp
src/overload/numbers.lisp

index 314b701..5ceea83 100644 (file)
@@ -62,4 +62,5 @@
 
 (store-vrbl "pi" pi)
 (store-vrbl "e" (exp 1))
+(store-vrbl "i" (complex 0 1))
 
index f3e80d2..9e9c706 100644 (file)
@@ -2,22 +2,40 @@
 (defgeneric over-format (a strm))
 
 (defmethod over-format ((n float) s)
-  (let ((sig-figs 9);*sig-figs*)
-        (mag 0)
-        (neg (when (minusp n)
-               (setq n (- n)) t)))
-    (cond
-      ((zerop n))
-      ((< n 1d0)
-       (loop :do (decf mag)
-             :while (< (setq n (* n 10)) 1)))
-      ((< n 10d0))
-      (t (loop :do (incf mag)
-               :until (< (setq n (/ n 10)) 10))))
-    (princ (/ (round (* (if neg (- n) n)
-                        (expt 10 sig-figs)))
-              (expt 10d0 (- sig-figs mag)))
-           s)))
+  (when (minusp n)
+    (write-char #\- s)
+    (setq n (- n)))
+  (multiple-value-bind
+    (igr tmp) (truncate n)
+    (princ igr s)
+    (write-char #\. s)
+    ;; Cut off after 7 post-decimal digits
+    (setq igr (round (* tmp 10000000)))
+    (do ((lis nil)
+         (itersrem 7 (1- itersrem)))
+      ((zerop itersrem)
+       (dolist (digit lis) (princ digit s)))
+      (multiple-value-setq
+        (igr tmp) (floor igr 10))
+      (when (or lis (not (zerop tmp)))
+        (push tmp lis)))))
+
+(defmethod over-format ((n complex) s)
+  (cond
+    ((zerop (imagpart n))
+     (over-format (realpart n) s))
+    ((zerop (realpart n))
+     (over-format (imagpart n) s)
+     (write-char #\i s))
+    (t (over-format (realpart n) s)
+       (over-format
+         (if (plusp (imagpart n))
+           (progn (princ " + " s)
+                  (imagpart n))
+           (progn (princ " - " s)
+                  (- (imagpart n))))
+         s)
+       (write-char #\i s))))
 
 (defmethod over-format ((a number) s)
   (princ a s))
index dae611c..d2cc8e5 100644 (file)
@@ -7,6 +7,11 @@
 (defmethod mult2n ((a number) (b number)) (* a b))
 (defmethod divis2n ((a number) (b number)) (/ a b))
 
+(defun over-sqrt (n)
+  (if (= n -1)
+    (complex 0 1)
+    (sqrt n)))
+
 (defun over-factorial (n)
   (declare (type (integer 0 *) n))
   (factorial n))