From: "NARUSE, Yui" <naruse@...> Date: 2010-03-29T08:08:37+09:00 Subject: [ruby-dev:40816] Re: [Feature #2969] String#to_f が -h.hhh±pd を解釈できるように 成瀬です。 (2010/03/29 7:04), Yukihiro Matsumoto wrote: > まつもと ゆきひろです > > すいません、忙しくて放置してました。 > > In message "Re: [ruby-dev:40650] [Feature #2969] String#to_f が -h.hhh±pd を解釈できるように" > on Tue, 16 Mar 2010 04:01:52 +0900, Yui NARUSE<redmine@ruby-lang.org> writes: > | > |Feature #2969: String#to_f が -h.hhh±pd を解釈できるように > |http://redmine.ruby-lang.org/issues/show/2969 > | > |起票者: Yui NARUSE > |ステータス: Open, 優先度: Normal > | > |C99 の printf には a という指定子があります。 > | > | aA The argument is printed in style ‘[-h.hhh±pd]’ where there is > | one digit before the hexadecimal point and the number after > | is equal to the precision specification for the argument; > | when the precision is missing, enough digits are produced to > | convey the argument's exact double-precision floating-point > | representation. The values ∞ and NaN are printed as ‘inf’ > | and ‘nan’, respectively. > > |で、この形式を使っているのですが、RubyのString#to_f で解釈してくれず悲しくなるので、 > |解釈できるようにしませんか。 > > 最終決定ではありませんが、私の判断は以下の通りです。 > > * 1.9.2には導入しない。将来とも拒否というわけではない。 > > まず、この機能ですが、必要性はさほど高くないので、導入するの > であれば printf と同時に導入すべきだと思います。でも、実装が > 間に合わないので printf は提案しないということでしたら、無理 > に 1.9.2 に導入せずに、printfの実装も対にするべきだと思いま > す。 missing を含めた printf の実装は、[ruby-dev:40801] にあります。 ので、この点に関して時期的な問題はないかと思います。 > さて、時期の問題はともかくとして、最終的な仕様がどうあるべき > かについてですが、Rubyには「浮動小数点表現の解釈」を行う機能 > は複数あります。 > > (a) 浮動小数点リテラル > (b) Float#to_f > (c) Float() > (d) lib/scanf.rb > > で、今回導入検討している表現はメソッド呼び出しとコンフリクト > する可能性があるので (a) は対象にしないというのがコンセンサ > スだと思います。私も賛成します。 > > 次に (b) と (c) ですが、現在の Float() と to_f には、 > > * Float()は表現に厳しく、間違った表現は積極的に例外にする > * to_f は適当に解釈し、間違った表現には0.0を返す > > という違いがあります。さらに Integer() と to_i との類推からは、 > 「0x」などの解釈はFloatが行い、to_fは行わないということを期待 > してもよいのではないかと思います。 > > とすると、将来 %a 表現の解釈を導入する際にはFloat()がこの形式 > を解釈し、to_fは行わないというのが、自然ではないのかと思いま > す。もっとも、これは私の意見と言うだけで、最終決定ではありま > せんが。 なるほど、わたしは手軽に使えればよいので異論はありません。 > 最後に (d) scanf ですが、printfが %a を採用したあかつきには、 > scanf も %a を導入した方がよいと思います。 scanf の実装は [ruby-dev:40799] に示しています。 > to_iやto_fがエラーに対して 0 を返すのは、後悔している仕様の > 一つですが、今さら変えられないですね。 次のチャンスは 2.0 ですかねぇ。 -- NARUSE, Yui <naruse@airemix.jp>