From: Yukihiro Matsumoto Date: 2010-01-28T11:34:31+09:00 Subject: [ruby-dev:40199] Re: [Bug #2662] BigDecimal#ceil, etc. should not return Integer まつもと ゆきひろです In message "Re: [ruby-dev:40168] [Bug #2662] BigDecimal#ceil, etc. should not return Integer" on Wed, 27 Jan 2010 02:42:38 +0900, Yusuke Endoh writes: |r20584 と r20616 で BigDecimal#ceil 、truncate 、floor 、round 、div の |戻り値を Integer にする変更がありますが、これだと巨大な BigDecimal を |扱えなく、または扱いが面倒になります。 | | | # 巨大な BigDecimal は ceil が取れない | $ ./ruby -rbigdecimal -e 'p BigDecimal("1E100000").ceil' | (巨大な Bignum を確保しようとして固まる...) | | # Infinity が混ざるときは自分で対処する必要がある | $ ./ruby -rbigdecimal -e 'p BigDecimal("Infinity").ceil' | -e:1:in `ceil': Computation results to 'Infinity' (FloatDomainError) | from -e:1:in `
' ふなばさんが指摘しておられるように、前者は性能の問題、後者は 整数では表現できない値(InfやNaN)がある問題です。これらは分け て考えましょう。 まず、後者からですが、Rubyではceilなどは整数を返します。それ に揃えた方がBigDecimalとしての使い勝手が上がるでしょう。つま り、より他の数値と同様に振る舞う方が望ましいと言う考えです。 特にBigDecimalと概念的に近いFloatではInfやNaNは例外を発生さ せますから。 前者はBigDecimal#to_iが、文字列化してそれをパースするという 手段を使っているせいです。これは純粋に手抜きですから、それを 改善すればすむと思います。 ということで、リバートの必要はなく、あえていうならば、現在 BigDecimal#to_iがInfやNaNに対してnilを返しているのを例外にす るという変更を加えるべきなんじゃないかと思います。 まつもと ゆきひろ /:|)