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

From: "metanest (Makoto Kishimoto)" <redmine@...>
Date: 2013-04-24 09:31:19 UTC
List: ruby-dev #47288
Issue #8295 has been updated by metanest (Makoto Kishimoto).


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

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

を期待しているのですが、やはりちょっと無茶ですかねぇ。
----------------------------------------
Feature #8295: Float や Rational から(可能であれば)正確な BigDecimal を生成する機能
https://bugs.ruby-lang.org/issues/8295#change-38864

Author: metanest (Makoto Kishimoto)
Status: Rejected
Priority: Normal
Assignee: mrkn (Kenta Murata)
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



-- 
http://bugs.ruby-lang.org/

In This Thread