[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:08501] isqrt に不具合



 はじめまして。阿部洋志といいます。


 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>
    -----------------------------------

Index Home