summaryrefslogtreecommitdiff
path: root/time.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-07-01 20:38:57 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-07-01 20:38:57 +0000
commit841cf3b9488c0e7ea23b92acbb9078dee3347deb (patch)
tree42bd04b6487be76d196ae8e1dfb070ff49cade40 /time.c
parent36b84733f4493ef6c259ac9cc83291980cd68c36 (diff)
* 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.c49
1 files changed, 1 insertions, 48 deletions
diff --git a/time.c b/time.c
index 09afb57be5..95c64a8b8d 100644
--- a/time.c
+++ b/time.c
@@ -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;