[ruby-trunk - Feature #8295][Open] Float や Rational から(可能であれば)正確な BigDecimal を生成する機能

Issue #8295 has been reported by metanest (Makoto K.).


Feature #8295: Float や Rational から(可能であれば)正確な BigDecimal を生成する機能

Author: metanest (Makoto K.)
Status: Open
Priority: Normal
Assignee:
Category: lib
Target version:

=begin
たまに、Float を正確に表現する BigDecimal が欲しいことがあります。

(有効数字の考え方からは邪道ですが。また普通は printf の “%a” による
十六進表現で用が足りることも多いでしょう)

十進でも桁数を必要なだけ伸ばせば、普通の 2 進の浮動小数点数なら正確に
表現できます。また、Rational も分母が 2 と 5 以外の約数を持たない場合に
限っては、正確に BigDecimal に変換できます。

そういった場合に、BigDecimal(0.1, nil) のように精度に nil を指定すれば、
正確な変換が行われたら便利だと思います。Rationalについては、任意の n 進法
を指定して正確な文字列表現にできる場合には変換するという機能(たとえば、
Rational(1, 3) は、3 進法で 0.1 です)というのもありうるかと思いますが、
そこまで実装してはいません。

基本的なアイディアを実装したコードは
((URL:https://gist.github.com/metanest/5418814))
にあります。名前などのインタフェースには検討の必要が残っていると思います。
=end

Issue #8295 has been updated by naruse (Yui NARUSE).

Category changed from lib to ext
Assignee set to mrkn (Kenta M.)
Target version set to next minor


Feature #8295: Float や Rational から(可能であれば)正確な BigDecimal を生成する機能

Author: metanest (Makoto K.)
Status: Open
Priority: Normal
Assignee: mrkn (Kenta M.)
Category: ext
Target version: next minor

=begin
たまに、Float を正確に表現する BigDecimal が欲しいことがあります。

(有効数字の考え方からは邪道ですが。また普通は printf の “%a” による
十六進表現で用が足りることも多いでしょう)

十進でも桁数を必要なだけ伸ばせば、普通の 2 進の浮動小数点数なら正確に
表現できます。また、Rational も分母が 2 と 5 以外の約数を持たない場合に
限っては、正確に BigDecimal に変換できます。

そういった場合に、BigDecimal(0.1, nil) のように精度に nil を指定すれば、
正確な変換が行われたら便利だと思います。Rationalについては、任意の n 進法
を指定して正確な文字列表現にできる場合には変換するという機能(たとえば、
Rational(1, 3) は、3 進法で 0.1 です)というのもありうるかと思いますが、
そこまで実装してはいません。

基本的なアイディアを実装したコードは
((URL:https://gist.github.com/metanest/5418814))
にあります。名前などのインタフェースには検討の必要が残っていると思います。
=end

Issue #8295 has been updated by mrkn (Kenta M.).

Status changed from Open to Rejected

Rational も分母が 2 と 5 以外の約数を持たない場合

これを実現するパッチはすでに持っていて、精度の問題を解決してから取り込もうと考えていました。
先に入れても良さそうなので、近いうちにマージします。

そういった場合に、BigDecimal(0.1, nil) のように精度に nil を指定すれば、正確な変換が行われたら便利

IEEE754 の環境において BigDecimal(0.1, nil) で何が与えられることを期待していますか?

Rationalについては、任意の n 進法 を指定して正確な文字列表現にできる場合には変換するという機能(たとえば、 Rational(1, 3) は、3
進法で 0.1 です)というのもありうる

これはあり得ません。
BigDecimal は名前から想像できるように「十進浮動小数点数」です。
そのような機能を望むのであれば、別名のライブラリにするひつようがあると思います。

Feature #8295: Float や Rational から(可能であれば)正確な BigDecimal を生成する機能

Author: metanest (Makoto K.)
Status: Rejected
Priority: Normal
Assignee: mrkn (Kenta M.)
Category: ext
Target version: next minor

=begin
たまに、Float を正確に表現する BigDecimal が欲しいことがあります。

(有効数字の考え方からは邪道ですが。また普通は printf の “%a” による
十六進表現で用が足りることも多いでしょう)

十進でも桁数を必要なだけ伸ばせば、普通の 2 進の浮動小数点数なら正確に
表現できます。また、Rational も分母が 2 と 5 以外の約数を持たない場合に
限っては、正確に BigDecimal に変換できます。

そういった場合に、BigDecimal(0.1, nil) のように精度に nil を指定すれば、
正確な変換が行われたら便利だと思います。Rationalについては、任意の n 進法
を指定して正確な文字列表現にできる場合には変換するという機能(たとえば、
Rational(1, 3) は、3 進法で 0.1 です)というのもありうるかと思いますが、
そこまで実装してはいません。

基本的なアイディアを実装したコードは
((URL:https://gist.github.com/metanest/5418814))
にあります。名前などのインタフェースには検討の必要が残っていると思います。
=end

Issue #8295 has been updated by mrkn (Kenta M.).

Status changed from Rejected to Assigned


Feature #8295: Float や Rational から(可能であれば)正確な BigDecimal を生成する機能

Author: metanest (Makoto K.)
Status: Assigned
Priority: Normal
Assignee: mrkn (Kenta M.)
Category: ext
Target version: next minor

=begin
たまに、Float を正確に表現する BigDecimal が欲しいことがあります。

(有効数字の考え方からは邪道ですが。また普通は printf の “%a” による
十六進表現で用が足りることも多いでしょう)

十進でも桁数を必要なだけ伸ばせば、普通の 2 進の浮動小数点数なら正確に
表現できます。また、Rational も分母が 2 と 5 以外の約数を持たない場合に
限っては、正確に BigDecimal に変換できます。

そういった場合に、BigDecimal(0.1, nil) のように精度に nil を指定すれば、
正確な変換が行われたら便利だと思います。Rationalについては、任意の n 進法
を指定して正確な文字列表現にできる場合には変換するという機能(たとえば、
Rational(1, 3) は、3 進法で 0.1 です)というのもありうるかと思いますが、
そこまで実装してはいません。

基本的なアイディアを実装したコードは
((URL:https://gist.github.com/metanest/5418814))
にあります。名前などのインタフェースには検討の必要が残っていると思います。
=end

Issue #8295 has been updated by metanest (Makoto K.).

IEEE754 の環境において BigDecimal(0.1, nil) で何が与えられることを期待していますか?

#=> #<BigDecimal:8011820c8,‘0.1000000000 0000000555 1115123125
7827021181 5834045410 15625E0’,63(72)>

を期待しているのですが、やはりちょっと無茶ですかねぇ。

Feature #8295: Float や Rational から(可能であれば)正確な BigDecimal を生成する機能

Author: metanest (Makoto K.)
Status: Rejected
Priority: Normal
Assignee: mrkn (Kenta M.)
Category: ext
Target version: next minor

=begin
たまに、Float を正確に表現する BigDecimal が欲しいことがあります。

(有効数字の考え方からは邪道ですが。また普通は printf の “%a” による
十六進表現で用が足りることも多いでしょう)

十進でも桁数を必要なだけ伸ばせば、普通の 2 進の浮動小数点数なら正確に
表現できます。また、Rational も分母が 2 と 5 以外の約数を持たない場合に
限っては、正確に BigDecimal に変換できます。

そういった場合に、BigDecimal(0.1, nil) のように精度に nil を指定すれば、
正確な変換が行われたら便利だと思います。Rationalについては、任意の n 進法
を指定して正確な文字列表現にできる場合には変換するという機能(たとえば、
Rational(1, 3) は、3 進法で 0.1 です)というのもありうるかと思いますが、
そこまで実装してはいません。

基本的なアイディアを実装したコードは
((URL:https://gist.github.com/metanest/5418814))
にあります。名前などのインタフェースには検討の必要が残っていると思います。
=end

Issue #8295 has been updated by mrkn (Kenta M.).

metanest (Makoto K.) wrote:

IEEE754 の環境において BigDecimal(0.1, nil) で何が与えられることを期待していますか?

#=> #<BigDecimal:8011820c8,‘0.1000000000 0000000555 1115123125 7827021181
5834045410 15625E0’,63(72)>

を期待しているのですが、やはりちょっと無茶ですかねぇ。

なるほど〜。理屈はわかりました。Rational とやり方は同じなので難しくありませんね。
やってみます。

Feature #8295: Float や Rational から(可能であれば)正確な BigDecimal を生成する機能

Author: metanest (Makoto K.)
Status: Assigned
Priority: Normal
Assignee: mrkn (Kenta M.)
Category: ext
Target version: next minor

=begin
たまに、Float を正確に表現する BigDecimal が欲しいことがあります。

(有効数字の考え方からは邪道ですが。また普通は printf の “%a” による
十六進表現で用が足りることも多いでしょう)

十進でも桁数を必要なだけ伸ばせば、普通の 2 進の浮動小数点数なら正確に
表現できます。また、Rational も分母が 2 と 5 以外の約数を持たない場合に
限っては、正確に BigDecimal に変換できます。

そういった場合に、BigDecimal(0.1, nil) のように精度に nil を指定すれば、
正確な変換が行われたら便利だと思います。Rationalについては、任意の n 進法
を指定して正確な文字列表現にできる場合には変換するという機能(たとえば、
Rational(1, 3) は、3 進法で 0.1 です)というのもありうるかと思いますが、
そこまで実装してはいません。

基本的なアイディアを実装したコードは
((URL:https://gist.github.com/metanest/5418814))
にあります。名前などのインタフェースには検討の必要が残っていると思います。
=end

Issue #8295 has been updated by metanest (Makoto K.).

Gist に置いた概念コードでだいたいの考え方を示したつもりなんですが、
BigDecimal に「変換される」側のオブジェクト(たとえばRationalの
インスタンス)が、自分が正確に変換できるかどうか判断するという
設計にするのが綺麗かな、という風に考えました。

Feature #8295: Float や Rational から(可能であれば)正確な BigDecimal を生成する機能

Author: metanest (Makoto K.)
Status: Assigned
Priority: Normal
Assignee: mrkn (Kenta M.)
Category: ext
Target version: next minor

=begin
たまに、Float を正確に表現する BigDecimal が欲しいことがあります。

(有効数字の考え方からは邪道ですが。また普通は printf の “%a” による
十六進表現で用が足りることも多いでしょう)

十進でも桁数を必要なだけ伸ばせば、普通の 2 進の浮動小数点数なら正確に
表現できます。また、Rational も分母が 2 と 5 以外の約数を持たない場合に
限っては、正確に BigDecimal に変換できます。

そういった場合に、BigDecimal(0.1, nil) のように精度に nil を指定すれば、
正確な変換が行われたら便利だと思います。Rationalについては、任意の n 進法
を指定して正確な文字列表現にできる場合には変換するという機能(たとえば、
Rational(1, 3) は、3 進法で 0.1 です)というのもありうるかと思いますが、
そこまで実装してはいません。

基本的なアイディアを実装したコードは
((URL:https://gist.github.com/metanest/5418814))
にあります。名前などのインタフェースには検討の必要が残っていると思います。
=end