From: Tadashi Saito Date: 2008-09-08T17:29:15+09:00 Subject: [ruby-dev:36209] Re: Numeric#scalar? 斎藤と申します。 On Sun, 7 Sep 2008 01:25:19 +0900 Shin-ichiro HARA wrote: > すぎな感じがします。Numericの下に比較ができてかつ実数でない数 > をライブラリとして書くことはありえるのではないか。 (一部の実数Numericと)「比較ができなくてかつ実数である」数値のライブラリを書いて いる者です。 著作のライブラリは、小数を正確に表せるのをウリとしています。その性格を重んじて、 不正確であるFloatとの比較の時は、意図して例外が上がるようになっています。 例えばBigDecimal("1.1")では、1.1を正確に表せますが、Floatの1.1ではそうとは限り ません。そのため、せっかくBigDecimalを用いて正確に演算した結果も、最後にそれを うっかりFloatと比較してしまうと、結果は無残なものとなってしまいます。 Floatはリテラルとして簡単に書けるので、うっかりが起こりやすいようです。 このような誤りは単なる仮説ではなく、1.8のリリースの後に実際何度も繰り返し起き、 ruby-talkに投稿されている悲劇です。最近では [ruby-talk:312713] がありました。 そのような理由があって、著作ライブラリではFloatとの比較が不可能です(比較するならば to_fを使ってからお好きにどうぞ、というスタンスです)。そのため、ライブラリに1.9対応を 盛り込もうとしている自分にとっては、原さんの「ありえるのではないか」という危惧は今 現在起こっている問題です。 ということで、上記のようなモノの実装者としては、compareble? の方がいくらか自然に 感じます。real? の倍以上の長さがありますが、それほど頻繁に使うものではないので、 いいのかなという気がします。 -- 斎藤ただし