ruby-trunk-changes r36396 - r36410

今日は主に Fixnum, Bignum と Float の比較のリファクタリング、バグ修正がありました。

akr:r36396 2012-07-16 14:15:36 +0900

bignum.c が内部で比較演算子(<, <=, >, >=)として定数を使っていたのを enum big_op_t として型を宣言してこれを使うようにしています。

svn:r36397 2012-07-16 14:15:40 +0900

version.h の日付更新。

akr:r36398 2012-07-16 15:02:21 +0900

Bignum の比較で相手が Float だった時の処理を rb_big_float_cmp() という関数に切り出して、Float の比較演算子の実装でも相手が Bignum だった時にこの関数を利用するようにしています。

akr:r36399 2012-07-16 15:38:28 +0900

Bignum#== でも相手が Float だった時に rb_big_float_cmp() を利用するようにリファクタリングしています。

ayumin:r36400 2012-07-16 17:15:05 +0900

FileUtils の uptodate? というメソッドに未使用の省略可能な第3引数 option というのがあったのを削除しています。元々指定したらわざわざ例外を上げていたというわけのわからないものだったようです。 [ruby-core:46256] [Bug #6708]

ayumin:r36401 2012-07-16 17:15:08 +0900

FileUtils#uptodate? に第3引数を渡した時の例外をチェックするテストを追加しています。

ayumin:r36402 2012-07-16 17:15:12 +0900

ChangeLog のエントリの修正したメソッド名を修正しています。

akr:r36403 2012-07-16 17:44:32 +0900

rb_big_float_cmp() に x が Fixnum の時のサポートも追加して Fixnum の比較演算子と cmp の実装と Float で比較相手が Fixnum の時にも利用するようにしています。 しかしこうなると関数名が実体を表していなくなるような(という振りをしておく)。

akr:r36404 2012-07-16 18:08:58 +0900

long よりも double の精度のほうが小さい(double は符号部と指数部があるのでサイズが同じなら精度はlongのほうが高い)場合により正確な比較をするようにしています。このために Float との比較を関数にまとめるリファクタリングをしていたのですね。 [ruby-core:31376] [Bug #3589]

akr:r36405 2012-07-16 18:41:25 +0900

rb_big_float_cmp() という関数名を Fixnum も対象に含むようになったので rb_integer_float_cmp() に改名しています。

akr:r36406 2012-07-16 19:02:59 +0900

rb_integer_float_cmp() の a というローカル変数名をもう少し説明的な名前に変更しています。

akr:r36407 2012-07-16 19:39:42 +0900

bignum.c に Fixnum/Bignum と Float の比較(一致するかどうか)をチェックする rb_integer_float_eq() という関数を追加して、 rb_integer_float_cmp() の返り値(-1, 0, 1 の Fixnum) を確認するかわりにこちらを使うようにしています。

ayumin:r36408 2012-07-16 22:08:04 +0900

Readline.basic_word_break_characters= の rdoc 用コメントにデフォルトの単語区切りとなる文字種の説明で空白文字が抜けていたのを修正しています。

akr:r36409 2012-07-16 22:52:10 +0900

Float#to_s で整数部の桁数が仮数部の精度を越える場合は自然対数表現(1.2e3 みたいな表記)を使うように変更しています。これは精度が足りずに実際は 0 でない整数部の桁に0が並んでしまうのを割けるためです。 [ruby-dev:45960] [Bug #6741]

akr:r36410 2012-07-16 23:30:24 +0900

r36404 で Fixnum と Float の比較を正確にするための範囲チェックとして LONG_MIN と LONG_MAX を利用していた所を FIXNUM_MIN と FIXNUM_MAX という定数を利用するように変更しています。後で Fixnum を long に変換してから比較するのですが、Fixnum の範囲はより狭いので(下位1bitをタグに使っているので)より正確に弾けるようにしているようです。