Bug #2662: BigDecimal#ceil, etc. should not return Integer
http://redmine.ruby-lang.org/issues/show/2662
e$B5/I<<Te(B: Yusuke E.
e$B%9%F!<%?%9e(B: Open, e$BM%@hEYe(B: Normal
e$BC4Ev<Te(B: Yukihiro M., e$B%+%F%4%je(B: ext, Target version:
1.9.x
ruby -v: ruby 1.9.2dev (2010-01-27 trunk 26434) [i686-linux]
e$B$^$D$b$H$5$se(B
e$B1sF#$G$9!#e(B
r20584 e$B$He(B r20616 e$B$Ge(B BigDecimal#ceil e$B!"e(Btruncate
e$B!“e(Bfloor e$B!“e(Bround e$B!“e(Bdiv e$B$Ne(B
e$BLa$jCM$re(B Integer e$B$K$9$kJQ99$,$”$j$^$9$,!”$3$l$@$H5pBg$Je(B
BigDecimal e$B$re(B
e$B07$($J$/!”$^$?$O07$$$,LLE]$K$J$j$^$9!#e(B
e$B5pBg$Je(B BigDecimal e$B$Oe(B ceil e$B$,<h$l$J$$e(B
$ ./ruby -rbigdecimal -e ‘p BigDecimal(“1E100000”).ceil’
(e$B5pBg$Je(B Bignum e$B$r3NJ]$7$h$&$H$7$F8G$^$ke(B…)
Infinity e$B$,:.$6$k$H$-$O<+J,$GBP=h$9$kI,MW$,$"$ke(B
$ ./ruby -rbigdecimal -e ‘p BigDecimal(“Infinity”).ceil’
-e:1:in ceil': Computation results to 'Infinity' (FloatDomainError) from -e:1:in
’
Float#ceil e$B$J$I$,e(B Integer
e$B$rJV$9$N$K9g$o$;$k$?$a$@$H;W$$$^$9$,!“$3$NJQ99e(B
e$B$G$Oe(B BigDecimal e$B$N$”$j$,$?$_<+BN$,8:$C$F$7$^$&5$$,$7$^$9!#e(B
e$B$I$&$7$F$b$H$$$&$3$H$G$J$1$l$P!"e(Brevert e$B$rDs0F$7$^$9!#e(B
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index c6ffe98…1f51f61 100644
— a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -1108,7 +1108,7 @@ BigDecimal_div2(int argc, VALUE *argv, VALUE self)
Real *div=NULL;
Real *mod;
if(BigDecimal_DoDivmod(self,b,&div,&mod)) {
- return BigDecimal_to_i(ToValue(div));
- return ToValue(div);
}
return DoSomeOne(self,b,rb_intern(“div”));
} else { /* div in BigDecimal sense */
@@ -1308,9 +1308,6 @@ BigDecimal_round(int argc, VALUE *argv, VALUE
self)
GUARD_OBJ(c,VpCreateRbObject(mx, “0”));
VpSetPrecLimit(pl);
VpActiveRound(c,a,sw,iLoc);
- if (argc == 0) {
- return BigDecimal_to_i(ToValue(c));
- }
return ToValue(c);
}
@@ -1355,9 +1352,6 @@ BigDecimal_truncate(int argc, VALUE argv, VALUE
self)
GUARD_OBJ(c,VpCreateRbObject(mx, “0”));
VpSetPrecLimit(pl);
VpActiveRound(c,a,VP_ROUND_DOWN,iLoc); / 0: truncate */
- if (argc == 0) {
- return BigDecimal_to_i(ToValue(c));
- }
return ToValue(c);
}
@@ -1418,9 +1412,6 @@ BigDecimal_floor(int argc, VALUE *argv, VALUE
self)
GUARD_OBJ(c,VpCreateRbObject(mx, “0”));
VpSetPrecLimit(pl);
VpActiveRound(c,a,VP_ROUND_FLOOR,iLoc);
- if (argc == 0) {
- return BigDecimal_to_i(ToValue(c));
- }
return ToValue(c);
}
@@ -1465,9 +1456,6 @@ BigDecimal_ceil(int argc, VALUE *argv, VALUE self)
GUARD_OBJ(c,VpCreateRbObject(mx, “0”));
VpSetPrecLimit(pl);
VpActiveRound(c,a,VP_ROUND_CEIL,iLoc);
- if (argc == 0) {
- return BigDecimal_to_i(ToValue(c));
- }
return ToValue(c);
}
e$B$D$$$G$K!"$3$NJQ99$Ge(B rubyspec
e$B$,$d$C$Q$j$$$C$Q$$<:GT$7$F$$$^$9!#e(B
BigDecimal#ceil returns the smallest integer greater or equal to self,
if n is unspecified ERROR
FloatDomainError: Computation results to ‘Infinity’
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/ceil_spec.rb:34:in
ceil' /home/mame/work/ruby/spec/rubyspec/library/bigdecimal/ceil_spec.rb:34:in
block (2 levels) in <top (required)>’
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/ceil_spec.rb:4:in
`<top (required)>’
BigDecimal#div with precision set to 0 returns NaN if NaN is involved
ERROR
FloatDomainError: Computation results to ‘NaN’(Not a Number)
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/shared/quo.rb:34:in
div' /home/mame/work/ruby/spec/rubyspec/library/bigdecimal/shared/quo.rb:34:in
block (2 levels) in <top (required)>’
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/div_spec.rb:5:in
`<top (required)>’
BigDecimal#div returns NaN if NaN is involved ERROR
FloatDomainError: Computation results to ‘NaN’(Not a Number)
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/div_spec.rb:46:in
div' /home/mame/work/ruby/spec/rubyspec/library/bigdecimal/div_spec.rb:46:in
block (2 levels) in <top (required)>’
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/div_spec.rb:12:in
`<top (required)>’
BigDecimal#div returns NaN if divided by Infinity and no precision given
ERROR
FloatDomainError: Computation results to ‘NaN’(Not a Number)
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/div_spec.rb:51:in
div' /home/mame/work/ruby/spec/rubyspec/library/bigdecimal/div_spec.rb:51:in
block (2 levels) in <top (required)>’
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/div_spec.rb:12:in
`<top (required)>’
BigDecimal#div returns NaN if (+|-) Infinity divided by 1 and no
precision given ERROR
FloatDomainError: Computation results to ‘NaN’(Not a Number)
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/div_spec.rb:109:in
div' /home/mame/work/ruby/spec/rubyspec/library/bigdecimal/div_spec.rb:109:in
block (2 levels) in <top (required)>’
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/div_spec.rb:12:in
`<top (required)>’
BigDecimal#floor returns the greatest integer smaller or equal to self
ERROR
FloatDomainError: Computation results to ‘Infinity’
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/floor_spec.rb:29:in
floor' /home/mame/work/ruby/spec/rubyspec/library/bigdecimal/floor_spec.rb:29:in
block (2 levels) in <top (required)>’
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/floor_spec.rb:4:in
`<top (required)>’
BigDecimal#truncate returns value of type Bigdecimal. FAILED
Expected false
to equal true
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/truncate_spec.rb:16:in
block (3 levels) in <top (required)>' /home/mame/work/ruby/spec/rubyspec/library/bigdecimal/truncate_spec.rb:15:in
each’
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/truncate_spec.rb:15:in
block (2 levels) in <top (required)>' /home/mame/work/ruby/spec/rubyspec/library/bigdecimal/truncate_spec.rb:4:in
<top (required)>’
BigDecimal#truncate returns NaN if self is NaN ERROR
FloatDomainError: Computation results to ‘NaN’(Not a Number)
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/truncate_spec.rb:64:in
truncate' /home/mame/work/ruby/spec/rubyspec/library/bigdecimal/truncate_spec.rb:64:in
block (2 levels) in <top (required)>’
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/truncate_spec.rb:4:in
`<top (required)>’
BigDecimal#truncate returns Infinity if self is infinite ERROR
FloatDomainError: Computation results to ‘Infinity’
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/truncate_spec.rb:71:in
truncate' /home/mame/work/ruby/spec/rubyspec/library/bigdecimal/truncate_spec.rb:71:in
block (2 levels) in <top (required)>’
/home/mame/work/ruby/spec/rubyspec/library/bigdecimal/truncate_spec.rb:4:in
`<top (required)>’
–
Yusuke E. [email protected]