summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--ext/bigdecimal/bigdecimal.c13
2 files changed, 13 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index a73de1cd88..adfa289951 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Fri Jun 10 01:06:29 2011 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * ext/bigdecimal (BigDecimal_to_i): Integer#** may return flonum.
+
Fri Jun 10 00:35:12 2011 Tadayoshi Funaba <tadf@dotrb.org>
* complex.c (string_to_c_internal): uses rb_reg_nth_match;
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 353210b336..388dbbdcf8 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -564,19 +564,24 @@ BigDecimal_to_i(VALUE self)
VALUE a = BigDecimal_split(self);
VALUE digits = RARRAY_PTR(a)[1];
VALUE numerator = rb_funcall(digits, rb_intern("to_i"), 0);
+ VALUE ret;
ssize_t dpower = e - (ssize_t)RSTRING_LEN(digits);
if (VpGetSign(p) < 0) {
numerator = rb_funcall(numerator, '*', 1, INT2FIX(-1));
}
if (dpower < 0) {
- return rb_funcall(numerator, rb_intern("div"), 1,
+ ret = rb_funcall(numerator, rb_intern("div"), 1,
rb_funcall(INT2FIX(10), rb_intern("**"), 1,
INT2FIX(-dpower)));
}
- return rb_funcall(numerator, '*', 1,
- rb_funcall(INT2FIX(10), rb_intern("**"), 1,
- INT2FIX(dpower)));
+ else
+ ret = rb_funcall(numerator, '*', 1,
+ rb_funcall(INT2FIX(10), rb_intern("**"), 1,
+ INT2FIX(dpower)));
+ if (TYPE(ret) == T_FLOAT)
+ rb_raise(rb_eFloatDomainError, "Infinity");
+ return ret;
}
}