Hatena::Groupcadr

kozima の日記

2012-04-30

*read-default-float-format*

19:26

GCJ 2012 A-large で失敗したので忘れないようメモ。

浮動小数点数を read するときは精度が *read-default-float-format* の値で決まります。デフォルトが single-float だったりするので(処理系による?),気をつけないと精度が足りない場合があります。

clisp で "0.123456" を read して 1000000 回足し算してみたらこうなりました。

CL-USER> (dolist (x '(short-float single-float double-float long-float))
           (let ((*read-default-float-format* x)) 
             (format t "~A~%" (let ((x (read-from-string "0.123456"))) (loop repeat 1000000 sum x)))))
16384.0
124511.13
123456.00000097719
123455.99999999887794
NIL

double 以上でないと不安な感じです。

ついでに SBCL での実行結果。

* (dolist (x '(short-float single-float double-float long-float))
           (let ((*read-default-float-format* x)) 
             (format t "~A~%" (let ((x (read-from-string "0.123456"))) (loop repeat 1000000 sum x)))))
124511.13
124511.13
123456.00000097719
123456.00000097719
NIL

似たような感じですね。SBCL の short と long はそれぞれ single, double と同じみたいです。