Change display of floating point values in debugger

59 views Asked by At

When I debug in Slime and inspect the value of a floating point variable, I see something like

6.8998337e-4

However, I find that very hard to read and would prefer

0.00068998337

How can I achieve that?

1

There are 1 answers

0
Jérôme Radix On BEST ANSWER

First:

CL-USER> (format nil "~F" 6.8998337e-4)
"0.00068998337"
CL-USER> (format nil "~E" 6.8998337e-4)
"6.8998337e-4"

In slime/sly, when you Inspect (C-c I) the value 6.8998337e-4, you get:

#<SINGLE-FLOAT {3A34E00000000019}>
--------------------
Scientific: 6.8998337e-4
Decoded: 1.0 * 0.70654297 * 2^-10
Digits: 24
Precision: 24

The "Scientific" value is formatted in swank/slynk in contrib/swank-fancy-inspector.lisp or contrib/slynk-fancy-inspector.lisp :

(defmethod emacs-inspect ((f float))
  (cond
    ((float-nan-p f)
     ;; try NaN first because the next tests may perform operations
     ;; that are undefined for NaNs.
     (list "Not a Number."))
    ((not (float-infinity-p f))
     (multiple-value-bind (significand exponent sign) (decode-float f)
       (append
    `("Scientific: " ,(format nil "~E" f) (:newline)
             "Decoded: "
             (:value ,sign) " * "
             (:value ,significand) " * "
             (:value ,(float-radix f)) "^"
             (:value ,exponent) (:newline))
    (label-value-line "Digits" (float-digits f))
    (label-value-line "Precision" (float-precision f)))))
    ((> f 0)
     (list "Positive infinity."))
    ((< f 0)
     (list "Negative infinity."))))

You could modify emacs-inspect method and change (format nil "~E" f) to (format nil "~F" f), or you could shadow emacs-inspect with an emacs-inspect :around method to modify the behavior to use "~F".