[Feature #2969] String#to_f $B$,(B -h.hhh$B!^(Bpd $B$r2r<a$G$-$k$h$&$K(B

Feature #2969: String#to_f e$B$,e(B -h.hhhe$B!^e(Bpd
e$B$r2r<a$G$-$k$h$&$Ke(B
http://redmine.ruby-lang.org/issues/show/2969

e$B5/I<<Te(B: Yui NARUSE
e$B%9%F!<%?%9e(B: Open, e$BM%@hEYe(B: Normal

C99 e$B$Ne(B printf e$B$K$Oe(B a e$B$H$$$&;XDj;R$,$"$j$^$9!#e(B

 aA          The argument is printed in style 

e$B!Fe(B[-h.hhhe$B!^e(Bpd]e$B!Ge(B where there is
one digit before the hexadecimal point and the number
after
is equal to the precision specification for the
argument;
when the precision is missing, enough digits are
produced to
convey the argument’s exact double-precision
floating-point
representation. The values e$B!ge(B and NaN are
printed as e$B!Fe(Binfe$B!Ge(B
and e$B!Fe(Bnane$B!Ge(B, respectively.

e$B$3$l$r;H$&$H!"0J2<$N$h$&$J7A$G@07A$5$l$^$9!#e(B
-0.0 #=> “-0x0p+0”
729.0/10 #=> “0x1.239999999999ap+6”
Math.log(3) #=> “0x1.193ea7aad030ap+0”
Math.exp(100) #=> “0x1.3494a9b171bf5p+144”

e$B$3$N7A<0$NMxE@$O!"J#;($JIbF0>.?tE@?t$rHf3SE*>/$J$$J8;z?t$G@53N$KI=$;$k$3$H$H!“e(B
e$B2>?tIt$,e(B16e$B?J$G$”$k$?$a4]$a$,5/$-$F$$$k$3$H$r@bL@$9$k:]$KJXMx$JE@$,5s$2$i$l$^$9!#e(B

e$B$G!"$3$N7A<0$r;H$C$F$$$k$N$G$9$,!"e(BRubye$B$Ne(BString#to_f
e$B$G2r<a$7$F$/$l$:Ha$7$/$J$k$N$G!"e(B
e$B2r<a$G$-$k$h$&$K$7$^$;$s$+!#e(B
e$B%Q%C%A$O0J2<$NDL$j$G$9!#e(B

diff --git a/util.c b/util.c
index 5ebc5f3…e361d51 100644
— a/util.c
+++ b/util.c
@@ -2106,6 +2106,44 @@ ruby_strtod(const char *s00, char **se)
}
break2:
if (*s == ‘0’) {

  •   if (s[1] == 'x') {
    
  •       static const char hexdigit[] = 
    

“0123456789abcdef0123456789ABCDEF”;

  •       s0 = ++s;
    
  •       adj = 0;
    
  •       while (*++s && (s1 = strchr(hexdigit, *s))) {
    
  •           adj *= 16;
    
  •           adj += (s1 - hexdigit) & 15;
    
  •       }
    
  •       if (*s == '.') {
    
  •           aadj = 1.;
    
  •           while (*++s && (s1 = strchr(hexdigit, *s))) {
    
  •               aadj /= 16;
    
  •               adj += aadj * ((s1 - hexdigit) & 15);
    
  •           }
    
  •       }
    
  •       if (*s != 'p') {
    
  •           s = s0;
    
  •           goto ret;
    
  •       }
    
  •       dsign = 0x2C - *++s; /* +: 2B, -: 2D */
    
  •       if (abs(dsign) != 1) {
    
  •           s = s0;
    
  •           goto ret;
    
  •       }
    
  •       for (nd = 0, s++; (c = *s) >= '0' && c <= '9'; s++) {
    
  •           nd *= 10;
    
  •           nd += c;
    
  •           nd -= '0';
    
  •       }
    
  •       dval(rv) = ldexp(adj, nd * dsign);
    
  •       goto ret;
    
  •   }
       nz0 = 1;
       while (*++s == '0') ;
       if (!*s)
    

diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb
index 64205f6…72d3242 100644
— a/test/ruby/test_string.rb
+++ b/test/ruby/test_string.rb
@@ -1381,10 +1381,24 @@ class TestString < Test::Unit::TestCase
end

def test_to_f

  • assert_equal(0.0, S(“0.0”).to_f)
  • assert_equal(?0, S(“0.0”).to_f.to_s[0])
  • assert_equal(-0.0, S(“-0.0”).to_f)
  • assert_equal(?-, S(“-0.0”).to_f.to_s[0])
    assert_equal(344.3, S(“344.3”).to_f)
    assert_equal(5.9742e24, S(“5.9742e24”).to_f)
    assert_equal(98.6, S(“98.6 degrees”).to_f)
    assert_equal(0.0, S(“degrees 100.0”).to_f)
  • assert_equal(0.0, S(“0x0p+0”).to_f)
  • assert_equal(?0, S(“0x0p+0”).to_f.to_s[0])
  • assert_equal(-0.0, S(“-0x0p+0”).to_f)
  • assert_equal(?-, S(“-0x0p+0”).to_f.to_s[0])
  • assert_equal(1.0, S(“0x1p+0”).to_f)
  • assert_equal(?1, S(“0x1p+0”).to_f.to_s[0])
  • assert_equal(1024.0, S(“0x1p+10”).to_f)
  • assert_equal(0.0009765625, S(“0x1p-10”).to_f)
  • assert_equal(2.6881171418161356e+43,
    S(“0x1.3494a9b171bf5p+144”).to_f)
  • assert_equal(-3.720075976020836e-44,
    S(“-0x1.a8c1f14e2af5dp-145”).to_f)
    end

def test_to_i

e$BB<ED$G$9!#e(B

On 2010/03/16, at 4:01, Yui NARUSE wrote:

C99 e$B$Ne(B printf e$B$K$Oe(B a e$B$H$$$&;XDj;R$,$"$j$^$9!#e(B

(snip)

e$B$3$N7A<0$NMxE@$O!"J#;($JIbF0>.?tE@?t$rHf3SE*>/$J$$J8;z?t$G@53N$KI=$;$k$3$H$H!“e(B
e$B2>?tIt$,e(B16e$B?J$G$”$k$?$a4]$a$,5/$-$F$$$k$3$H$r@bL@$9$k:]$KJXMx$JE@$,5s$2$i$l$^$9!#e(B

e$B$G!"$3$N7A<0$r;H$C$F$$$k$N$G$9$,!"e(BRubye$B$Ne(BString#to_f e$B$G2r<a$7$F$/$l$:Ha$7$/$J$k$N$G!"e(B
e$B2r<a$G$-$k$h$&$K$7$^$;$s$+!#e(B

e$B$3$N5!G=!";d$bM_$7$$$G$9!#e(B


Kenta M.
OpenPGP FP = FA26 35D7 4F98 3498 0810 E0D5 F213 966F E9EB 0BCC

e$BK$r=q$-$^$7$?e(B!!
e$B!Xe(BRuby e$B5U0z$-%l%7%T!Ye(B

E-mail: [email protected]
twitter: http://twitter.com/mrkn/
blog: ドレッシングのような

e$B<ALd$G$9$,!"$3$N7A<0$OF~NO$@$1$G$J$/!"$J$s$i$+$NJ}K!$G=PNO$G$bMxMQ$G$-e(B
e$B$k$N$G$7$g$&$+!#e(B

e$B$"$H!"$3$l$rIbF0>.?tE@?t$K$*$$$Fe(B16e$B?J?t$r<u$1$D$1$k$h$&$K$7$?!"$H2r<a$9e(B
e$B$k$H!"$?$H$($P!"e(BInteger e$B$G$O!"e(B

Integer(‘0xff’) #=> 255
‘0xff’.to_i #=> 0

e$B$H$$$&0c$$$,$"$k$h$&$G$9!#e(B

Float(‘0xff.0p+0’) #=> 255.0
‘0xff.0p+0’.to_f #=> 255.0

e$B$=$l$+$i!"$3$N7A<0$,$H$F$b9ED>$7$F$$$k$h$&$K46$8$^$9!#$3$N7A<0$Oe(B e
e$B$r6&e(B
e$B$J$&;X?tI=5-$H;w$F$$$k$H;W$&$N$G$9$,!"e(B1e1 e$B$H=q$1$F$b!"e(B0x1p1
e$B$H$O=q$1$Je(B
e$B$$$7!"e(B0xffe$B!"e(B0xff.0
e$B$J$I$b<u$1$D$1$J$$$H$$$&$3$H$G$9$h$M!#e(B

e$B@.@%$G$9!#e(B

(2010/03/22 22:08), Tadayoshi F. wrote:

e$B<ALd$G$9$,!"$3$N7A<0$OF~NO$@$1$G$J$/!"$J$s$i$+$NJ}K!$G=PNO$G$bMxMQ$G$-e(B
e$B$k$N$G$7$g$&$+!#e(B

sprintf e$B%U%)!<%^%C%H$Ke(B %a e$B$He(B %A
e$B$rDI2C$9$kDs0F$rM=Dj$7$F$$$^$9!#e(B
(e$B$D$^$j!"e(BString#% e$B$K$bDI2C$5$l$ke(B)

e$B$?$@!"8=>ue(B missing/vsnprintf.c e$B$,e(B %a %A
e$B$KBP1~$7$F$*$i$:!"e(B
e$B<BAu$K;~4V$,$+$+$j$=$&$@$C$?$N$GF~NO$@$1@h$KDs0F$7$^$7$?!#e(B

1.9.3 e$B$G$O$3$A$i$bF~$l$?$$$H;W$C$F$$$^$9!#e(B

e$B$"$H!"$3$l$rIbF0>.?tE@?t$K$*$$$Fe(B16e$B?J?t$r<u$1$D$1$k$h$&$K$7$?!"$H2r<a$9e(B
e$B$k$H!"$?$H$($P!"e(BInteger e$B$G$O!"e(B

Integer(‘0xff’) #=> 255
‘0xff’.to_i #=> 0

e$B$H$$$&0c$$$,$"$k$h$&$G$9!#e(B

String#to_f e$B$O=>Mh$+$i;X?tI=5-$r5v$7$F$$$?$N$G!"e(B
String#hex e$B$J$I$H;H$$J,$1$F$$$ke(B String#to_i
e$B;v>p$,0c$&$HM}2r$7$F$$$^$9!#e(B

Float(‘0xff.0p+0’) #=> 255.0
‘0xff.0p+0’.to_f #=> 255.0

e$B$=$l$+$i!"$3$N7A<0$,$H$F$b9ED>$7$F$$$k$h$&$K46$8$^$9!#$3$N7A<0$Oe(B e e$B$r6&e(B
e$B$J$&;X?tI=5-$H;w$F$$$k$H;W$&$N$G$9$,!"e(B1e1 e$B$H=q$1$F$b!"e(B0x1p1 e$B$H$O=q$1$Je(B
e$B$$$7!"e(B0xffe$B!"e(B0xff.0 e$B$J$I$b<u$1$D$1$J$$$H$$$&$3$H$G$9$h$M!#e(B

e$B$3$NDs0F$G$OJ]<iE*$K<u$1IU$1$kHO0O$r69$a$K$7$F$$$^$7$?!#e(B
C99 e$B$Ne(B strtod e$B$HF1Ey$K$9$k$H$$$&0F$b$"$k$H;W$$$^$9$7!"e(B
e$B$o$?$7$O$=$l$KH?BP$7$^$;$s!#e(B

String#to_f e$B$O=>Mh$+$i;X?tI=5-$r5v$7$F$$$?$N$G!"e(B
String#hex e$B$J$I$H;H$$J,$1$F$$$ke(B String#to_i e$B;v>p$,0c$&$HM}2r$7$F$$$^$9!#e(B

e$B;X?tI=8=$,$"$k$3$H$O4X78$"$k$s$G$9$+$M!#e(B

to_i e$B$G$Oe(B 0x e$B$r%G%U%!%%k%H$G$O?tCM$H$7$F8+$J$$!"$=$7$Fe(B to_i
e$B$O%
%W%7%ge(B
e$B%s$r<u$1IU$1$k$H$$$&$3$H!#$b$7$3$l$,$"$^$j0UL#$N$J$$$3$H$@$C$?$i!"e(Bto_f
e$B$H$$$&$h$je(B to_i e$B$N;EMM$K5?Ld$,@8$8$^$9!#e(Bhex
e$B$O4X78$J$/!“e(B’0xff’.to_i e$B$Oe(B
0
e$B$H$7$+$J$i$J$$$3$H$K0UL#$O$J$$$N$+!”$H$$$&$3$H$G$9!#0UL#$N$J$$;H$$J,e(B
e$B$1$HCG$8$F$$$$$G$9$+!#e(B

e$B$3$NDs0F$G$OJ]<iE*$K<u$1IU$1$kHO0O$r69$a$K$7$F$$$^$7$?!#e(B
C99 e$B$Ne(B strtod e$B$HF1Ey$K$9$k$H$$$&0F$b$"$k$H;W$$$^$9$7!"e(B
e$B$o$?$7$O$=$l$KH?BP$7$^$;$s!#e(B

e$B$=$l$,J]<iE*$@$H$O;W$o$J$$$G$9$,!“8=>u$N$b$N$@$C$?$i!”$`$7$m:NMQ$7$FM_e(B
e$B$7$/$J$$$H;W$$$^$7$?!#e(B

e$B@.@%$5$s$K<B$O9M$($,$"$k$H$$$&;v$J$iB>?M$K?’!98@$o$l$k$N$b7y$G$7$g$&$+e(B
e$B$i!"0lC6Gr;f$KLa$7$F$d$jD>$7$?$[$&$,$$$$$h$&$K;W$$$^$9!#$3$NCfESH>C<Dse(B
e$B0F$r:NMQ$9$k$3$H$OH?BP$G$9!#e(B

to_i e$B$,%G%U%)%k%H$Ge(B prefix e$B$r8+$J$$$N$O!"e(B0377 e$B$N$h$&$J!"e(B
0 e$B5M$a$7$??tCMJ8;zNs$r!"e(B8 e$B?J?tI=5-$H$7$F2r<a$7$F$7$^$&$N$re(B
e$BLdBj;k$7$?$+$i$@$H;W$C$F$$$^$9!#e(B

e$B:#2s$Ne(B to_f e$B$Oe(B to_i e$B$H0[$J$j!"$3$N$h$&$J0U?^$KH?$7$?2r<a$r$7$d$9$$e(B
e$B%Q%?!<%s$,L5$$$N$G!"$d$O$j;v>p$,0[$J$k$H;W$$$^$9!#e(B

e$B$=$&$J$N$+$b$7$l$J$$$1$I!“IbF0>.?tE@?t$K$be(B16e$B?J?tI=5-$,$”$k!"$H$$$&;~E@e(B
e$B$G$b$&4pK\E*>r7o$OF1$8$K$J$C$?$H9M$($?$[$&$,$$$$$H;W$$$^$9!#e(B

e$B$7$+$7!“e(B2e$B?J$de(B8e$B?J$b4^$`$b$N$H$7$FBG$A=P$;$J$+$C$?$H$3$m$,Ds0F$,$+$J$jHye(B
e$BL/$G$”$k$3$H$r<($7$F$$$k$h$&$K46$8$^$9!#$3$&$$$&Nc30E*$JBP1~$r<h$jF~$le(B
e$B$k$N$O$9$C$-$j$7$^$;$s!#e(B

printf e$B$NBP$K$J$k$b$N$Oe(B scanf e$B$J$N$G!"e(Blib/scanf.rb
e$B$GBP1~$9$k$/$i$$$G==e(B
e$BJ,$H$$$&5$$,$7$^$9!#e(B

printf
e$B$NJQ99$r9M$($F$k$J$i!"$=$l$r;EMM$H<BAu$,MQ0U=PMh$F$+$i$G$b$$$$$oe(B
e$B$1$@$7!":#$9$0:NMQ$9$kI,MW$O$J$$$H;W$$$^$9!#e(B

e$B@.@%$G$9!#e(B

(2010/03/23 21:23), Tadayoshi F. wrote:

String#to_f e$B$O=>Mh$+$i;X?tI=5-$r5v$7$F$$$?$N$G!"e(B
String#hex e$B$J$I$H;H$$J,$1$F$$$ke(B String#to_i e$B;v>p$,0c$&$HM}2r$7$F$$$^$9!#e(B

e$B;X?tI=8=$,$"$k$3$H$O4X78$"$k$s$G$9$+$M!#e(B

to_i e$B$G$Oe(B 0x e$B$r%G%U%!%%k%H$G$O?tCM$H$7$F8+$J$$!"$=$7$Fe(B to_i e$B$O%%W%7%ge(B
e$B%s$r<u$1IU$1$k$H$$$&$3$H!#$b$7$3$l$,$"$^$j0UL#$N$J$$$3$H$@$C$?$i!"e(Bto_f
e$B$H$$$&$h$je(B to_i e$B$N;EMM$K5?Ld$,@8$8$^$9!#e(Bhex e$B$O4X78$J$/!“e(B’0xff’.to_i e$B$Oe(B
0 e$B$H$7$+$J$i$J$$$3$H$K0UL#$O$J$$$N$+!”$H$$$&$3$H$G$9!#0UL#$N$J$$;H$$J,e(B
e$B$1$HCG$8$F$$$$$G$9$+!#e(B

to_i e$B$,%G%U%)%k%H$Ge(B prefix e$B$r8+$J$$$N$O!"e(B0377
e$B$N$h$&$J!"e(B
0 e$B5M$a$7$??tCMJ8;zNs$r!"e(B8 e$B?J?tI=5-$H$7$F2r<a$7$F$7$^$&$N$re(B
e$BLdBj;k$7$?$+$i$@$H;W$C$F$$$^$9!#e(B

e$B:#2s$Ne(B to_f e$B$Oe(B to_i
e$B$H0[$J$j!"$3$N$h$&$J0U?^$KH?$7$?2r<a$r$7$d$9$$e(B
e$B%Q%?!<%s$,L5$$$N$G!"$d$O$j;v>p$,0[$J$k$H;W$$$^$9!#e(B

e$B$3$NDs0F$G$OJ]<iE*$K<u$1IU$1$kHO0O$r69$a$K$7$F$$$^$7$?!#e(B
C99 e$B$Ne(B strtod e$B$HF1Ey$K$9$k$H$$$&0F$b$"$k$H;W$$$^$9$7!"e(B
e$B$o$?$7$O$=$l$KH?BP$7$^$;$s!#e(B

e$B$=$l$,J]<iE*$@$H$O;W$o$J$$$G$9$,!“8=>u$N$b$N$@$C$?$i!”$`$7$m:NMQ$7$FM_e(B
e$B$7$/$J$$$H;W$$$^$7$?!#e(B

e$B@.@%$5$s$K<B$O9M$($,$"$k$H$$$&;v$J$iB>?M$K?’!98@$o$l$k$N$b7y$G$7$g$&$+e(B
e$B$i!"0lC6Gr;f$KLa$7$F$d$jD>$7$?$[$&$,$$$$$h$&$K;W$$$^$9!#$3$NCfESH>C<Dse(B
e$B0F$r:NMQ$9$k$3$H$OH?BP$G$9!#e(B

e$B!VJ]<iE*!W$G$"$kE@$K$D$$$F$O$=$3$^$G$3$@$o$j$O$J$$$N$G!"e(B
e$B<BAu$9$k$J$i$P0J2<$NDL$j$G$7$g$&$+!#e(B

diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb
index 9dd3ea9…c5b86fa 100644
— a/test/ruby/test_string.rb
+++ b/test/ruby/test_string.rb
@@ -1398,7 +1398,10 @@ class TestString < Test::Unit::TestCase
assert_equal([-0.0].pack(‘G’), [S("-0.0").to_f].pack(‘G’))
assert_equal([ 0.0].pack(‘G’), [S(" 0x0p+0").to_f].pack(‘G’))
assert_equal([-0.0].pack(‘G’), [S("-0x0p+0").to_f].pack(‘G’))

  • assert_equal(255.0, S(“0Xff”).to_f)
  • assert_equal(255.5, S(“0Xff.8”).to_f)
    assert_equal(1.0, S(“0X1.P+0”).to_f)
  • assert_equal(1024.0, S(“0x1p10”).to_f)
    assert_equal(1024.0, S(“0x1p+10”).to_f)
    assert_equal(0.0009765625, S(“0x1p-10”).to_f)
    assert_equal(2.6881171418161356e+43,
    S(“0x1.3494a9b171bf5p+144”).to_f)
    diff --git a/util.c b/util.c
    index 9cdb563…eebc979 100644
    — a/util.c
    +++ b/util.c
    @@ -2110,6 +2110,8 @@ break2:
    static const char hexdigit[] =
    “0123456789abcdef0123456789ABCDEF”;
    s0 = ++s;
    adj = 0;
  •       nd = 0;
    
  •       dsign = 0;
    
          while (*++s && (s1 = strchr(hexdigit, *s))) {
              adj *= 16;
    

@@ -2124,21 +2126,18 @@ break2:
}
}

  •       if (*s != 'P' && *s != 'p') {
    
  •           s = s0;
    
  •           goto ret;
    
  •       }
    
  •       dsign = 0x2C - *++s; /* +: 2B, -: 2D */
    
  •       if (abs(dsign) != 1) {
    
  •           s = s0;
    
  •           goto ret;
    
  •       }
    
  •       if (*s == 'P' || *s == 'p') {
    
  •           dsign = 0x2C - *++s; /* +: 2B, -: 2D */
    
  •           if (abs(dsign) != 1) {
    
  •               dsign = 1;
    
  •               s--;
    
  •           }
    
  •       for (nd = 0, s++; (c = *s) >= '0' && c <= '9'; s++) {
    
  •           nd *= 10;
    
  •           nd += c;
    
  •           nd -= '0';
    
  •           while ((c = *++s) >= '0' && c <= '9') {
    
  •               nd *= 10;
    
  •               nd += c;
    
  •               nd -= '0';
    
  •           }
          }
    
          dval(rv) = ldexp(adj, nd * dsign);

e$B@.@%$G$9!#e(B

(2010/03/24 23:34), Tadayoshi F. wrote:

to_i e$B$,%G%U%)%k%H$Ge(B prefix e$B$r8+$J$$$N$O!"e(B0377 e$B$N$h$&$J!"e(B
0 e$B5M$a$7$??tCMJ8;zNs$r!"e(B8 e$B?J?tI=5-$H$7$F2r<a$7$F$7$^$&$N$re(B
e$BLdBj;k$7$?$+$i$@$H;W$C$F$$$^$9!#e(B

e$B:#2s$Ne(B to_f e$B$Oe(B to_i e$B$H0[$J$j!"$3$N$h$&$J0U?^$KH?$7$?2r<a$r$7$d$9$$e(B
e$B%Q%?!<%s$,L5$$$N$G!"$d$O$j;v>p$,0[$J$k$H;W$$$^$9!#e(B

e$B$=$&$J$N$+$b$7$l$J$$$1$I!“IbF0>.?tE@?t$K$be(B16e$B?J?tI=5-$,$”$k!"$H$$$&;~E@e(B
e$B$G$b$&4pK\E*>r7o$OF1$8$K$J$C$?$H9M$($?$[$&$,$$$$$H;W$$$^$9!#e(B

String#to_i e$B$Oe(B 0-prefix e$B$G$Ne(B 8
e$B?J?t8mGz$rKI$0$?$a$KJ,$1$?$N$@$He(B
e$B;W$C$F$$$k$o$1$G$9$,!“e(BString#to_f
e$B$O2?$N$?$a$KJ,$1$k$s$G$9$+e(B?
e$BI,MW@-$,$”$l$PJ,$1$?J}$,$$$$$N$G$7$g$&$,!"$"$k$h$&$K$O;W$($^$;$s!#e(B

e$B$7$+$7!“e(B2e$B?J$de(B8e$B?J$b4^$`$b$N$H$7$FBG$A=P$;$J$+$C$?$H$3$m$,Ds0F$,$+$J$jHye(B
e$BL/$G$”$k$3$H$r<($7$F$$$k$h$&$K46$8$^$9!#$3$&$$$&Nc30E*$JBP1~$r<h$jF~$le(B
e$B$k$N$O$9$C$-$j$7$^$;$s!#e(B

e$B@h$N%Q%C%A$NBP>]4X?t$,e(B ruby_strtod e$B$G$"$kDL$j!“e(B
e$B@h$NDs0F$Oe(B strtod(3) e$B$r%Y!<%9$K$7$F$$$^$9!#e(B
e$B$h$C$F!”$=$3$K$J$$e(B 2 e$B?J$de(B 8
e$B?J$rFH<+$KDI2C$9$kI,MW$r46$8$^$;$s!#e(B

printf e$B$NBP$K$J$k$b$N$Oe(B scanf e$B$J$N$G!"e(Blib/scanf.rb e$B$GBP1~$9$k$/$i$$$G==e(B
e$BJ,$H$$$&5$$,$7$^$9!#e(B

scanf e$B$be(B hexadecimal-floating-constant
e$B$KBP1~$7$F$b$$$$$H$O;W$$$^$9$,!"e(B
e$B$=$b$=$b$,e(B C99 e$B$N%j%F%i%k$J$N$G!"e(Bprintf
e$B$K$3$@$o$k$3$H$bL5$$$H;W$$$^$9!#e(B

printf e$B$NJQ99$r9M$($F$k$J$i!"$=$l$r;EMM$H<BAu$,MQ0U=PMh$F$+$i$G$b$$$$$oe(B
e$B$1$@$7!":#$9$0:NMQ$9$kI,MW$O$J$$$H;W$$$^$9!#e(B

missing/vsnprintf.c e$B0J30$J$i$P!"0J2<$NDL$j$G$9!#e(B
Windows e$B0J30$J$i$P$3$l$G;n$9$3$H$O$G$-$k$G$7$g$&!#e(B

diff --git a/sprintf.c b/sprintf.c
index bec0569…e26b833 100644
— a/sprintf.c
+++ b/sprintf.c
@@ -227,6 +227,10 @@ get_hash(volatile VALUE *hash, int argc, const
VALUE *argv)

  •        | equal to the precision, or in dd.dddd form otherwise.
    
  •        | The precision specifies the number of significant 
    

digits.

  •    G   | Equivalent to `g', but use an uppercase `E' in exponent 
    

form.

    •    a   | Convert floating point argument as [-]0xh.hhhhp[+-]dd,
      
    •        | which is consisted from optional sign, "0x", fraction 
      

part

    •        | as hexadecimal, "p", and exponential part as decimal.
      
    •    A   | Equivalent to `a', but use uppercase `X' and `P'.
      
    •  Field |  Other Format
      

------±-------------------------------------------------------------
@@ -244,7 +248,7 @@ get_hash(volatile VALUE *hash, int argc, const VALUE
*argv)

  • Flag | Applies to | Meaning

---------±--------------±----------------------------------------

  • space | bBdiouxX | Leave a space at the start of
    •         | eEfgG         | non-negative numbers.
      
    •         | aAeEfgG       | non-negative numbers.
      
    •         | (numeric fmt) | For `o', `x', `X', `b' and `B', use
      
    •         |               | a minus sign with absolute value for
      
    •         |               | negative values.
      

@@ -255,19 +259,19 @@ get_hash(volatile VALUE *hash, int argc, const
VALUE *argv)

  •         |               | sprintf string.
    

---------±--------------±----------------------------------------

  • #       | bBoxX         | Use an alternative format.
    
    •         | eEfgG         | For the conversions `o', increase the 
      

precision

    •         | aAeEfgG       | For the conversions `o', increase the 
      

precision

  •         |               | until the first digit will be `0' if
    
  •         |               | it is not formatted as complements.
    
  •         |               | For the conversions `x', `X', `b' and 
    

`B’

  •         |               | on non-zero, prefix the result with 
    

``0x’’,

  •         |               | ``0X'', ``0b'' and ``0B'', 
    

respectively.

    •         |               | For `e', `E', `f', `g', and 'G',
      
    •         |               | For `a', `A', `e', `E', `f', `g', and 
      

‘G’,

  •         |               | force a decimal point to be added,
    
  •         |               | even if no digits follow.
    
  •         |               | For `g' and 'G', do not remove 
    

trailing zeros.
*
---------±--------------±----------------------------------------

    •    | bBdiouxX      | Add a leading plus sign to 
      

non-negative

    •         | eEfgG         | numbers.
      
    •         | aAeEfgG       | numbers.
      
    •         | (numeric fmt) | For `o', `x', `X', `b' and `B', use
      
    •         |               | a minus sign with absolute value for
      
    •         |               | negative values.
      

@@ -275,7 +279,7 @@ get_hash(volatile VALUE *hash, int argc, const VALUE
*argv)

    •    | all           | Left-justify the result of this 
      

conversion.
*
---------±--------------±----------------------------------------

  • 0 (zero) | bBdiouxX | Pad with zeros, not spaces.
    •         | eEfgG         | For `o', `x', `X', `b' and `B', 
      

radix-1

    •         | aAeEfgG       | For `o', `x', `X', `b' and `B', 
      

radix-1

  •         | (numeric fmt) | is used for negative numbers formatted 
    

as

  •         |               | complements.
    

---------±--------------±----------------------------------------
@@ -983,6 +987,8 @@ rb_str_format(int argc, const VALUE *argv, VALUE
fmt)
case ‘G’:
case ‘e’:
case ‘E’:

  • case ‘a’:
  • case ‘A’:
    {
    VALUE val = GETARG();
    double fval;

e$B@h$N%Q%C%A$NBP>]4X?t$,e(B ruby_strtod e$B$G$"$kDL$j!“e(B
e$B@h$NDs0F$Oe(B strtod(3) e$B$r%Y!<%9$K$7$F$$$^$9!#e(B
e$B$h$C$F!”$=$3$K$J$$e(B 2 e$B?J$de(B 8 e$B?J$rFH<+$KDI2C$9$kI,MW$r46$8$^$;$s!#e(B

e$B0UL#$,$o$+$j$^$;$s!#$G$b!"$=$NI,MW$r46$8$NCf$K$3$NDs0F$b4^$^$l$F$$$k$He(B
e$B$$$&$3$H$@$H;W$$$^$9!#A4$/I,MW$J$$$H$O$$$$$^$;$s$,!"$"$^$jI,MW$G$J$$$He(B
e$B;W$$$^$9!#e(B

scanf e$B$be(B hexadecimal-floating-constant e$B$KBP1~$7$F$b$$$$$H$O;W$$$^$9$,!"e(B
e$B$=$b$=$b$,e(B C99 e$B$N%j%F%i%k$J$N$G!"e(Bprintf e$B$K$3$@$o$k$3$H$bL5$$$H;W$$$^$9!#e(B

e$B$8$c!"$3$NDs0F<+BNI,MW$J$+$C$?$s$8$c$J$$$+$J!#CfESH>C<$Ke(B Float
e$B$rO.$k$Ne(B
e$B$O;_$a$?$[$&$,$$$$$H;W$$$^$9!#e(B

e$B@.@%$G$9!#e(B

(2010/03/25 2:51), Tadayoshi F. wrote:

e$B@h$N%Q%C%A$NBP>]4X?t$,e(B ruby_strtod e$B$G$"$kDL$j!“e(B
e$B@h$NDs0F$Oe(B strtod(3) e$B$r%Y!<%9$K$7$F$$$^$9!#e(B
e$B$h$C$F!”$=$3$K$J$$e(B 2 e$B?J$de(B 8 e$B?J$rFH<+$KDI2C$9$kI,MW$r46$8$^$;$s!#e(B

e$B0UL#$,$o$+$j$^$;$s!#$G$b!"$=$NI,MW$r46$8$NCf$K$3$NDs0F$b4^$^$l$F$$$k$He(B
e$B$$$&$3$H$@$H;W$$$^$9!#A4$/I,MW$J$$$H$O$$$$$^$;$s$,!"$"$^$jI,MW$G$J$$$He(B
e$B;W$$$^$9!#e(B

strtod(3) e$B$N2r]$K4^$^$l$F$$$J$$e(B 2 e$B?J$de(B 8
e$B?J$rH]Dj$9$k$3$H$,!"e(B
e$B$J$<4^$^$l$F$$$ke(B 16 e$B?J$NH]Dj$K$D$J$,$k$N$G$7$g$&!#e(B

scanf e$B$be(B hexadecimal-floating-constant e$B$KBP1~$7$F$b$$$$$H$O;W$$$^$9$,!"e(B
e$B$=$b$=$b$,e(B C99 e$B$N%j%F%i%k$J$N$G!"e(Bprintf e$B$K$3$@$o$k$3$H$bL5$$$H;W$$$^$9!#e(B

e$B$8$c!"$3$NDs0F<+BNI,MW$J$+$C$?$s$8$c$J$$$+$J!#CfESH>C<$Ke(B Float e$B$rO.$k$Ne(B
e$B$O;_$a$?$[$&$,$$$$$H;W$$$^$9!#e(B

String#to_f e$B$N;EMM!&<BAu$,2<I_$-$H$7$F$$$k$H;W$o$l$ke(B
strtod(3) e$B$NMWAG$re(B 1
e$B$D%^!<%8$9$k$H8@$&$3$H$,CfESH>C<$@$H$O;W$$$^$;$s!#e(B

strtod(3) e$B$N2r]$K4^$^$l$F$$$J$$e(B 2 e$B?J$de(B 8 e$B?J$rH]Dj$9$k$3$H$,!"e(B
e$B$J$<4^$^$l$F$$$ke(B 16 e$B?J$NH]Dj$K$D$J$,$k$N$G$7$g$&!#e(B

e$B$3$l$Oe(B to_f (e$B$He(B Float()) e$B$NOC$G!“e(Bstrtod(3)
e$B$NOC$G$O$”$j$^$;$s!#@.@%$5$se(B
e$B$,G’$a$?$h$&$K!“e(B2e$B?J?t$be(B8e$B?J?t$b$5$[$I=EMW$@$H$O;W$o$l$F$$$J$/$F!”:#2s$Ne(B
e$BDs0F$K$"$kIbF0>.?tE@?t$N$?$a$N3HD%$5$l$?e(B16e$B?J?t7A<0$bF1$8$@$H$$$&$3$H$@e(B
e$B$H;W$$$^$9!#e(B

String#to_f e$B$N;EMM!&<BAu$,2<I_$-$H$7$F$$$k$H;W$o$l$ke(B
strtod(3) e$B$NMWAG$re(B 1 e$B$D%^!<%8$9$k$H8@$&$3$H$,CfESH>C<$@$H$O;W$$$^$;$s!#e(B

strtod(3)
e$B$KB?>/1F6A$r<u$1$F$$$k$3$H$O$"$k$+$b$7$l$^$;$s$,!"0lHV9MN8$5e(B
e$B$l$F$$$k$N$Oe(B ruby e$B$G$N>o<1!"e(Bruby
e$B$N%j%F%i%k$@$H;W$$$^$9!#e(B

e$B8@$o$l$k$3$H$O!“e(BFloat#strtod
e$B$G$”$k$J$iM}M3$H$7$F@.$jN)$A$^$9$,!"MxMQ<Te(B
e$B$,!“e(Bstrtod e$B$HF1$8$G$”$k$3$H$r5a$a$F$k$o$1$O$J$$$H;W$$$^$9!#e(B

e$B$^$?!“7k2LE*$KB>=j$N;EMM$,1F6A$rM?$($k$3$H$O$h$/$”$k$3$H$G$9$,!"e(Bto_f
e$B$,e(B
strtod e$B$K=>$o$J$1$l$P$J$i$J$$M}M3$K$O$J$i$J$$$H;W$$$^$9$h!#e(B

e$B!V2?8N$=$&$7$?$N$+NI$/$o$+$i$J$$!"$"$"$=$&$+!“e(Bstrtod(3)
e$B$r;29M$K$7$?$+e(B
e$B$i$3$&$J$C$F$$$k$N$+!W!V2?8N$3$&$J$C$F$$$k$Ne(B? – e$B$=$l$Oe(B
strtod(3) e$B$HF1e(B
e$B$8$b$N$rDs6!$7$h$&$H$7$?$+$i$G$9!W$=$&$$$&;v$J$iJ,$j$^$9$,!”$=$&$$$&OCe(B
e$B$8$c$J$$$G$9$h$M!#e(B

lib/scanf.rb e$B$GDs6!$9$k$[$&$,Aj1~$o$7$$$H;W$$$^$9!#e(B

(2010/03/26 3:05), Tadayoshi F. wrote:

strtod(3) e$B$N2r]$K4^$^$l$F$$$J$$e(B 2 e$B?J$de(B 8 e$B?J$rH]Dj$9$k$3$H$,!"e(B
e$B$J$<4^$^$l$F$$$ke(B 16 e$B?J$NH]Dj$K$D$J$,$k$N$G$7$g$&!#e(B

e$B$3$l$Oe(B to_f (e$B$He(B Float()) e$B$NOC$G!“e(Bstrtod(3) e$B$NOC$G$O$”$j$^$;$s!#@.@%$5$se(B
e$B$,G’$a$?$h$&$K!“e(B2e$B?J?t$be(B8e$B?J?t$b$5$[$I=EMW$@$H$O;W$o$l$F$$$J$/$F!”:#2s$Ne(B
e$BDs0F$K$"$kIbF0>.?tE@?t$N$?$a$N3HD%$5$l$?e(B16e$B?J?t7A<0$bF1$8$@$H$$$&$3$H$@e(B
e$B$H;W$$$^$9!#e(B

e$B$J$<F1$8$J$N$G$7$g$&!#e(B
e$B8=:_%5%]!<%H$7$F$$$J$$$N$OC1$K<BAu;~4|$NLdBj$@$H;W$C$F$$$k$N$G$9$,!#e(B

String#to_f e$B$N;EMM!&<BAu$,2<I_$-$H$7$F$$$k$H;W$o$l$ke(B
strtod(3) e$B$NMWAG$re(B 1 e$B$D%^!<%8$9$k$H8@$&$3$H$,CfESH>C<$@$H$O;W$$$^$;$s!#e(B

strtod(3) e$B$KB?>/1F6A$r<u$1$F$$$k$3$H$O$"$k$+$b$7$l$^$;$s$,!"0lHV9MN8$5e(B
e$B$l$F$$$k$N$Oe(B ruby e$B$G$N>o<1!"e(Bruby e$B$N%j%F%i%k$@$H;W$$$^$9!#e(B

Ruby e$B$N%j%F%i%k$Oe(B C e$B8@8lM3Mh$H;W$o$l$k$N$G!“e(B
e$B$3$l$b$d$O$j30$7$F$$$k$H$O;W$$$^$;$s!#e(B
e$B$=$l$H$b!”@h$Ke(B Ruby
e$B%j%F%i%k$K$3$N7A<0$rF~$l$k$Y$-$H$$$&<gD%$G$9$+e(B?

e$B8@$o$l$k$3$H$O!“e(BFloat#strtod e$B$G$”$k$J$iM}M3$H$7$F@.$jN)$A$^$9$,!"MxMQ<Te(B
e$B$,!“e(Bstrtod e$B$HF1$8$G$”$k$3$H$r5a$a$F$k$o$1$O$J$$$H;W$$$^$9!#e(B

e$B$^$?!“7k2LE*$KB>=j$N;EMM$,1F6A$rM?$($k$3$H$O$h$/$”$k$3$H$G$9$,!"e(Bto_f e$B$,e(B
strtod e$B$K=>$o$J$1$l$P$J$i$J$$M}M3$K$O$J$i$J$$$H;W$$$^$9$h!#e(B

e$BA4LLE*$Ke(B strtod(3) e$B$K=>$&$Y$-$H$$$&<gD%$O$o$?$7$b$7$^$;$s!#e(B
e$B0lJ}$G!“e(Bstrtod(3) e$B$G2r<a$G$-$k$b$N$Oe(B to_f
e$B$G$b2r<a$G$-$F$$$$$@$m$&$H$$$&e(B
e$B<gD%$O$”$j$(!"e(B

e$B!V2?8N$=$&$7$?$N$+NI$/$o$+$i$J$$!"$"$"$=$&$+!“e(Bstrtod(3) e$B$r;29M$K$7$?$+e(B
e$B$i$3$&$J$C$F$$$k$N$+!W!V2?8N$3$&$J$C$F$$$k$Ne(B? – e$B$=$l$Oe(B strtod(3) e$B$HF1e(B
e$B$8$b$N$rDs6!$7$h$&$H$7$?$+$i$G$9!W$=$&$$$&;v$J$iJ,$j$^$9$,!”$=$&$$$&OCe(B
e$B$8$c$J$$$G$9$h$M!#e(B

e$B$o$?$7$N0U?^$H$$$&OC$G$7$?$i!VF1$8$b$N$rDs6!$7$h$&!W$H$^$G$O8@$$$^$;$s$,!"e(B
e$B!V;29M$K!W$O$7$F$$$^$9!#e(B

Ruby e$B$N;EMM!&<BAu$H$$$&0UL#$G$7$?$i!"e(Br2457 e$B$+$i$9$k$K!"e(B
e$B!VF1$8$b$N$rDs6!$7$h$&$H$7$?!W$h$&$K8+$($^$9!#e(B
e$B$3$3$Ge(B 16 e$B?J5-K!$r2r<a$7$J$/$J$C$?$N$O!"8=>ue(B “INF” e$B$de(B
“NAN” e$B$J$I$be(B
e$B2r<a$7$J$$$3$H$r9M$($k$H!"e(BC89 e$B$Ne(B strtod
e$B$,M3Mh$@$+$i$G$7$g$&$+$M!#e(B
e$B$3$NE@$O$^$D$b$H$5$s$K3NG’$r<h$j$^$9!#e(B

* util.c (ruby_strtod): use own strtod(3) implementation to avoid
  locale hell.  Due to this change "0xff".to_f no longer returns 

255.0

lib/scanf.rb e$B$GDs6!$9$k$[$&$,Aj1~$o$7$$$H;W$$$^$9!#e(B

e$B$o$?$7$Oe(B String#to_f e$B$O2r<a$9$Y$-$@$H;W$C$F$$$^$9!#e(B

e$B$($0$A!w%(%9%"%s%I%$!<$G$9e(B
e$B!t$*$R$5$7$V$j$G$9e(B

2010e$BG/e(B3e$B7ne(B24e$BF|e(B2:55 NARUSE, Yui [email protected]:

e$B$1$HCG$8$F$$$$$G$9$+!#e(B

to_i e$B$,%G%U%)%k%H$Ge(B prefix e$B$r8+$J$$$N$O!"e(B0377 e$B$N$h$&$J!"e(B
0 e$B5M$a$7$??tCMJ8;zNs$r!"e(B8 e$B?J?tI=5-$H$7$F2r<a$7$F$7$^$&$N$re(B
e$BLdBj;k$7$?$+$i$@$H;W$C$F$$$^$9!#e(B

e$B:#2s$Ne(B to_f e$B$Oe(B to_i e$B$H0[$J$j!“$3$N$h$&$J0U?^$KH?$7$?2r<a$r$7$d$9$$e(B
e$B%Q%?!<%s$,L5$$$N$G!”$d$O$j;v>p$,0[$J$k$H;W$$$^$9!#e(B

e$B:n0YE*$G$9$,e(B
0x1.badp+0
e$B$N$h$&$J%Q%?!<%s$G0U?^$KH?$7$?2r<a$r$9$k2DG=@-$,$"$j$^$9!#e(B

e$B2a5n$Ke(B16e$B?JIbF0>.?tE@$r8!F$$7$?$H$-$Ke(B
e$B$3$N$h$&$J%a%=%C%I$H$N[#Kf@-$GCGG0$7$?5-21$,$"$j$^$9!#e(B

e$B$($0$Ae(B

e$B$J$<F1$8$J$N$G$7$g$&!#e(B
e$B8=:_%5%]!<%H$7$F$$$J$$$N$OC1$K<BAu;~4|$NLdBj$@$H;W$C$F$$$k$N$G$9$,!#e(B

e$BF1$8$H$$$&$h$j$O!"$b$C$HDc$$$G$9$+$M!#e(B

Ruby e$B$N%j%F%i%k$Oe(B C e$B8@8lM3Mh$H;W$o$l$k$N$G!“e(B
e$B$3$l$b$d$O$j30$7$F$$$k$H$O;W$$$^$;$s!#e(B
e$B$=$l$H$b!”@h$Ke(B Ruby e$B%j%F%i%k$K$3$N7A<0$rF~$l$k$Y$-$H$$$&<gD%$G$9$+e(B?

e$B$=$l$O$h$/$o$+$j$^$;$s!#e(Bperl
e$B7PM3$N$h$&$J5$$b$7$^$9!#2>$KJL$K$=$&$G$"$Ce(B
e$B$F$b!"e(BC e$B$K=>$o$J$1$l$P$J$i$J$$$3$H$b$J$$$G$7$g$&!#e(B

2e$B?J?t$de(B8e$B?J?t$b4^$a$F$=$l$,M-MQ$@$+$ie(B16e$B?J$b$"$k!">l9g$K$h$C$F$O%j%F%i%ke(B
e$B$b$=$&$9$k!"$H$$$&$J$ie(B Float()
e$B$N;EMM$H$7$F8D?ME*$KG<F@$G$-$^$9!#$=$l$Oe(B
e$B$=$&$G$9$,!"$=$&$9$Y$-$@$H$$$&<gD%$G$O$"$j$^$;$s!#e(B

e$B$=$&$G$J$$$J$i!"e(Blib/scanf.rb e$B$G$$$$$H;W$$$^$9!#e(B

Ruby e$B$N;EMM!&<BAu$H$$$&0UL#$G$7$?$i!"e(Br2457 e$B$+$i$9$k$K!"e(B
e$B!VF1$8$b$N$rDs6!$7$h$&$H$7$?!W$h$&$K8+$($^$9!#e(B
e$B$3$3$Ge(B 16 e$B?J5-K!$r2r<a$7$J$/$J$C$?$N$O!"8=>ue(B “INF” e$B$de(B “NAN” e$B$J$I$be(B
e$B2r<a$7$J$$$3$H$r9M$($k$H!"e(BC89 e$B$Ne(B strtod e$B$,M3Mh$@$+$i$G$7$g$&$+$M!#e(B
e$B$3$NE@$O$^$D$b$H$5$s$K3NG’$r<h$j$^$9!#e(B

e$B8"0R<g5A<T$G$b$J$$$7!"e(BC
e$B$d$^$D$b$H$5$s$KCi@?$r@@$C$F$$$k$o$1$G$b$J$$$Ne(B
e$B$G!“JL$K$=$l$G9M$($,JQ$k$o$1$8$c$J$$$s$G$9$h!#$=$j$c!”$$$m$$$m8@$C$F$be(B
e$B$^$D$b$H$5$s$N9M$($G7h$k$H$O;W$$$^$9$,!#e(B

strtod(3)
e$B$r;29M$K$7$?$j!“1F6A$5$l$?$j$9$k$3$H$OIaDL$K$”$k$H$O;W$$$^$9e(B
e$B$,!"e(Bstrtod e$B$r$3$lDx$^$G$KB:7I$7$F$$$k?M$O=i$a$F$G$9!#e(B

e$B@.@%$G$9!#e(B

(2010/03/26 8:20), EGUCHI Osamu wrote:

to_i e$B$G$Oe(B 0x e$B$r%G%U%!%%k%H$G$O?tCM$H$7$F8+$J$$!"$=$7$Fe(B to_i e$B$O%%W%7%ge(B
e$B%Q%?!<%s$,L5$$$N$G!"$d$O$j;v>p$,0[$J$k$H;W$$$^$9!#e(B

e$B:n0YE*$G$9$,e(B
0x1.badp+0
e$B$N$h$&$J%Q%?!<%s$G0U?^$KH?$7$?2r<a$r$9$k2DG=@-$,$"$j$^$9!#e(B

e$B2a5n$Ke(B16e$B?JIbF0>.?tE@$r8!F$$7$?$H$-$Ke(B
e$B$3$N$h$&$J%a%=%C%I$H$N[#Kf@-$GCGG0$7$?5-21$,$"$j$^$9!#e(B

e$B%j%F%i%k$N>l9g$O3N$+$K$4;XE&$NDL$j$G$9!#e(B
e$B$J$N$G!"e(BRuby e$B$Ge(B 16
e$B?JIbF0>.?tE@?t%j%F%i%k$rF3F~$9$k$N$O:$Fq$G$9$M!#e(B

to_f e$B$N>l9g$K$O!“e(B"0x1” e$B$re(B 0 e$B$H2r<a$7$FM_$7$+$C$?Nc$He(B
e$BF1DxEY$K$O>/$J$$$H;W$C$F$$$^$9!#e(B

(2010/03/26 4:02), Tadayoshi F. wrote:

e$B$F$b!"e(BC e$B$K=>$o$J$1$l$P$J$i$J$$$3$H$b$J$$$G$7$g$&!#e(B

2e$B?J?t$de(B8e$B?J?t$b4^$a$F$=$l$,M-MQ$@$+$ie(B16e$B?J$b$"$k!">l9g$K$h$C$F$O%j%F%i%ke(B
e$B$b$=$&$9$k!"$H$$$&$J$ie(B Float() e$B$N;EMM$H$7$F8D?ME*$KG<F@$G$-$^$9!#$=$l$Oe(B
e$B$=$&$G$9$,!"$=$&$9$Y$-$@$H$$$&<gD%$G$O$"$j$^$;$s!#e(B

e$B$D$^$j!"$U$J$P$5$s$Oe(B 16 e$B?J$h$j$be(B 2 e$B?J$de(B 8
e$B?J7A<0$,9%$_$G$"$k$H$3$m!"e(B
16 e$B?J$,$=$l$i$r:9$7CV$$$FF~$k$N$OG<F@$G$-$J$$$H$$$&;v$G$7$g$&$+!#e(B

strtod(3) e$B$r;29M$K$7$?$j!“1F6A$5$l$?$j$9$k$3$H$OIaDL$K$”$k$H$O;W$$$^$9e(B
e$B$,!"e(Bstrtod e$B$r$3$lDx$^$G$KB:7I$7$F$$$k?M$O=i$a$F$G$9!#e(B

e$B$o$?$7$N<gD%$O!"0J2<$N$h$&$J$b$N$G$9!#e(B
(1) -h.hhhe$B!^e(Bpd
e$B7A<0$O!"Id9f!&2>?t!&;X?t$H$$$&IbF0>.?tE@?t$r$=$N$^$^I=$7$F$$$k$?$a!“e(B
e$BIbF0>.?tE@$NFbMF$rCN$k$N$KM-MQ$G$”$ke(B
(2) -h.hhhe$B!^e(Bpd e$B7A<0$O!“e(BC99
e$B$NIbF0>.?tE@?t%j%F%i%k$N0l7A<0$G$”$j!“e(B
e$B$=$N7A<0$OJ8K!$K!”=PNO$Oe(B printf e$B$K!"2r<a$Oe(B strtod
e$B$K5-=R$5$l$F$$$ke(B
(3) e$BM-MQ$+$D0BDj$7$?7A<0$J$N$Ge(B Ruby e$B$G$b07$($k$Y$-$@e(B

strtod(3) e$B$r;29M$K$7$?$j!“1F6A$5$l$?$j$9$k$3$H$OIaDL$K$”$k$H$O;W$$$^$9e(B
e$B$,!"e(Bstrtod e$B$r$3$lDx$^$G$KB:7I$7$F$$$k?M$O=i$a$F$G$9!#e(B

e$B$o$?$7$N<gD%$O!"0J2<$N$h$&$J$b$N$G$9!#e(B
(1) -h.hhhe$B!^e(Bpd e$B7A<0$O!"Id9f!&2>?t!&;X?t$H$$$&IbF0>.?tE@?t$r$=$N$^$^I=$7$F$$$k$?$a!“e(B
e$BIbF0>.?tE@$NFbMF$rCN$k$N$KM-MQ$G$”$ke(B
(2) -h.hhhe$B!^e(Bpd e$B7A<0$O!“e(BC99 e$B$NIbF0>.?tE@?t%j%F%i%k$N0l7A<0$G$”$j!“e(B
e$B$=$N7A<0$OJ8K!$K!”=PNO$Oe(B printf e$B$K!"2r<a$Oe(B strtod e$B$K5-=R$5$l$F$$$ke(B
(3) e$BM-MQ$+$D0BDj$7$?7A<0$J$N$Ge(B Ruby e$B$G$b07$($k$Y$-$@e(B

kosakie$B$G$9e(B

e$B$($0$A$5$s$NDs<($5$l$?e(B 0x1.badp+0
e$B$K$D$$$F$O8+2r$rDs<($7$F$b$i$($^$;$s$G$7$g$&$+!#M-MQ$J$N$OG’$a$^$9$,!“Hs>o$K%^%$%J!<$JI=5-7A<0$G$”$j!“F3F~$7$F$b;HMQ%f!<%6$O>.?t$K$H$I$^$k$H9M$($F$$$^$9!#$b$C$H$$$&$H!”$&$l$7$$$N$O0lHL%f!<%6$8$c$J$/$F8+Ev0c$$$N%P%0Js9p$K$?$$$7$Fe(Bwont
fix e$B$H$$$$$d$9$/$J$k$N$,:GBg$N%a%j%C%H$K8+$($^$9!#e(B

e$B$h$C$FI{:nMQ$,$"$k$J$ie(B lib/scanf.rb
e$B$K3J2<$2$H$$$&$N$O!"$"$k0UL#8=<BE*$JH=CG$N$h$&$K$b;W$($^$9!#$3$l$K$D$$$F!"$I$&H=CG$7$F$$$k$N$+$r65$($FM_$7$$$G$9!#e(B

e$B$U$J$P$5$s$N%a!<%k$K$D$$$F$O<q;]$,==J,@0M}$5$l$F$$$J$$$h$&$K46$8$k$N$G!";?@.$bH?BP$b:9$795$($^$9!#e(B

(2010/03/27 18:19), KOSAKI Motohiro wrote:

kosakie$B$G$9e(B

e$B$($0$A$5$s$NDs<($5$l$?e(B 0x1.badp+0
e$B$K$D$$$F$O8+2r$rDs<($7$F$b$i$($^$;$s$G$7$g$&$+!#M-MQ$J$N$OG’$a$^$9$,!“e(B
e$BHs>o$K%^%$%J!<$JI=5-7A<0$G$”$j!“F3F~$7$F$b;HMQ%f!<%6$O>.?t$K$H$I$^$k$H9M$($F$$$^$9!#e(B
e$B$b$C$H$$$&$H!”$&$l$7$$$N$O0lHL%f!<%6$8$c$J$/$F8+Ev0c$$$N%P%0Js9p$K$?$$$7$Fe(Bwont
fix e$B$H$$$$$d$9$/$J$k$N$,:GBg$N%a%j%C%H$K8+$($^$9!#e(B

e$B$h$C$FI{:nMQ$,$"$k$J$ie(B lib/scanf.rb
e$B$K3J2<$2$H$$$&$N$O!"$"$k0UL#8=<BE*$JH=CG$N$h$&$K$b;W$($^$9!#e(B
e$B$3$l$K$D$$$F!"$I$&H=CG$7$F$$$k$N$+$r65$($FM_$7$$$G$9!#e(B

ML e$B>e$G$N:GBg$Ne(B use case
e$B$OIbF0>.?tE@?t$rM}2r$7$F$$$J$$%f!<%6$X$N@bL@MQ$G$7$g$&$M!#e(B

e$B$5$F!"$($0$A$5$s$N;XE&$OBh0l$K$O%j%F%i%k$H$7$F$NF3F~$OIT2DG=$H$$$&;XE&$@$H;W$$$^$9!#e(B
e$B$=$l$O6D$k$H$*$j$G$9!#e(B

e$B0lJ}$G!"e(BString#to_f e$B$H$N>WFM$G9M$($k$H!"Nc$($Pe(B
“0x1.badp+0”.to_f e$B$r<B9T$7$?e(B
e$B>l9g$N7k2L$O2?$r4|BT$7$F$$$k$N$G$7$g$&$+!#e(B
e$B$?$V$se(B 0x1 e$B$r2r<a$7$Fe(B 1.0
e$B$,JV$k$N$r4|BT$9$k$N$+$J$H;W$$$^$9!#e(B
e$B$7$+$7!"e(BString#to_f e$B$Oe(B 16 e$B?J$r2r$5$J$$$N$G!"8=:_e(B 0.0
e$B$,JV$j$^$9!#e(B
e$B$D$^$j!"85!94|BT$O$:$l$@$C$?7k2L$,$^$?JL$NCM$K$J$k$o$1$G$9!#e(B
e$B$3$l$O!"Ev=i$N4|BT$,8m$C$F$$$k$H8@$($k$G$7$g$&!#e(B
e$B$h$C$F!"e(BString#to_f
e$B$K$D$$$F$O$($0$A$5$s$N;XE&$OEv$?$i$J$$$H9M$($^$9!#e(B

e$B$($0$A!w%(%9%"%s%I%$!<$G$9e(B

2010e$BG/e(B3e$B7ne(B27e$BF|e(B19:14 NARUSE, Yui [email protected]:

e$B$5$F!"$($0$A$5$s$N;XE&$OBh0l$K$O%j%F%i%k$H$7$F$NF3F~$OIT2DG=$H$$$&;XE&$@$H;W$$$^$9!#e(B
e$B$=$l$O6D$k$H$*$j$G$9!#e(B

e$B%j%F%i%kI=8=$K$O!J$=$N$^$^$N!Ke(BaA
e$BI=8=$OF3F~IT2DG=$H$$$&E@$K$Oe(B
e$B0[O@$O$J$$$H$$$&6&DLG’<1$rF’$^$($?>e$G!#!#e(B

e$B0lJ}$G!"e(BString#to_f e$B$H$N>WFM$G9M$($k$H!"Nc$($Pe(B “0x1.badp+0”.to_f e$B$r<B9T$7$?e(B
e$B>l9g$N7k2L$O2?$r4|BT$7$F$$$k$N$G$7$g$&$+!#e(B
e$B$?$V$se(B 0x1 e$B$r2r<a$7$Fe(B 1.0 e$B$,JV$k$N$r4|BT$9$k$N$+$J$H;W$$$^$9!#e(B
e$B$7$+$7!"e(BString#to_f e$B$Oe(B 16 e$B?J$r2r$5$J$$$N$G!"8=:_e(B 0.0 e$B$,JV$j$^$9!#e(B
e$B$D$^$j!"85!94|BT$O$:$l$@$C$?7k2L$,$^$?JL$NCM$K$J$k$o$1$G$9!#e(B
e$B$3$l$O!"Ev=i$N4|BT$,8m$C$F$$$k$H8@$($k$G$7$g$&!#e(B
e$B$h$C$F!"e(BString#to_f e$B$K$D$$$F$O$($0$A$5$s$N;XE&$OEv$?$i$J$$$H9M$($^$9!#e(B

String#to_f e$B$K$D$$$F$Oe(B '.e$B!Ge(B + e$B%a%=%C%Ie(B
e$B$H$N@09g@-$OI,?$G$J$$$N$G!"e(B
e$B>e5-$NO@E@$O@5$7$$$H;W$$$^$9!#e(B

e$B$?$@!“IbF0>.?tE@%j%F%i%kI=8=$He(B String#to_f e$B$OF1$8$G$”$m$&$He(B
e$B4|BT$9$k$N$O$+$J$j<+A3$J$3$H$G$O$J$$$+$H;W$$$^$9!#e(B
e$B!t6C$-:G>.$NK!B’e(B

e$BIbF0>.?tE@?t$NFbItI=8=$K$D$$$F$NCN8+$rF@$d$9$$I=5-$N%K!<%:$O$"$k$H;W$$$^$9!#e(B
e$B$?$@!"e(Brubye$B$KF3F~$9$k$J$i$P%j%F%i%kI=8=$H$7$F$b;H$($k$Y$-$@$H;W$$$^$9!#e(B
e$B$=$NE@$G!“e(BC99e$B$Ne(BaAe$BI=5-$,%K!<%:$K%^%C%A$$$k$H$O8@$$Fq$$LL$,$”$j$^$9!#e(B

e$B$($0$Ae(B

(2010/03/27 20:26), EGUCHI Osamu wrote:

e$B>l9g$N7k2L$O2?$r4|BT$7$F$$$k$N$G$7$g$&$+!#e(B
e$B4|BT$9$k$N$O$+$J$j<+A3$J$3$H$G$O$J$$$+$H;W$$$^$9!#e(B
e$B!t6C$-:G>.$NK!B’e(B

e$B$3$A$i$O!"0l4S@-$HMxJX@-$,>WFM$9$k;vNc$H$$$&OC$@$H;W$$$^$9!#e(B

e$B$G!“8=:_F1$8$+$H$$$&$He(B “10”.to_f e$B$N$h$&$Je(B 10
e$B?J@0?t$O$9$G$K0[$J$C$F$$$^$9!#e(B
e$B$^$?!”%(%C%8%1!<%9$r96$a$k$He(B 4._9 e$B$O%(%i!<$K$J$k$,!“e(B
“4._9”.to_f e$B$Oe(B 4.9 e$B$rJV$9$H$$$&$h$&$JNc$b$”$j$^$9!#e(B

e$B7k6I!"@)Ls$N6/$$%j%F%i%k$H!"J8;zNs$r2r<a$9$k$N$G$O>r7o$,0[$J$k$o$1$G!"e(B
e$B!Ve(BRuby e$B$N%j%F%i%k$H$7$FIbF0>.?tE@?t$H$7$F2r<a$5$l$k$J$i$P!"e(B
String#to_f e$B$G$b2r<a$5$l$k$Y$-!W$OB:=E$5$l$k$Y$-$@$H;W$$$^$9$,!"e(B
e$B$=$N5U$OI,$:$7$b@.$jN)$DI,MW$O$J$$$H;W$$$^$9!#e(B