From: Nobuyoshi Nakada Date: 2008-03-06T10:46:41+09:00 Subject: [ruby-dev:33997] Re: printf "[%08f]\n", 0.0/0.0 なかだです。 At Thu, 6 Mar 2008 01:57:27 +0900, Tanaka Akira wrote in [ruby-dev:33994]: > 以下のように、printf で NaN, Inf で 0 padding が起こります。 > > % ./ruby -ve 'printf "[%08f]\n", 0.0/0.0' > ruby 1.9.0 (2008-03-06 revision 15699) [i686-linux] > [00000NaN] > % ./ruby -e 'printf "[%08f]\n", 1.0/0.0' > [00000Inf] > % ./ruby -e 'printf "[%08f]\n", -1.0/0.0' > [-0000Inf] テストも間違っているということでしょうか。 Index: sprintf.c =================================================================== --- sprintf.c (revision 15701) +++ sprintf.c (working copy) @@ -767,4 +767,5 @@ rb_str_format(int argc, const VALUE *arg const char *expr; + flags &= ~FZERO; if (isnan(fval)) { expr = "NaN"; Index: test/ruby/test_sprintf.rb =================================================================== --- test/ruby/test_sprintf.rb (revision 15701) +++ test/ruby/test_sprintf.rb (working copy) @@ -88,7 +88,7 @@ class TestSprintf < Test::Unit::TestCase assert_equal(" +NaN", sprintf("%+8f", nan)) - assert_equal("00000NaN", sprintf("%08f", nan)) + assert_equal(" NaN", sprintf("%08f", nan)) assert_equal("NaN ", sprintf("%-08f", nan)) - assert_equal("+0000NaN", sprintf("%+08f", nan)) + assert_equal(" +NaN", sprintf("%+08f", nan)) assert_equal(" NaN", sprintf("% 8f", nan)) @@ -96,7 +96,7 @@ class TestSprintf < Test::Unit::TestCase assert_equal(" +NaN", sprintf("%+ 8f", nan)) - assert_equal(" 0000NaN", sprintf("% 08f", nan)) + assert_equal(" NaN", sprintf("% 08f", nan)) assert_equal(" NaN ", sprintf("%- 08f", nan)) - assert_equal("+0000NaN", sprintf("%+ 08f", nan)) + assert_equal(" +NaN", sprintf("%+ 08f", nan)) end @@ -111,7 +111,7 @@ class TestSprintf < Test::Unit::TestCase assert_equal(" +Inf", sprintf("%+8f", inf)) - assert_equal("00000Inf", sprintf("%08f", inf)) + assert_equal(" Inf", sprintf("%08f", inf)) assert_equal("Inf ", sprintf("%-08f", inf)) - assert_equal("+0000Inf", sprintf("%+08f", inf)) + assert_equal(" +Inf", sprintf("%+08f", inf)) assert_equal(" Inf", sprintf("% 8f", inf)) @@ -119,7 +119,7 @@ class TestSprintf < Test::Unit::TestCase assert_equal(" +Inf", sprintf("%+ 8f", inf)) - assert_equal(" 0000Inf", sprintf("% 08f", inf)) + assert_equal(" Inf", sprintf("% 08f", inf)) assert_equal(" Inf ", sprintf("%- 08f", inf)) - assert_equal("+0000Inf", sprintf("%+ 08f", inf)) + assert_equal(" +Inf", sprintf("%+ 08f", inf)) assert_equal("-Inf", sprintf("%f", -inf)) @@ -131,7 +131,7 @@ class TestSprintf < Test::Unit::TestCase assert_equal(" -Inf", sprintf("%+8f", -inf)) - assert_equal("-0000Inf", sprintf("%08f", -inf)) + assert_equal(" -Inf", sprintf("%08f", -inf)) assert_equal("-Inf ", sprintf("%-08f", -inf)) - assert_equal("-0000Inf", sprintf("%+08f", -inf)) + assert_equal(" -Inf", sprintf("%+08f", -inf)) assert_equal(" -Inf", sprintf("% 8f", -inf)) @@ -139,7 +139,7 @@ class TestSprintf < Test::Unit::TestCase assert_equal(" -Inf", sprintf("%+ 8f", -inf)) - assert_equal("-0000Inf", sprintf("% 08f", -inf)) + assert_equal(" -Inf", sprintf("% 08f", -inf)) assert_equal("-Inf ", sprintf("%- 08f", -inf)) - assert_equal("-0000Inf", sprintf("%+ 08f", -inf)) + assert_equal(" -Inf", sprintf("%+ 08f", -inf)) assert_equal('..f00000000', sprintf("%x", -2**32), '[ruby-dev:32351]') -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦