@@ -1613,26 +1613,33 @@ BigDecimal_DoDivmod(VALUE self, VALUE r, Real **div, Real **mod)
1613
1613
return Qtrue ;
1614
1614
}
1615
1615
1616
- mx = a -> Prec + vabs (a -> exponent );
1617
- if (mx < b -> Prec + vabs (b -> exponent )) mx = b -> Prec + vabs (b -> exponent );
1618
- mx = (mx + 1 ) * VpBaseFig ();
1619
- GUARD_OBJ (c , VpCreateRbObject (mx , "0" , true));
1620
- GUARD_OBJ (res , VpCreateRbObject ((mx + 1 ) * 2 + (VpBaseFig () + 1 ), "#0" , true));
1616
+ mx = (a -> Prec > b -> Prec ) ? a -> Prec : b -> Prec ;
1617
+ mx *= BASE_FIG ;
1618
+ if (2 * BIGDECIMAL_DOUBLE_FIGURES > mx )
1619
+ mx = 2 * BIGDECIMAL_DOUBLE_FIGURES ;
1620
+
1621
+ GUARD_OBJ (c , VpCreateRbObject (mx + 2 * BASE_FIG , "0" , true));
1622
+ GUARD_OBJ (res , VpCreateRbObject (mx * 2 + 2 * BASE_FIG , "#0" , true));
1621
1623
VpDivd (c , res , a , b );
1622
- mx = c -> Prec * (VpBaseFig () + 1 );
1624
+
1625
+ mx = c -> Prec * BASE_FIG ;
1623
1626
GUARD_OBJ (d , VpCreateRbObject (mx , "0" , true));
1624
1627
VpActiveRound (d , c , VP_ROUND_DOWN , 0 );
1628
+
1625
1629
VpMult (res , d , b );
1626
1630
VpAddSub (c , a , res , -1 );
1631
+
1627
1632
if (!VpIsZero (c ) && (VpGetSign (a ) * VpGetSign (b ) < 0 )) {
1628
- VpAddSub (res , d , VpOne (), -1 );
1633
+ /* remainder adjustment for negative case */
1634
+ VpAddSub (res , d , VpOne (), -1 );
1629
1635
GUARD_OBJ (d , VpCreateRbObject (GetAddSubPrec (c , b )* (VpBaseFig () + 1 ), "0" , true));
1630
- VpAddSub (d , c , b , 1 );
1631
- * div = res ;
1632
- * mod = d ;
1633
- } else {
1634
- * div = d ;
1635
- * mod = c ;
1636
+ VpAddSub (d , c , b , 1 );
1637
+ * div = res ;
1638
+ * mod = d ;
1639
+ }
1640
+ else {
1641
+ * div = d ;
1642
+ * mod = c ;
1636
1643
}
1637
1644
return Qtrue ;
1638
1645
0 commit comments