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

From: GOTOU Yuuzou <gotoyuzo@...>
Date: 2007-01-15 00:20:01 UTC
List: ruby-list #43122
Rubyレシピブックの筆者のひとりの後藤です。

「浮動小数点数を比較する」のサンプルは誤りですね。
申し訳ありません。

In message <45A87871.4030706@joy.email.ne.jp>,
 `wada toshiki <wada-ts@joy.email.ne.jp>' wrote:
> ということは、1.0が比較の基となるということなのでしょうか。
> ネットで検索したらこのようなのもありました。
> 
> http://boost.cppll.jp/HEAD/libs/test/doc/floating_point_comparison.htm

これを参考にすると、

  class Float
    def near_to(b)
      (self - b).abs / abs <= Float::EPSILON &&
      (b - self).abs / b.abs <= Float::EPSILON
    end
  end

こういう感じでしょうか。

> レシピブックには文字列に変換して比較する方法も載っています。実用上はこれで問題な
> いように思いますが、数値を比較するのに文字列に変換してしまうことが、どんなものな
> のかなという気がしていましたので、この方法で可能であればいいと思って質問しました。

Ruby 1.6にはFloat::EPSILONがないので、それなりに使えそうな方
法を紹介しています。

が、間違いついでに告白すると、あまり得意な分野ではありません。
追試してみると、Float#to_s(つまりprintf("%#.15g, value))した
結果同士の比較の方が許容される範囲が大きそうですが、実際どの
程度なんでしょう。

-- 
ごとうゆうぞう

In This Thread