OSDN Git Service

Fix for PR libgcj/1596:
authorwarrenl <warrenl@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 10 Jan 2001 09:38:08 +0000 (09:38 +0000)
committerwarrenl <warrenl@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 10 Jan 2001 09:38:08 +0000 (09:38 +0000)
* java/math/BigDecimal.java (divide): Check newScale for validity.
Ensure that BigInteger.pow() is called with a non-negative value.
(setScale (int)): New public method.
(setScale (int,int)): New public method.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@38861 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/java/math/BigDecimal.java

index 880d2d7..f326bb9 100644 (file)
@@ -1,3 +1,11 @@
+2001-01-10  Warren Levy  <warrenl@redhat.com>
+
+       Fix for PR libgcj/1596:
+       * java/math/BigDecimal.java (divide): Check newScale for validity.
+       Ensure that BigInteger.pow() is called with a non-negative value.
+       (setScale (int)): New public method.
+       (setScale (int,int)): New public method.
+
 2001-01-09  Oskar Liljeblad <osk@hem.passagen.se>
 
        Fix for PR libgcj/1338:
index 6844b24..007f3a3 100644 (file)
@@ -1,5 +1,5 @@
 /* java.math.BigDecimal -- Arbitrary precision decimals.
-   Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -133,16 +133,27 @@ public class BigDecimal extends Number implements Comparable {
       throw 
        new IllegalArgumentException("illegal rounding mode: " + roundingMode);
 
-    if (scale < 0)
-      throw new ArithmeticException ("scale is negative: " + scale);
+    if (newScale < 0)
+      throw new ArithmeticException ("scale is negative: " + newScale);
 
     if (intVal.signum () == 0) // handle special case of 0.0/0.0
       return ZERO;
     
-    BigInteger dividend = intVal.multiply (BigInteger.valueOf (10).pow 
-                                       (newScale + 1 - (scale - val.scale)));
+    // Ensure that pow gets a non-negative value.
+    int valScale = val.scale;
+    BigInteger valIntVal = val.intVal;
+    int power = newScale + 1 - (scale - val.scale);
+    if (power < 0)
+      {
+       // Effectively increase the scale of val to avoid an
+       // IllegalArgumentException for a negative power.
+        valIntVal = valIntVal.multiply (BigInteger.valueOf (10).pow (-power));
+       power = 0;
+      }
+
+    BigInteger dividend = intVal.multiply (BigInteger.valueOf (10).pow (power));
     
-    BigInteger parts[] = dividend.divideAndRemainder (val.intVal);
+    BigInteger parts[] = dividend.divideAndRemainder (valIntVal);
 //      System.out.println("int: " + parts[0]);
 //      System.out.println("rem: " + parts[1]);
 
@@ -347,4 +358,15 @@ public class BigDecimal extends Number implements Comparable {
   {
     return Double.valueOf(toString()).doubleValue();
   }
+
+  public BigDecimal setScale (int scale) throws ArithmeticException
+  {
+    return setScale (scale, ROUND_UNNECESSARY);
+  }
+
+  public BigDecimal setScale (int scale, int roundingMode)
+    throws ArithmeticException, IllegalArgumentException
+  {
+    return divide (ONE, scale, roundingMode);
+  }
 }