ruby-trunk-changes r47209 - r47214

今日はフォーマット文字列の "%f" に Rational を渡すと精度を落とさず10進数文字列化できるようにする機能拡張がありました。

hsbt: r47209 2014-08-18 08:04:10 +0900

spec/default.mspec に記述している対象の ruby バージョンの .mspec ファイルパス を 2.2 用のものに変更しています。このファイルは rubyspec のリポジトリに入っているものなのですが、実際には CRuby の最近のバージョンでは差異がないので変更し忘れてても問題が起きなくて気がつかないんですよねぇ。

svn: r47210 2014-08-18 08:04:20 +0900

version.h の日付更新。

svn: r47211 2014-08-18 08:04:23 +0900

r47209 で変更したファイルの行末の空白除去。

nobu: r47212 2014-08-18 09:04:32 +0900

タイムゾーンのテストで Europe/Lisbone というタイムゾーンを利用していますが、これが利用できない環境もあるようで使えるかどうかのフラグを RUBY_PLATFORM 毎に設定して使えない時はテストをスキップするようにしています。とりあえず Mac OS XFreeBSD で使えないと判定するようにしています。

nobu: r47213 2014-08-18 17:06:37 +0900

sprintf.c の rb_str_format() で Float のデフォルトの精度 6 を関数の冒頭で enum で定義しておいて使うようにして、マジックナンバー化を避けています。あと変数 need が意味ありげに 6 で初期化されていましたがこれは使われてなかったので初期化自体を消しています。

nobu: r47214 2014-08-18 17:06:48 +0900

Kernel#sprintf や String#% での文字列フォーマットの指示子に %f に Rational を渡して修飾子の精度に応じた文字列化をサポートするように機能追加しています。これまでは Float に変換してから処理していたので精度を大きく指定しても正確な値にならなかったのですが、Rational は "%.60f" % [0.1r] のように大きな精度で正確に10進数文字列化できるようになりました。 [ruby-core:64382] [Bug #10136]
なるほど Rational を使えば正確な値で計算できると言いつつ、文字列化する時には Float の精度に落とされてしまっていたんですね。 Rational#to_s だと分数表現になるし。