From 6c1c35db17e55adc479db493cd85e1ad8afa8e31 Mon Sep 17 00:00:00 2001 From: mame Date: Wed, 3 Feb 2010 16:34:24 +0000 Subject: * 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 --- ChangeLog | 5 +++++ ext/bigdecimal/bigdecimal.c | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 9bc586afab..88bf60d648 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Feb 4 01:24:01 2010 Yusuke Endoh + + * ext/bigdecimal/bigdecimal.c (BigDecimal_DoDivmod): fix infinity + handling. 1 / Infinity was evaluated to NaN. + Thu Feb 4 00:37:43 2010 Nobuyoshi Nakada * 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")); -- cgit v1.2.3