diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-07-01 20:38:57 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-07-01 20:38:57 +0000 |
commit | 841cf3b9488c0e7ea23b92acbb9078dee3347deb (patch) | |
tree | 42bd04b6487be76d196ae8e1dfb070ff49cade40 /time.c | |
parent | 36b84733f4493ef6c259ac9cc83291980cd68c36 (diff) | |
download | ruby-841cf3b9488c0e7ea23b92acbb9078dee3347deb.tar.gz |
* time.c (num_exact): use to_r for T_FLOAT.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23929 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'time.c')
-rw-r--r-- | time.c | 49 |
1 files changed, 1 insertions, 48 deletions
@@ -154,55 +154,8 @@ num_exact(VALUE v) break; case T_FLOAT: - { - double d = NUM2DBL(v); - int exp; - static long r = 0; - static int n = 0; - if (r == 0) { - long rr = FLT_RADIX; - int nn = 1; - while (rr < FIXNUM_MAX / FLT_RADIX) { - rr *= FLT_RADIX; - nn++; - } - n = nn; - r = rr; - } - d = frexp(d, &exp); - v = INT2FIX(0); - while (d != 0) { - long u; - exp -= n; - d *= r; - v = mul(v, LONG2FIX(r)); - u = (long)d; - d -= u; - v = add(v, LONG2FIX(u)); - } - if (exp < 0) { - VALUE w; - w = INT2FIX(1); - if (FLT_RADIX == 2) - w = lshift(w, INT2FIX(-exp)); - else - while (exp) { - w = mul(w, INT2FIX(FLT_RADIX)); - exp++; - } - v = quo(v, w); - } - else { - if (FLT_RADIX == 2) - v = lshift(v, INT2FIX(exp)); - else - while (exp) { - v = mul(v, INT2FIX(FLT_RADIX)); - exp--; - } - } + v = rb_convert_type(v, T_RATIONAL, "Rational", "to_r"); break; - } case T_NIL: goto typeerror; |