bug in (log)

James Cloos cloos at jhcloos.com
Sun Jul 10 15:39:33 UTC 2022

i should have realized this even before noticing ecl's limitation for
logs of ratios, but at least i finally did....

since i'monly using log to find the exponent for an arbitrary precision
replacement for format's ~e, it works to truncate first.

so i ended up with this:

(defun ilog (n &optional (base nil base-p))
  "return floor of base b log of n"
  (let ((s (if (< n 1) -1 1))
	 (trunc-n (truncate (if (< n 1) (/ n) n))))
    (floor (* s (if base-p
	       (log trunc-n base)
	       (log trunc-n))))))

One could use let* and then test s when choosing between n and (/ n), but
i choose instead to let the compiler optimize the two calls to (< n 1).

that makes my ~e replacement work exactly as desired on all lisps i've tried.

(I have a ~// function which chooses output baed on the arg's type, with
ratios done via that print-e-significant-digits function and everything
else using write.)

James Cloos <cloos at jhcloos.com>         OpenPGP: 0x997A9F17ED7DAEA6

More information about the ecl-devel mailing list