зеркало из https://github.com/github/ruby.git
* object.c (rb_cstr_to_dbl): return 0.0 if hexadecimal and
baccheck is FALSE: Float("0x1p+0") works, but "0x1p+0".to_f doesn't. [ruby-dev:40650] * util.c (ruby_strtod): allow hexdecimal integers. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27140 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
2067e4eb30
Коммит
4d399f12d4
|
@ -1,3 +1,11 @@
|
||||||
|
Thu Apr 1 13:24:12 2010 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
|
* object.c (rb_cstr_to_dbl): return 0.0 if hexadecimal and
|
||||||
|
baccheck is FALSE: Float("0x1p+0") works, but "0x1p+0".to_f
|
||||||
|
doesn't. [ruby-dev:40650]
|
||||||
|
|
||||||
|
* util.c (ruby_strtod): allow hexdecimal integers.
|
||||||
|
|
||||||
Thu Apr 1 13:20:50 2010 NARUSE, Yui <naruse@ruby-lang.org>
|
Thu Apr 1 13:20:50 2010 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* lib/scanf.rb: support %a format. [ruby-dev:40650]
|
* lib/scanf.rb: support %a format. [ruby-dev:40650]
|
||||||
|
|
10
object.c
10
object.c
|
@ -2246,6 +2246,11 @@ rb_cstr_to_dbl(const char *p, int badcheck)
|
||||||
if (!p) return 0.0;
|
if (!p) return 0.0;
|
||||||
q = p;
|
q = p;
|
||||||
while (ISSPACE(*p)) p++;
|
while (ISSPACE(*p)) p++;
|
||||||
|
|
||||||
|
if (!badcheck && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
d = strtod(p, &end);
|
d = strtod(p, &end);
|
||||||
if (errno == ERANGE) {
|
if (errno == ERANGE) {
|
||||||
OutOfRange();
|
OutOfRange();
|
||||||
|
@ -2284,6 +2289,11 @@ rb_cstr_to_dbl(const char *p, int badcheck)
|
||||||
}
|
}
|
||||||
*n = '\0';
|
*n = '\0';
|
||||||
p = buf;
|
p = buf;
|
||||||
|
|
||||||
|
if (!badcheck && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
d = strtod(p, &end);
|
d = strtod(p, &end);
|
||||||
if (errno == ERANGE) {
|
if (errno == ERANGE) {
|
||||||
OutOfRange();
|
OutOfRange();
|
||||||
|
|
|
@ -87,6 +87,18 @@ class TestFloat < Test::Unit::TestCase
|
||||||
assert_raise(ArgumentError){Float("1__1")}
|
assert_raise(ArgumentError){Float("1__1")}
|
||||||
# add expected behaviour here.
|
# add expected behaviour here.
|
||||||
assert_equal(10, Float("1_0"))
|
assert_equal(10, Float("1_0"))
|
||||||
|
|
||||||
|
assert_equal([ 0.0].pack('G'), [Float(" 0x0p+0").to_f].pack('G'))
|
||||||
|
assert_equal([-0.0].pack('G'), [Float("-0x0p+0").to_f].pack('G'))
|
||||||
|
assert_equal(255.0, Float("0Xff"))
|
||||||
|
assert_equal(255.5, Float("0Xff.8"))
|
||||||
|
assert_equal(1.0, Float("0X1.P+0"))
|
||||||
|
assert_equal(1024.0, Float("0x1p10"))
|
||||||
|
assert_equal(1024.0, Float("0x1p+10"))
|
||||||
|
assert_equal(0.0009765625, Float("0x1p-10"))
|
||||||
|
assert_equal(2.6881171418161356e+43, Float("0x1.3494a9b171bf5p+144"))
|
||||||
|
assert_equal(-3.720075976020836e-44, Float("-0x1.a8c1f14e2af5dp-145"))
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_divmod
|
def test_divmod
|
||||||
|
|
|
@ -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("-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([-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(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(1024.0, S("0x1p+10").to_f)
|
||||||
assert_equal(0.0009765625, 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(2.6881171418161356e+43, S("0x1.3494a9b171bf5p+144").to_f)
|
||||||
|
|
27
util.c
27
util.c
|
@ -2124,24 +2124,21 @@ break2:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*s != 'P' && *s != 'p') {
|
if (*s == 'P' || *s == 'p') {
|
||||||
s = s0;
|
dsign = 0x2C - *++s; /* +: 2B, -: 2D */
|
||||||
goto ret;
|
if (abs(dsign) == 1) s++;
|
||||||
}
|
else dsign = 1;
|
||||||
|
|
||||||
dsign = 0x2C - *++s; /* +: 2B, -: 2D */
|
for (nd = 0; (c = *s) >= '0' && c <= '9'; s++) {
|
||||||
if (abs(dsign) != 1) {
|
nd *= 10;
|
||||||
s = s0;
|
nd += c;
|
||||||
goto ret;
|
nd -= '0';
|
||||||
|
}
|
||||||
|
dval(rv) = ldexp(adj, nd * dsign);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
for (nd = 0, s++; (c = *s) >= '0' && c <= '9'; s++) {
|
dval(rv) = adj;
|
||||||
nd *= 10;
|
|
||||||
nd += c;
|
|
||||||
nd -= '0';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dval(rv) = ldexp(adj, nd * dsign);
|
|
||||||
goto ret;
|
goto ret;
|
||||||
}
|
}
|
||||||
nz0 = 1;
|
nz0 = 1;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче