[#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:43114] Re: 浮動小数点を比較するには

From: KURODA Hiraku <hiraku@...>
Date: 2007-01-13 05:05:34 UTC
List: ruby-list #43114
初めまして、黒田と申します。

wada toshiki wrote:
> class Float
>   def near_to(b)
>     (self - b).abs * abs < Float::EPSILON
>   end
> end

これに追加して

====
printf("0.1 = %.20e\n", 0.1)
x = 0.0; 20.times{ x+= 0.1; printf("x   = %.20e\n", x) }
printf("2.0 = %.20e\n", 2.0)
p (2.0-x).abs
p (2.0-x).abs * 2.0.abs
p Float::EPSILON
p (2.0).near_to(x)
====

こんな処理を試したら、次のような結果になりました。

====
0.1 = 1.00000000000000005551e-01
x   = 1.00000000000000005551e-01
x   = 2.00000000000000011102e-01
(中略)
x   = 1.90000000000000057732e+00
x   = 2.00000000000000044409e+00
2.0 = 2.00000000000000000000e+00
4.44089209850063e-16
8.88178419700125e-16
2.22044604925031e-16
false
====

実数の0.1とFloatの0.1(実際は0.100...0551)の差が予想よりも大きくて、20回
積み重ねてEPSILONを飛び出したといった感じでしょうか?
Rubyは
 ruby 1.8.2 (2005-04-11) [i386-linux]
です。

ところで
> 
>  (self - b).abs * abs は、(self - b).abs / abs の誤りだと思うのですが、

この処理って、
 (self-b).abs
では駄目なんでしょうか?更にabs倍したり割ったりする意味が良く分かりません
でした。もしかして、レシピブックの方に何か根拠が載ってたりします?

-- 
--------------------------------------------------
 黒田 拓(くろだ ひらく)
    hiraku@sapporo.email.ne.jp
    http://www.hinet.mydns.jp/~hiraku/
--------------------------------------------------

In This Thread