diff options
author | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-02-03 16:34:24 +0000 |
---|---|---|
committer | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-02-03 16:34:24 +0000 |
commit | 6c1c35db17e55adc479db493cd85e1ad8afa8e31 (patch) | |
tree | 944871f9360019658a0d1eb714d8301028c850a6 | |
parent | b3085ba508b9582ff279c2ddf59a44885e22c074 (diff) | |
download | ruby-6c1c35db17e55adc479db493cd85e1ad8afa8e31.tar.gz |
* ext/bigdecimal/bigdecimal.c (BigDecimal_DoDivmod): fix infinity
handling. 1 / Infinity was evaluated to NaN.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ext/bigdecimal/bigdecimal.c | 17 |
2 files changed, 21 insertions, 1 deletions
@@ -1,3 +1,8 @@ +Thu Feb 4 01:24:01 2010 Yusuke Endoh <mame@tsg.ne.jp> + + * ext/bigdecimal/bigdecimal.c (BigDecimal_DoDivmod): fix infinity + handling. 1 / Infinity was evaluated to NaN. + Thu Feb 4 00:37:43 2010 Nobuyoshi Nakada <nobu@ruby-lang.org> * time.c (time_mdump, time_mload): dump/load utc_offset. diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 3dd62f11fb..5450f7594a 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -944,10 +944,25 @@ BigDecimal_DoDivmod(VALUE self, VALUE r, Real **div, Real **mod) SAVE(b); if(VpIsNaN(a) || VpIsNaN(b)) goto NaN; - if(VpIsInf(a) || VpIsInf(b)) goto NaN; + if(VpIsInf(a) && VpIsInf(b)) goto NaN; if(VpIsZero(b)) { rb_raise(rb_eZeroDivError, "divided by 0"); } + if(VpIsInf(a)) { + GUARD_OBJ(d,VpCreateRbObject(1, "0")); + VpSetInf(d,(S_INT)(VpGetSign(a) == VpGetSign(b) ? 1 : -1)); + GUARD_OBJ(c,VpCreateRbObject(1, "NaN")); + *div = d; + *mod = c; + return Qtrue; + } + if(VpIsInf(b)) { + GUARD_OBJ(d,VpCreateRbObject(1, "0")); + VpSetSign(d,(S_INT)(VpGetSign(a) == VpGetSign(b) ? 1 : -1)); + *div = d; + *mod = a; + return Qtrue; + } if(VpIsZero(a)) { GUARD_OBJ(c,VpCreateRbObject(1, "0")); GUARD_OBJ(d,VpCreateRbObject(1, "0")); |