https://redmine.ruby-lang.org/
https://redmine.ruby-lang.org/favicon.ico?1711330511
2010-01-27T19:12:57Z
Ruby Issue Tracking System
Ruby master - Bug #2662: BigDecimal#ceil, etc. should not return Integer
https://redmine.ruby-lang.org/issues/2662?journal_id=7945
2010-01-27T19:12:57Z
tadf (tadayoshi funaba)
<ul></ul><p>=begin<br>
ちょっと試してみました。</p>
<blockquote>
<p>r20584 と r20616 で BigDecimal#ceil 、truncate 、floor 、round 、div の<br>
戻り値を Integer にする変更がありますが、これだと巨大な BigDecimal を<br>
扱えなく、または扱いが面倒になります。</p>
<a name="巨大な-BigDecimal-は-ceil-が取れない"></a>
<h1 >巨大な BigDecimal は ceil が取れない<a href="#巨大な-BigDecimal-は-ceil-が取れない" class="wiki-anchor">¶</a></h1>
<p>$ ./ruby -rbigdecimal -e 'p BigDecimal("1E100000").ceil'<br>
(巨大な Bignum を確保しようとして固まる...)</p>
</blockquote>
<p>僕のところでは固まるということはないですね。Rational と比べるとちょっと<br>
遅いみたいですが。</p>
<p>b = BigDecimal("1E100000").ceil<br>
r = Rational("1E100000").ceil<br>
b == r #=> true</p>
<p>手元で試したところでは to_r で Rational を経由してから to_i したほうが<br>
速いみたいです (つまり ceil(0).to_r.to_i のほうが、ceil よりも速い)。よ<br>
うするに BigDecimal#to_i が遅いというのが本質ではないですか。</p>
<blockquote>
<a name="Infinity-が混ざるときは自分で対処する必要がある"></a>
<h1 >Infinity が混ざるときは自分で対処する必要がある<a href="#Infinity-が混ざるときは自分で対処する必要がある" class="wiki-anchor">¶</a></h1>
<p>$ ./ruby -rbigdecimal -e 'p BigDecimal("Infinity").ceil'<br>
-e:1:in <code>ceil': Computation results to 'Infinity' (FloatDomainError) from -e:1:in </code>'</p>
</blockquote>
<p>Infinity に対して ceil が取れないのは Float でも同じなのでそれが間違っ<br>
ているなら、それは BigDecimal だけの問題でもないと思います。</p>
<blockquote>
<p>Float#ceil などが Integer を返すのに合わせるためだと思いますが、この変更<br>
では BigDecimal のありがたみ自体が減ってしまう気がします。<br>
どうしてもということでなければ、revert を提案します。</p>
</blockquote>
<p>望むなら ceil を BigDecimal のまま取ることも出来るので (ceil(0))、提案<br>
の理由で直ちに revert する理由はないように見えます。rubyspec のほうは判<br>
りません。</p>
<p>=end</p>
Ruby master - Bug #2662: BigDecimal#ceil, etc. should not return Integer
https://redmine.ruby-lang.org/issues/2662?journal_id=7949
2010-01-27T22:03:18Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul></ul><p>=begin<br>
2010年1月27日19:12 Tadayoshi Funaba <a href="mailto:tadf@dotrb.org" class="email">tadf@dotrb.org</a>:</p>
<blockquote>
<blockquote>
<a name="巨大な-BigDecimal-は-ceil-が取れない"></a>
<h1 >巨大な BigDecimal は ceil が取れない<a href="#巨大な-BigDecimal-は-ceil-が取れない" class="wiki-anchor">¶</a></h1>
<p>$ ./ruby -rbigdecimal -e 'p BigDecimal("1E100000").ceil'<br>
(巨大な Bignum を確保しようとして固まる...)</p>
</blockquote>
<p>僕のところでは固まるということはないですね。Rational と比べるとちょっと<br>
遅いみたいですが。</p>
<p>b = BigDecimal("1E100000").ceil<br>
r = Rational("1E100000").ceil<br>
b == r #=> true</p>
<p>手元で試したところでは to_r で Rational を経由してから to_i したほうが<br>
速いみたいです (つまり ceil(0).to_r.to_i のほうが、ceil よりも速い)。よ<br>
うするに BigDecimal#to_i が遅いというのが本質ではないですか。</p>
</blockquote>
<p>0 が一個足りませんでした。1E100000 はうちだと 8 秒ですね。1E1000000<br>
だとどうでしょう。<br>
しかし、Rational で動くなら、何かを直せばなんとかなりそうですね。</p>
<blockquote>
<blockquote>
<a name="Infinity-が混ざるときは自分で対処する必要がある"></a>
<h1 >Infinity が混ざるときは自分で対処する必要がある<a href="#Infinity-が混ざるときは自分で対処する必要がある" class="wiki-anchor">¶</a></h1>
<p>$ ./ruby -rbigdecimal -e 'p BigDecimal("Infinity").ceil'<br>
-e:1:in <code>ceil': Computation results to 'Infinity' (FloatDomainError) from -e:1:in </code>'</p>
</blockquote>
<p>Infinity に対して ceil が取れないのは Float でも同じなのでそれが間違っ<br>
ているなら、それは BigDecimal だけの問題でもないと思います。</p>
</blockquote>
<p>BigDecimal に関しては 1.9.1 なら大丈夫だったのに、1.9.2 で大丈夫じゃ<br>
なくなってしまうという問題です。</p>
<blockquote>
<blockquote>
<p>Float#ceil などが Integer を返すのに合わせるためだと思いますが、この変更<br>
では BigDecimal のありがたみ自体が減ってしまう気がします。<br>
どうしてもということでなければ、revert を提案します。</p>
</blockquote>
<p>望むなら ceil を BigDecimal のまま取ることも出来るので (ceil(0))、提案<br>
の理由で直ちに revert する理由はないように見えます。rubyspec のほうは判<br>
りません。</p>
</blockquote>
<p>「提案の理由で直ちに revert する理由はない」というより、「どうしても<br>
変えないと困る理由がある」でないのであれば、1.9 系列の途中でむやみに<br>
仕様変更しないほうがいいと思います。理由は一貫性だけなんでしょうか。</p>
<p>--<br>
Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p>
<p>=end</p>
Ruby master - Bug #2662: BigDecimal#ceil, etc. should not return Integer
https://redmine.ruby-lang.org/issues/2662?journal_id=7954
2010-01-27T23:14:54Z
tadf (tadayoshi funaba)
<ul></ul><p>=begin</p>
<blockquote>
<p>0 が一個足りませんでした。1E100000 はうちだと 8 秒ですね。1E1000000<br>
だとどうでしょう。<br>
しかし、Rational で動くなら、何かを直せばなんとかなりそうですね。</p>
</blockquote>
<p>Rational 経由だと 0 ひとつ増えてもそこそこの速度で返るようですね。</p>
<p>関係あるかわからないけど、BigDecimal#** が結構遅かった記憶があります。<br>
あと、</p>
<p>BigDecimal('3') ** BigDecimal('3')</p>
<a name="TypeError-wrong-argument-type-BigDecimal-expected-Fixnum"></a>
<h1 >TypeError: wrong argument type BigDecimal (expected Fixnum)<a href="#TypeError-wrong-argument-type-BigDecimal-expected-Fixnum" class="wiki-anchor">¶</a></h1>
<p>BigDecimal('3') ** 3.3</p>
<a name="TypeError-wrong-argument-type-Float-expected-Fixnum"></a>
<h1 >TypeError: wrong argument type Float (expected Fixnum)<a href="#TypeError-wrong-argument-type-Float-expected-Fixnum" class="wiki-anchor">¶</a></h1>
<p>といったところで、Fixnum に比べても制限も多いし、実装にいろいろ手抜きが<br>
あるってことなのかな。</p>
<blockquote>
<p>「提案の理由で直ちに revert する理由はない」というより、「どうしても<br>
変えないと困る理由がある」でないのであれば、1.9 系列の途中でむやみに<br>
仕様変更しないほうがいいと思います。理由は一貫性だけなんでしょうか。</p>
</blockquote>
<p>答える立場にないけど、理由は一貫性で間違ってないと思います。単に一貫性<br>
を与えてみた、ということではなく、一貫性が必要だと思ったからそうしたの<br>
だと思いますが。互換性を確保すべきなのかどうかは考え方次第だと思うので<br>
僕には判りませんが。</p>
<p>=end</p>
Ruby master - Bug #2662: BigDecimal#ceil, etc. should not return Integer
https://redmine.ruby-lang.org/issues/2662?journal_id=7969
2010-01-28T11:35:01Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul></ul><p>=begin<br>
まつもと ゆきひろです</p>
<p>In message "Re: <a href="/issues/2662">[ruby-dev:40168]</a> [Bug <a class="issue tracker-1 status-6 priority-4 priority-default closed" title="Bug: BigDecimal#ceil, etc. should not return Integer (Rejected)" href="https://redmine.ruby-lang.org/issues/2662">#2662</a>] BigDecimal#ceil, etc. should not return Integer"<br>
on Wed, 27 Jan 2010 02:42:38 +0900, Yusuke Endoh <a href="mailto:redmine@ruby-lang.org" class="email">redmine@ruby-lang.org</a> writes:</p>
<p>|r20584 と r20616 で BigDecimal#ceil 、truncate 、floor 、round 、div の<br>
|戻り値を Integer にする変更がありますが、これだと巨大な BigDecimal を<br>
|扱えなく、または扱いが面倒になります。<br>
|<br>
|<br>
| # 巨大な BigDecimal は ceil が取れない<br>
| $ ./ruby -rbigdecimal -e 'p BigDecimal("1E100000").ceil'<br>
| (巨大な Bignum を確保しようとして固まる...)<br>
|<br>
| # Infinity が混ざるときは自分で対処する必要がある<br>
| $ ./ruby -rbigdecimal -e 'p BigDecimal("Infinity").ceil'<br>
| -e:1:in <code>ceil': Computation results to 'Infinity' (FloatDomainError) | from -e:1:in </code>'</p>
<p>ふなばさんが指摘しておられるように、前者は性能の問題、後者は<br>
整数では表現できない値(InfやNaN)がある問題です。これらは分け<br>
て考えましょう。</p>
<p>まず、後者からですが、Rubyではceilなどは整数を返します。それ<br>
に揃えた方がBigDecimalとしての使い勝手が上がるでしょう。つま<br>
り、より他の数値と同様に振る舞う方が望ましいと言う考えです。<br>
特にBigDecimalと概念的に近いFloatではInfやNaNは例外を発生さ<br>
せますから。</p>
<p>前者はBigDecimal#to_iが、文字列化してそれをパースするという<br>
手段を使っているせいです。これは純粋に手抜きですから、それを<br>
改善すればすむと思います。</p>
<p>ということで、リバートの必要はなく、あえていうならば、現在<br>
BigDecimal#to_iがInfやNaNに対してnilを返しているのを例外にす<br>
るという変更を加えるべきなんじゃないかと思います。</p>
<pre><code> まつもと ゆきひろ /:|)
</code></pre>
<p>=end</p>
Ruby master - Bug #2662: BigDecimal#ceil, etc. should not return Integer
https://redmine.ruby-lang.org/issues/2662?journal_id=7980
2010-01-28T20:24:37Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul></ul><p>=begin<br>
遠藤です。</p>
<p>2010年1月28日11:34 Yukihiro Matsumoto <a href="mailto:matz@ruby-lang.org" class="email">matz@ruby-lang.org</a>:</p>
<blockquote>
<p>| # 巨大な BigDecimal は ceil が取れない<br>
| $ ./ruby -rbigdecimal -e 'p BigDecimal("1E100000").ceil'<br>
| (巨大な Bignum を確保しようとして固まる...)<br>
|<br>
| # Infinity が混ざるときは自分で対処する必要がある<br>
| $ ./ruby -rbigdecimal -e 'p BigDecimal("Infinity").ceil'<br>
| -e:1:in <code>ceil': Computation results to 'Infinity' (FloatDomainError) | from -e:1:in </code>'</p>
<p>ということで、リバートの必要はなく、</p>
</blockquote>
<p>了解しました。</p>
<blockquote>
<p>あえていうならば、現在<br>
BigDecimal#to_iがInfやNaNに対してnilを返しているのを例外にす<br>
るという変更を加えるべきなんじゃないかと思います。</p>
</blockquote>
<p>Yugui さん、判断をお願いします。</p>
<p>--<br>
Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p>
<p>=end</p>
Ruby master - Bug #2662: BigDecimal#ceil, etc. should not return Integer
https://redmine.ruby-lang.org/issues/2662?journal_id=8021
2010-01-29T19:19:35Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul><li><strong>Assignee</strong> changed from <i>matz (Yukihiro Matsumoto)</i> to <i>yugui (Yuki Sonoda)</i></li></ul><p>=begin</p>
<p>=end</p>
Ruby master - Bug #2662: BigDecimal#ceil, etc. should not return Integer
https://redmine.ruby-lang.org/issues/2662?journal_id=8039
2010-01-30T14:02:52Z
yugui (Yuki Sonoda)
yugui@yugui.jp
<ul></ul><p>=begin<br>
On 1/28/10 8:24 PM, Yusuke ENDOH wrote:</p>
<blockquote>
<blockquote>
<p>ということで、リバートの必要はなく、<br>
(snip)<br>
あえていうならば、現在<br>
BigDecimal#to_iがInfやNaNに対してnilを返しているのを例外にす<br>
るという変更を加えるべきなんじゃないかと思います。</p>
</blockquote>
<p>Yugui さん、判断をお願いします。</p>
</blockquote>
<p>両方とも、まつもとさんに賛同します。</p>
<p>--<br>
Yugui <a href="mailto:yugui@yugui.jp" class="email">yugui@yugui.jp</a><br>
<a href="http://yugui.jp" class="external">http://yugui.jp</a><br>
私は私をDumpする</p>
<p>=end</p>
Ruby master - Bug #2662: BigDecimal#ceil, etc. should not return Integer
https://redmine.ruby-lang.org/issues/2662?journal_id=8045
2010-01-30T20:12:55Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul></ul><p>=begin<br>
遠藤です。</p>
<p>2010年1月30日14:02 Yugui (Yuki Sonoda) <a href="mailto:yugui@yugui.jp" class="email">yugui@yugui.jp</a>:</p>
<blockquote>
<p>On 1/28/10 8:24 PM, Yusuke ENDOH wrote:</p>
<blockquote>
<blockquote>
<p>ということで、リバートの必要はなく、<br>
(snip)<br>
あえていうならば、現在<br>
BigDecimal#to_iがInfやNaNに対してnilを返しているのを例外にす<br>
るという変更を加えるべきなんじゃないかと思います。</p>
</blockquote>
<p>Yugui さん、判断をお願いします。</p>
</blockquote>
<p>両方とも、まつもとさんに賛同します。</p>
</blockquote>
<p>お返事ありがとうございます。<br>
つまり、いずれ 1.9.1 にバックポートされるということですね。<br>
それなら 1.9 からの仕様変更ということで rubyspec を更新しようと思います。</p>
<p>--<br>
Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p>
<p>=end</p>
Ruby master - Bug #2662: BigDecimal#ceil, etc. should not return Integer
https://redmine.ruby-lang.org/issues/2662?journal_id=8047
2010-01-30T21:13:23Z
yugui (Yuki Sonoda)
yugui@yugui.jp
<ul></ul><p>=begin<br>
2010/1/30 Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a>:</p>
<blockquote>
<p>お返事ありがとうございます。<br>
つまり、いずれ 1.9.1 にバックポートされるということですね。<br>
それなら 1.9 からの仕様変更ということで rubyspec を更新しようと思います。</p>
</blockquote>
<p>仕様のミスは原則的に1.9.1にはバックポートしないことに決めたので、しません。<br>
ただ、これは1.9.1という実装のバグと扱って良いと思います。また、1.9.2から挙動を変更することに異論はないです。</p>
<p>という意図でした。</p>
<p>--<br>
Yuki Sonoda (Yugui)<br>
<a href="mailto:yugui@yugui.jp" class="email">yugui@yugui.jp</a><br>
<a href="http://yugui.jp" class="external">http://yugui.jp</a></p>
<p>=end</p>
Ruby master - Bug #2662: BigDecimal#ceil, etc. should not return Integer
https://redmine.ruby-lang.org/issues/2662?journal_id=10449
2010-04-22T23:19:19Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Rejected</i></li></ul><p>=begin<br>
遠藤です。</p>
<p>rubyspec 側で対処したので、このチケットは reject します。</p>
<p>--<br>
Yusuke Endoh <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a><br>
=end</p>