[xyzzy:08501] isqrt に不具合
- Subject: [xyzzy:08501] isqrt に不具合
- From: ABE Hiroshi <hiro-abe@xxxxxxxxxxxxxxxxxx>
- X-mailer: Mew version 2.2 on Emacs 21.1 / Mule 5.0 (SAKAKI)
はじめまして。阿部洋志といいます。
xyzzy 0.2.2.231 を電卓代わりに使っていた時に気付いたのですが、isqrt に
大きな数値を与えると
;;; ---- ここから ----
(let* ((v 3141592653589)
(r (isqrt v)))
(format t "~d ~d ~d~%" v r (* r r)))
3141592653589 1498028 2244087888784
;;; ---- ここまで ----
と、明らかに間違った値を返す場合があることを報告致します。
差し当たって .xyzzy に
;;; ---- ここから ----
(defun isqrt (source)
(declare (type integer source))
"integer square root (CLtL 12.5.1)"
(unless (>= source 0) (error "範囲外の値です: ~d" source))
(labels ((converged-p (source root)
(let* ((int-root (truncate root))
(int-root+1 (1+ int-root)))
(and (<= (* int-root int-root) source)
(< source (* int-root+1 int-root+1)))))
(next-step (source root)
(truncate (/ (+ (* root root) source) (* 2 root))))
(main-loop (source root)
(if (converged-p source root)
root
(main-loop source (next-step source root)))))
(main-loop source source)))
;;; ---- ここまで ----
として凌いでいます。
# もっと綺麗に書けないもんかね > おれ
-----------------------------------
阿部 洋志 <hiro-abe@xxxxxxxxxxxxxxxxxx>
-----------------------------------