From: KOSAKI Motohiro Date: 2010-10-18T20:16:48+09:00 Subject: [ruby-dev:42423] Re: [Ruby 1.9-Feature#3961][Open] printfと精度指定と負の値と 2010年10月18日18:01 Yui NARUSE : > Feature #3961: printfと精度指定と負の値と > http://redmine.ruby-lang.org/issues/show/3961 > > 起票者: Yui NARUSE > ステータス: Open, 優先度: Normal > カテゴリ: core, Target version: 1.9.3 > > printf が、フォーマットに精度指定しつつ負の値を与えた時の挙動が、 > Perl と必然性無く異なっていて不便です。 > > % ./ruby -e'printf("%#.8x", -1)' > 0x..ffffff > > そもそもこの挙動は C 言語由来で、C の場合例えば以下の通りになります。 > > % cat test.c > #include > int main(void) > { > printf("%#x\n", -1); > return 0; > } > % cc t.c && ./a.out > 0xffffffff > > また、おそらく直接参考にしたであろう Perl では以下の通りです、 > % perl -e'printf("%#x",-1)' > 0xffffffffffffffff > % perl -e'printf("%#.30x",-1)' > 0x00000000000000ffffffffffffffff > つまり、Perl (の 64bit int 版) では、64bitで補数を取っています。 > > さて、Ruby の場合多倍長整数が組み込みなため、補数を取ると無限に続いてしまうから、 > % ./ruby -e'printf("%#x",-1)' > 0x..f > と .. で略すのは理にかなっていると思います。 > > しかし、現在の Ruby は精度を指定した際にも..がついてしまうので、 > Perl のような動きを実現させる事ができません。 > % ./ruby -e'printf("%#.8x",-1)' > 0x..ffffff > で、この .. っていらないと思うんです。 めずらしく反対に一票投じよう。 0x..f と 0x..fffffff が両方とも同じ数値ってのはまあ納得できると思うんだ。でも 0xf と 0xfffffff は明らかに違う数に見えるしperl(やC)のように % perl -e'printf("%#.3x",-1)' 0xffffffffffffffff と、桁数が小さい時に内部表現まで拡張する。という仕様だとすると内部表現って 何桁よ。という話になるのじゃないかと思います。 別の言い方をすると、この変更が内部モデルの根本的な差異を吸収できるような パワーを十分もっているとは思いません > > 例えば浮動小数点数の場合には以下のように .. とか付けずにぶった切る訳で、 > 無限大方向と無限小方向という違いはあれど、 > 「Perlとかと同じ挙動にできない」というデメリットの方が大きいのではないでしょうか。 > % ./ruby -e'printf("%#.8f",10.0/3)' > 3.33333333 > > わたしの場合、CRuby 側の inspect が printf("%x", negative_value) などとしている部分の動作を > RubySpec で Ruby で書く時に頭を抱えてしまいました。