From: KURODA Hiraku Date: 2007-01-15T02:58:33+09:00 Subject: [ruby-list:43120] Re: 浮動小数点を比較するには 黒田です。 本題と外れた話題で恐縮ですが(汗 wada toshiki wrote: > 0.1+0.1としても単純に累積はしないのですが。 > > 0.1 = 1.00000000000000010000e-01 > 0.2 = 2.00000000000000010000e-01 > 0.3 = 3.00000000000000040000e-01 > 0.4 = 4.00000000000000020000e-01 次のようなスクリプトで調べてみました。 === #!/usr/bin/env ruby def pe(x, prefix="") printf("#{prefix}%0.30e\n", x) end x = 0 (1..20).each do |i| y = x+0.1 pe(y-x, "#{i} : ") pe(y) x = y end === 結果はこちら === 1 : 1.000000000000000055511151231258e-01 1.000000000000000055511151231258e-01 2 : 1.000000000000000055511151231258e-01 2.000000000000000111022302462516e-01 3 : 1.000000000000000333066907387547e-01 3.000000000000000444089209850063e-01 (中略) 19 : 1.000000000000000888178419700125e-01 1.900000000000000577315972805081e+00 20 : 9.999999999999986677323704498122e-02 2.000000000000000444089209850063e+00 === どうも、書いた側で0.1ずつ足したつもりでも、足した後と足す前との差は0.1 (のdouble近似)からまた少しずれてしまうみたいですね(桁落ち誤差?) このケースだと、有効数字は16桁程度なんでしょうか > レシピブックにはこれに対する説明では、 > 「機械イプシロン(1.0と1.0より大きい最小の数の差)」 (中略) > ネットで検索したらこのようなのもありました。 > > http://boost.cppll.jp/HEAD/libs/test/doc/floating_point_comparison.htm こういうやり方があったんですね。恥ずかしながら、初めて見ました(計算機の 授業で習った、掛けたり割ったりしない方法を何の疑いもなく使ってました) -- -------------------------------------------------- 黒田 拓(くろだ ひらく) hiraku@sapporo.email.ne.jp http://www.hinet.mydns.jp/~hiraku/ --------------------------------------------------