You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2009/07/14 11:32:34 UTC
svn commit: r793829 - in /harmony/enhanced/classlib/trunk/modules/luni/src:
main/java/org/apache/harmony/luni/util/FloatingPointParser.java
test/api/common/org/apache/harmony/luni/tests/java/lang/DoubleTest.java
Author: tellison
Date: Tue Jul 14 09:32:33 2009
New Revision: 793829
URL: http://svn.apache.org/viewvc?rev=793829&view=rev
Log:
Apply fix for HARMONY-329 ([classlib][luni] Endless loop when using Double.parseDouble(String) with certain types of value)
Modified:
harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/FloatingPointParser.java
harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/lang/DoubleTest.java
Modified: harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/FloatingPointParser.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/FloatingPointParser.java?rev=793829&r1=793828&r2=793829&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/FloatingPointParser.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/FloatingPointParser.java Tue Jul 14 09:32:33 2009
@@ -172,6 +172,17 @@
s = s.substring(start, end);
}
+ // Trim the length of very small numbers, natives can only handle down
+ // to E-309
+ final int APPROX_MIN_MAGNITUDE = -359;
+ final int MAX_DIGITS = 52;
+ length = s.length();
+ if (length > MAX_DIGITS && e < APPROX_MIN_MAGNITUDE) {
+ int d = Math.min(APPROX_MIN_MAGNITUDE - e, length - 1);
+ s = s.substring(0, length - d);
+ e += d;
+ }
+
return new StringExponentPair(s, e, negative);
}
Modified: harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/lang/DoubleTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/lang/DoubleTest.java?rev=793829&r1=793828&r2=793829&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/lang/DoubleTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/lang/DoubleTest.java Tue Jul 14 09:32:33 2009
@@ -219,13 +219,17 @@
assertEquals("Created incorrect double", 39089.88888888888888888888888888888888, d
.doubleValue(), 0D);
- // REGRESSION for HARMONY-489
+ // Regression test for HARMONY-489
try {
d = new Double("1E+-20");
fail("new Double(\"1E+-20\") should throw exception");
} catch (NumberFormatException e) {
// expected
}
+
+ // Regression test for HARMONY-329
+ d = Double.parseDouble("-1.233999999999999965116738099630936817275852021384209929081813042837802886790127428328465579708849276001782791006814286802871737087810957327493372866733334925806221045495205250590286471187577636646208155890426896101636282423463443661040209738873506655844025580428394216030152374941053494694642722606658935546875E-112");
+ assertEquals("Failed to parse long string", -1.234E-112D, d.doubleValue(), 0D);
}
/**