[#43103] 浮動小数点を比較するには — wada toshiki <wada-ts@...>

お世話になります。

21 messages 2007/01/11
[#43105] Re: 浮動小数点を比較するには — NISHIMATSU Takeshi <t_nissie@...> 2007/01/11

> Rubyレシピブック(P290)で 比較する数値の差を Float::EPSILON と比較する方法があり

[ruby-list:43120] Re: 浮動小数点を比較するには

From: KURODA Hiraku <hiraku@...>
Date: 2007-01-14 17:58:33 UTC
List: ruby-list #43120
黒田です。
本題と外れた話題で恐縮ですが(汗

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

In This Thread