https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2010-10-18T19:13:59Z
Ruby Issue Tracking System
Ruby master - Feature #3961: printfと精度指定と負の値と
https://bugs.ruby-lang.org/issues/3961?journal_id=13811
2010-10-18T19:13:59Z
akr (Akira Tanaka)
akr@fsij.org
<ul></ul><p>=begin<br>
2010年10月18日18:01 Yui NARUSE <a href="mailto:redmine@ruby-lang.org" class="email">redmine@ruby-lang.org</a>:</p>
<blockquote>
<p>Feature <a class="issue tracker-2 status-6 priority-4 priority-default closed" title="Feature: printfと精度指定と負の値と (Rejected)" href="https://bugs.ruby-lang.org/issues/3961">#3961</a>: printfと精度指定と負の値と<br>
<a href="http://redmine.ruby-lang.org/issues/show/3961" class="external">http://redmine.ruby-lang.org/issues/show/3961</a></p>
<p>起票者: Yui NARUSE<br>
ステータス: Open, 優先度: Normal<br>
カテゴリ: core, Target version: 1.9.3</p>
<p>printf が、フォーマットに精度指定しつつ負の値を与えた時の挙動が、<br>
Perl と必然性無く異なっていて不便です。</p>
</blockquote>
<p>Ruby の挙動は 32bit とか 64bit という環境依存なものに依存しないという点で<br>
必然性のある仕様です。</p>
<blockquote>
<p>例えば浮動小数点数の場合には以下のように .. とか付けずにぶった切る訳で、<br>
無限大方向と無限小方向という違いはあれど、<br>
「Perlとかと同じ挙動にできない」というデメリットの方が大きいのではないでしょうか。<br>
% ./ruby -e'printf("%#.8f",10.0/3)'<br>
3.33333333</p>
</blockquote>
<p>無限大と無限小はぜんぜん違うでしょう。<br>
小さい方を無視するのはありえても、大きい方を無視するのはありえないと思います。</p>
<blockquote>
<p>わたしの場合、CRuby 側の inspect が printf("%x", negative_value) などとしている部分の動作を<br>
RubySpec で Ruby で書く時に頭を抱えてしまいました。</p>
</blockquote>
<p>結局、どのような挙動にしたいのかが日本語で説明されていないんですが、<br>
環境依存なのにしたいのかなぁ、と思いきや、パッチを見るとそうでもないようです。</p>
<a name="どうしたいのか説明していただけませんか"></a>
<h2 >どうしたいのか説明していただけませんか?<a href="#どうしたいのか説明していただけませんか" class="wiki-anchor">¶</a></h2>
<p>[田中 哲][たなか あきら][Tanaka Akira]</p>
<p>=end</p>
Ruby master - Feature #3961: printfと精度指定と負の値と
https://bugs.ruby-lang.org/issues/3961?journal_id=13813
2010-10-18T20:17:05Z
kosaki (Motohiro KOSAKI)
kosaki.motohiro@gmail.com
<ul></ul><p>=begin<br>
2010年10月18日18:01 Yui NARUSE <a href="mailto:redmine@ruby-lang.org" class="email">redmine@ruby-lang.org</a>:</p>
<blockquote>
<p>Feature <a class="issue tracker-2 status-6 priority-4 priority-default closed" title="Feature: printfと精度指定と負の値と (Rejected)" href="https://bugs.ruby-lang.org/issues/3961">#3961</a>: printfと精度指定と負の値と<br>
<a href="http://redmine.ruby-lang.org/issues/show/3961" class="external">http://redmine.ruby-lang.org/issues/show/3961</a></p>
<p>起票者: Yui NARUSE<br>
ステータス: Open, 優先度: Normal<br>
カテゴリ: core, Target version: 1.9.3</p>
<p>printf が、フォーマットに精度指定しつつ負の値を与えた時の挙動が、<br>
Perl と必然性無く異なっていて不便です。</p>
<p>% ./ruby -e'printf("%#.8x", -1)'<br>
0x..ffffff</p>
<p>そもそもこの挙動は C 言語由来で、C の場合例えば以下の通りになります。</p>
<p>% cat test.c<br>
#include <stdio.h><br>
int main(void)<br>
{<br>
printf("%#x\n", -1);<br>
return 0;<br>
}<br>
% cc t.c && ./a.out<br>
0xffffffff</p>
<p>また、おそらく直接参考にしたであろう Perl では以下の通りです、<br>
% perl -e'printf("%#x",-1)'<br>
0xffffffffffffffff<br>
% perl -e'printf("%#.30x",-1)'<br>
0x00000000000000ffffffffffffffff<br>
つまり、Perl (の 64bit int 版) では、64bitで補数を取っています。</p>
<p>さて、Ruby の場合多倍長整数が組み込みなため、補数を取ると無限に続いてしまうから、<br>
% ./ruby -e'printf("%#x",-1)'<br>
0x..f<br>
と .. で略すのは理にかなっていると思います。</p>
<p>しかし、現在の Ruby は精度を指定した際にも..がついてしまうので、<br>
Perl のような動きを実現させる事ができません。<br>
% ./ruby -e'printf("%#.8x",-1)'<br>
0x..ffffff<br>
で、この .. っていらないと思うんです。</p>
</blockquote>
<p>めずらしく反対に一票投じよう。</p>
<p>0x..f<br>
と<br>
0x..fffffff<br>
が両方とも同じ数値ってのはまあ納得できると思うんだ。でも</p>
<p>0xf<br>
と<br>
0xfffffff</p>
<p>は明らかに違う数に見えるしperl(やC)のように</p>
<p>% perl -e'printf("%#.3x",-1)'<br>
0xffffffffffffffff</p>
<p>と、桁数が小さい時に内部表現まで拡張する。という仕様だとすると内部表現って<br>
何桁よ。という話になるのじゃないかと思います。</p>
<p>別の言い方をすると、この変更が内部モデルの根本的な差異を吸収できるような<br>
パワーを十分もっているとは思いません</p>
<blockquote>
<p>例えば浮動小数点数の場合には以下のように .. とか付けずにぶった切る訳で、<br>
無限大方向と無限小方向という違いはあれど、<br>
「Perlとかと同じ挙動にできない」というデメリットの方が大きいのではないでしょうか。<br>
% ./ruby -e'printf("%#.8f",10.0/3)'<br>
3.33333333</p>
<p>わたしの場合、CRuby 側の inspect が printf("%x", negative_value) などとしている部分の動作を<br>
RubySpec で Ruby で書く時に頭を抱えてしまいました。</p>
</blockquote>
<p>=end</p>
Ruby master - Feature #3961: printfと精度指定と負の値と
https://bugs.ruby-lang.org/issues/3961?journal_id=13817
2010-10-18T22:36:14Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul></ul><p>=begin<br>
なかだです。</p>
<p>At Mon, 18 Oct 2010 18:01:03 +0900,<br>
Yui NARUSE wrote in <a href="/issues/3961">[ruby-dev:42420]</a>:</p>
<blockquote>
<p>わたしの場合、CRuby 側の inspect が printf("%x", negative_value) などとしている部分の動作を<br>
RubySpec で Ruby で書く時に頭を抱えてしまいました。</p>
</blockquote>
<p>それはRubySpecが間違ったことをしているのです。</p>
<p>--<br>
--- 僕の前にBugはない。<br>
--- 僕の後ろにBugはできる。<br>
中田 伸悦</p>
<p>=end</p>
Ruby master - Feature #3961: printfと精度指定と負の値と
https://bugs.ruby-lang.org/issues/3961?journal_id=13818
2010-10-18T22:43:35Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Rejected</i></li></ul><p>=begin</p>
<p>=end</p>
Ruby master - Feature #3961: printfと精度指定と負の値と
https://bugs.ruby-lang.org/issues/3961?journal_id=13819
2010-10-18T22:43:53Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul></ul><p>=begin<br>
(2010/10/18 19:13), Tanaka Akira wrote:</p>
<blockquote>
<p>2010年10月18日18:01 Yui NARUSE<a href="mailto:redmine@ruby-lang.org" class="email">redmine@ruby-lang.org</a>:</p>
<blockquote>
<p>Feature <a class="issue tracker-2 status-6 priority-4 priority-default closed" title="Feature: printfと精度指定と負の値と (Rejected)" href="https://bugs.ruby-lang.org/issues/3961">#3961</a>: printfと精度指定と負の値と<br>
<a href="http://redmine.ruby-lang.org/issues/show/3961" class="external">http://redmine.ruby-lang.org/issues/show/3961</a></p>
<p>起票者: Yui NARUSE<br>
ステータス: Open, 優先度: Normal<br>
カテゴリ: core, Target version: 1.9.3</p>
<p>printf が、フォーマットに精度指定しつつ負の値を与えた時の挙動が、<br>
Perl と必然性無く異なっていて不便です。</p>
</blockquote>
<p>Ruby の挙動は 32bit とか 64bit という環境依存なものに依存しないという点で<br>
必然性のある仕様です。</p>
</blockquote>
<p>まぁ、それ自体はわかります。</p>
<blockquote>
<blockquote>
<p>例えば浮動小数点数の場合には以下のように .. とか付けずにぶった切る訳で、<br>
無限大方向と無限小方向という違いはあれど、<br>
「Perlとかと同じ挙動にできない」というデメリットの方が大きいのではないでしょうか。<br>
% ./ruby -e'printf("%#.8f",10.0/3)'<br>
3.33333333</p>
</blockquote>
<p>無限大と無限小はぜんぜん違うでしょう。<br>
小さい方を無視するのはありえても、大きい方を無視するのはありえないと思います。</p>
</blockquote>
<p>フォーマット時に無限大に溢れているだけで、元は有限の負の値なのですから、<br>
指定次第で省略の仕方が変わるのはあり得ると思います。</p>
<blockquote>
<blockquote>
<p>わたしの場合、CRuby 側の inspect が printf("%x", negative_value) などとしている部分の動作を<br>
RubySpec で Ruby で書く時に頭を抱えてしまいました。</p>
</blockquote>
<p>結局、どのような挙動にしたいのかが日本語で説明されていないんですが、<br>
環境依存なのにしたいのかなぁ、と思いきや、パッチを見るとそうでもないようです。</p>
<p>どうしたいのか説明していただけませんか?</p>
</blockquote>
<p>sprintf で %x に負数を与えた場合、無限大に対する2の補数として返ってくるので、<br>
その桁数を精度で制御したかったのです。</p>
<p>が、遡って無限大以外の何に対して補数をとるかを、%ld などで制御するのが<br>
正しいことに気づいたので引っ込めます。</p>
<p>--<br>
NARUSE, Yui <a href="mailto:naruse@airemix.jp" class="email">naruse@airemix.jp</a></p>
<p>=end</p>