ruby-changes:14707
From: mame <ko1@a...>
Date: Thu, 4 Feb 2010 01:34:40 +0900 (JST)
Subject: [ruby-changes:14707] Ruby:r26563 (trunk): * ext/bigdecimal/bigdecimal.c (BigDecimal_DoDivmod): fix infinity
mame 2010-02-04 01:34:24 +0900 (Thu, 04 Feb 2010) New Revision: 26563 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=26563 Log: * ext/bigdecimal/bigdecimal.c (BigDecimal_DoDivmod): fix infinity handling. 1 / Infinity was evaluated to NaN. Modified files: trunk/ChangeLog trunk/ext/bigdecimal/bigdecimal.c Index: ChangeLog =================================================================== --- ChangeLog (revision 26562) +++ ChangeLog (revision 26563) @@ -1,3 +1,8 @@ +Thu Feb 4 01:24:01 2010 Yusuke Endoh <mame@t...> + + * 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@r...> * time.c (time_mdump, time_mload): dump/load utc_offset. Index: ext/bigdecimal/bigdecimal.c =================================================================== --- ext/bigdecimal/bigdecimal.c (revision 26562) +++ ext/bigdecimal/bigdecimal.c (revision 26563) @@ -944,10 +944,25 @@ 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")); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/