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

From: wada toshiki <wada-ts@...>
Date: 2007-01-13 00:06:03 UTC
List: ruby-list #43112
NISHIMATSU Takeshiさん wrote:
> 比較したい数で割るのを忘れているとか:
> $ ruby -e 'x = 10.333333333333333  ; p Float::EPSILON > ((x-31.0/3)/x).abs'
> true
> $ ruby -e 'x =  0.333333333333333  ; p Float::EPSILON > ((x- 1.0/3)/x).abs'
> false
> $ ruby -e 'x =  0.3333333333333333 ; p Float::EPSILON > ((x- 1.0/3)/x).abs'
> true
> (Rubyレシピブックを持っていないのでどういうことをしているのかわかりませんが)

Rubyレシピブックでは以下のようになっています。

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

x = 0.0; 10.times{ x += 0.1 }
p 1.0.near_to(x)  #=> true

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

x = 0.0; 20.times{ x += 0.1 }
p 2.0.near_to(x)  #=> false

となります。

p x.near_to(2.0)  #=> true

だと、動きが変わりますが。
ちなみに、ruby 1.8.4 (2005-12-24) [i386-mswin32] です。
-- 
*********************************************
  和田稔己

In This Thread