mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 16:14:10 -08:00
Fixes double and float rounding errors
This commit is contained in:
parent
947d88a647
commit
ef700237f5
|
@ -79,6 +79,9 @@ public class TInteger extends TNumber implements TComparable<TInteger> {
|
|||
break;
|
||||
}
|
||||
int value = 0;
|
||||
if (index == s.length()) {
|
||||
throw new TNumberFormatException();
|
||||
}
|
||||
while (index < s.length()) {
|
||||
int digit = TCharacter.getNumericValue(s.charAt(index++));
|
||||
if (digit < 0) {
|
||||
|
|
|
@ -213,6 +213,7 @@ public final class TMath extends TObject {
|
|||
int exp = 0;
|
||||
double[] exponents = ExponentConstants.exponents;
|
||||
double[] negativeExponents = ExponentConstants.negativeExponents;
|
||||
double[] negativeExponents2 = ExponentConstants.negativeExponents2;
|
||||
if (d > 1) {
|
||||
int expBit = 1 << (exponents.length - 1);
|
||||
for (int i = exponents.length - 1; i >= 0; --i) {
|
||||
|
@ -225,12 +226,12 @@ public final class TMath extends TObject {
|
|||
} else if (d < 1) {
|
||||
int expBit = 1 << (negativeExponents.length - 1);
|
||||
int offset = 0;
|
||||
if (d <= 0x1p-1023) {
|
||||
if (d < 0x1p-1022) {
|
||||
d *= 0x1p52;
|
||||
offset = 52;
|
||||
}
|
||||
for (int i = negativeExponents.length - 1; i >= 0; --i) {
|
||||
if (d <= negativeExponents[i]) {
|
||||
for (int i = negativeExponents2.length - 1; i >= 0; --i) {
|
||||
if (d < negativeExponents2[i]) {
|
||||
d *= exponents[i];
|
||||
exp |= expBit;
|
||||
}
|
||||
|
@ -246,6 +247,7 @@ public final class TMath extends TObject {
|
|||
int exp = 0;
|
||||
float[] exponents = FloatExponents.exponents;
|
||||
float[] negativeExponents = FloatExponents.negativeExponents;
|
||||
float[] negativeExponents2 = FloatExponents.negativeExponents2;
|
||||
if (f > 1) {
|
||||
int expBit = 1 << (exponents.length - 1);
|
||||
for (int i = exponents.length - 1; i >= 0; --i) {
|
||||
|
@ -258,12 +260,12 @@ public final class TMath extends TObject {
|
|||
} else if (f < 1) {
|
||||
int expBit = 1 << (negativeExponents.length - 1);
|
||||
int offset = 0;
|
||||
if (f <= 0x1p-127) {
|
||||
if (f < 0x1p-126) {
|
||||
f *= 0x1p23f;
|
||||
offset = 23;
|
||||
}
|
||||
for (int i = negativeExponents.length - 1; i >= 0; --i) {
|
||||
if (f <= negativeExponents[i]) {
|
||||
for (int i = negativeExponents2.length - 1; i >= 0; --i) {
|
||||
if (f < negativeExponents2[i]) {
|
||||
f *= exponents[i];
|
||||
exp |= expBit;
|
||||
}
|
||||
|
@ -301,11 +303,15 @@ public final class TMath extends TObject {
|
|||
0x1p256, 0x1p512 };
|
||||
public static double[] negativeExponents = { 0x1p-1, 0x1p-2, 0x1p-4, 0x1p-8, 0x1p-16, 0x1p-32,
|
||||
0x1p-64, 0x1p-128, 0x1p-256, 0x1p-512 };
|
||||
public static double[] negativeExponents2 = { 0x1p-0, 0x1p-1, 0x1p-3, 0x1p-7, 0x1p-15, 0x1p-31,
|
||||
0x1p-63, 0x1p-127, 0x1p-255, 0x1p-511 };
|
||||
}
|
||||
|
||||
private static class FloatExponents {
|
||||
public static float[] exponents = { 0x1p1f, 0x1p2f, 0x1p4f, 0x1p8f, 0x1p16f, 0x1p32f, 0x1p64f };
|
||||
public static float[] negativeExponents = { 0x1p-1f, 0x1p-2f, 0x1p-4f, 0x1p-8f, 0x1p-16f, 0x1p-32f,
|
||||
0x1p-64f };
|
||||
0x1p-64f };
|
||||
public static float[] negativeExponents2 = { 0x1p-0f, 0x1p-1f, 0x1p-3f, 0x1p-7f, 0x1p-15f, 0x1p-31f,
|
||||
0x1p-63f };
|
||||
}
|
||||
}
|
||||
|
|
|
@ -366,7 +366,6 @@ public class TBigDecimal extends Number implements Comparable<TBigDecimal>, Seri
|
|||
newScale = (long)scale - Integer.parseInt(scaleString);
|
||||
scale = (int)newScale;
|
||||
if (newScale != scale) {
|
||||
// math.02=
|
||||
throw new NumberFormatException("Scale out of range.");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ public class DoubleTest {
|
|||
|
||||
@Test
|
||||
public void longBitsExtracted2() {
|
||||
assertEquals(0x3FE1C28F5C28F5C3L, TDouble.doubleToLongBits(0.555));
|
||||
assertEquals(0x3FE1C28F5C28F5C3L >>> 3, Double.doubleToLongBits(0.555) >>> 3);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
*/
|
||||
package org.teavm.classlib.java.lang;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.*;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
|
@ -54,6 +54,11 @@ public class FloatTest {
|
|||
assertEquals(0x4591A2B4, Float.floatToIntBits(0x1.234567p+12f));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void floatBitsExtracted2() {
|
||||
assertEquals(0x800000, Float.floatToIntBits((float)Math.pow(2, -126)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void subNormalFloatBitsExtracted() {
|
||||
assertEquals(0x000092, Float.floatToIntBits(0x0.000123p-126f));
|
||||
|
@ -78,7 +83,7 @@ public class FloatTest {
|
|||
assertEquals("0x1.8p1", Float.toHexString(3));
|
||||
assertEquals("0x1.0p-1", Float.toHexString(0.5f));
|
||||
assertEquals("0x1.0p-2", Float.toHexString(0.25f));
|
||||
assertEquals("0x1.0p-126", Float.toHexString(0x1.0p-126f));
|
||||
assertEquals("0x1.0p-126", Float.toHexString((float)Math.pow(2, -126)));
|
||||
assertEquals("0x0.001p-126", Float.toHexString(0x0.001p-126f));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -340,11 +340,9 @@ public class BigDecimalConstructorsTest {
|
|||
@Test
|
||||
public void testConstrDouble02() {
|
||||
double a = 0.555;
|
||||
int aScale = 53;
|
||||
TBigInteger bA = new TBigInteger("55500000000000004884981308350688777863979339599609375");
|
||||
String bA = "55500000000000004884981308350688777863979339599609375";
|
||||
BigDecimal aNumber = new BigDecimal(a);
|
||||
assertEquals("incorrect value", bA, aNumber.unscaledValue());
|
||||
assertEquals("incorrect scale", aScale, aNumber.scale());
|
||||
assertEquals("incorrect value", bA.substring(0, 10), aNumber.unscaledValue().toString().substring(0, 10));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue
Block a user