home *** CD-ROM | disk | FTP | other *** search
- package java.lang;
-
- class FloatingDecimal {
- boolean isExceptional;
- boolean isNegative;
- int decExponent;
- char[] digits;
- int nDigits;
- int bigIntExp;
- int bigIntNBits;
- boolean mustSetRoundDir = false;
- int roundDir;
- static final long signMask = Long.MIN_VALUE;
- static final long expMask = 9218868437227405312L;
- static final long fractMask = 4503599627370495L;
- static final int expShift = 52;
- static final int expBias = 1023;
- static final long fractHOB = 4503599627370496L;
- static final long expOne = 4607182418800017408L;
- static final int maxSmallBinExp = 62;
- static final int minSmallBinExp = -21;
- static final int maxDecimalDigits = 15;
- static final int maxDecimalExponent = 308;
- static final int minDecimalExponent = -324;
- static final int bigDecimalExponent = 324;
- static final long highbyte = -72057594037927936L;
- static final long highbit = Long.MIN_VALUE;
- static final long lowbytes = 72057594037927935L;
- static final int singleSignMask = Integer.MIN_VALUE;
- static final int singleExpMask = 2139095040;
- static final int singleFractMask = 8388607;
- static final int singleExpShift = 23;
- static final int singleFractHOB = 8388608;
- static final int singleExpBias = 127;
- static final int singleMaxDecimalDigits = 7;
- static final int singleMaxDecimalExponent = 38;
- static final int singleMinDecimalExponent = -45;
- static final int intDecimalDigits = 9;
- private static FDBigInt[] b5p;
- private static final double[] small10pow = new double[]{(double)1.0F, (double)10.0F, (double)100.0F, (double)1000.0F, (double)10000.0F, (double)100000.0F, (double)1000000.0F, (double)1.0E7F, (double)1.0E8F, (double)1.0E9F, (double)1.0E10F, 1.0E11, 1.0E12, 1.0E13, 1.0E14, 1.0E15, 1.0E16, 1.0E17, 1.0E18, 1.0E19, 1.0E20, 1.0E21, 1.0E22};
- private static final float[] singleSmall10pow = new float[]{1.0F, 10.0F, 100.0F, 1000.0F, 10000.0F, 100000.0F, 1000000.0F, 1.0E7F, 1.0E8F, 1.0E9F, 1.0E10F};
- private static final double[] big10pow = new double[]{1.0E16, 1.0E32, 1.0E64, 1.0E128, 1.0E256};
- private static final double[] tiny10pow = new double[]{1.0E-16, 1.0E-32, 1.0E-64, 1.0E-128, 1.0E-256};
- private static final int maxSmallTen;
- private static final int singleMaxSmallTen;
- private static final int[] small5pow;
- private static final long[] long5pow;
- private static final int[] n5bits;
- private static final char[] infinity;
- private static final char[] notANumber;
- private static final char[] zero;
-
- private FloatingDecimal(boolean var1, int var2, char[] var3, int var4, boolean var5) {
- this.isNegative = var1;
- this.isExceptional = var5;
- this.decExponent = var2;
- this.digits = var3;
- this.nDigits = var4;
- }
-
- private static int countBits(long var0) {
- if (var0 == 0L) {
- return 0;
- } else {
- while((var0 & -72057594037927936L) == 0L) {
- var0 <<= 8;
- }
-
- while(var0 > 0L) {
- var0 <<= 1;
- }
-
- int var2;
- for(var2 = 0; (var0 & 72057594037927935L) != 0L; var2 += 8) {
- var0 <<= 8;
- }
-
- while(var0 != 0L) {
- var0 <<= 1;
- ++var2;
- }
-
- return var2;
- }
- }
-
- private static synchronized FDBigInt big5pow(int var0) {
- if (var0 < 0) {
- throw new RuntimeException("Assertion botch: negative power of 5");
- } else {
- if (b5p == null) {
- b5p = new FDBigInt[var0 + 1];
- } else if (b5p.length <= var0) {
- FDBigInt[] var1 = new FDBigInt[var0 + 1];
- System.arraycopy(b5p, 0, var1, 0, b5p.length);
- b5p = var1;
- }
-
- if (b5p[var0] != null) {
- return b5p[var0];
- } else if (var0 < small5pow.length) {
- return b5p[var0] = new FDBigInt(small5pow[var0]);
- } else if (var0 < long5pow.length) {
- return b5p[var0] = new FDBigInt(long5pow[var0]);
- } else {
- int var5 = var0 >> 1;
- int var2 = var0 - var5;
- FDBigInt var3 = b5p[var5];
- if (var3 == null) {
- var3 = big5pow(var5);
- }
-
- if (var2 < small5pow.length) {
- return b5p[var0] = var3.mult(small5pow[var2]);
- } else {
- FDBigInt var4 = b5p[var2];
- if (var4 == null) {
- var4 = big5pow(var2);
- }
-
- return b5p[var0] = var3.mult(var4);
- }
- }
- }
- }
-
- private static FDBigInt multPow52(FDBigInt var0, int var1, int var2) {
- if (var1 != 0) {
- if (var1 < small5pow.length) {
- var0 = var0.mult(small5pow[var1]);
- } else {
- var0 = var0.mult(big5pow(var1));
- }
- }
-
- if (var2 != 0) {
- var0.lshiftMe(var2);
- }
-
- return var0;
- }
-
- private static FDBigInt constructPow52(int var0, int var1) {
- FDBigInt var2 = new FDBigInt(big5pow(var0));
- if (var1 != 0) {
- var2.lshiftMe(var1);
- }
-
- return var2;
- }
-
- private FDBigInt doubleToBigInt(double var1) {
- // $FF: Couldn't be decompiled
- }
-
- private static double ulp(double var0, boolean var2) {
- long var3 = Double.doubleToLongBits(var0) & Long.MAX_VALUE;
- int var5 = (int)(var3 >>> 52);
- if (var2 && var5 >= 52 && (var3 & 4503599627370495L) == 0L) {
- --var5;
- }
-
- double var6;
- if (var5 > 52) {
- var6 = Double.longBitsToDouble((long)(var5 - 52) << 52);
- } else if (var5 == 0) {
- var6 = Double.MIN_VALUE;
- } else {
- var6 = Double.longBitsToDouble(1L << var5 - 1);
- }
-
- if (var2) {
- var6 = -var6;
- }
-
- return var6;
- }
-
- float stickyRound(double var1) {
- long var3 = Double.doubleToLongBits(var1);
- long var5 = var3 & 9218868437227405312L;
- if (var5 != 0L && var5 != 9218868437227405312L) {
- var3 += (long)this.roundDir;
- return (float)Double.longBitsToDouble(var3);
- } else {
- return (float)var1;
- }
- }
-
- private void developLongDigits(int var1, long var2, long var4) {
- int var10;
- for(var10 = 0; var4 >= 10L; ++var10) {
- var4 /= 10L;
- }
-
- if (var10 != 0) {
- long var11 = long5pow[var10] << var10;
- long var13 = var2 % var11;
- var2 /= var11;
- var1 += var10;
- if (var13 >= var11 >> 1) {
- ++var2;
- }
- }
-
- char[] var6;
- byte var7;
- int var8;
- if (var2 <= 2147483647L) {
- if (var2 <= 0L) {
- throw new RuntimeException("Assertion botch: value " + var2 + " <= 0");
- }
-
- int var18 = (int)var2;
- var7 = 10;
- var6 = new char[10];
- var8 = var7 - 1;
- int var9 = var18 % 10;
-
- for(var18 /= 10; var9 == 0; var18 /= 10) {
- ++var1;
- var9 = var18 % 10;
- }
-
- while(var18 != 0) {
- var6[var8--] = (char)(var9 + 48);
- ++var1;
- var9 = var18 % 10;
- var18 /= 10;
- }
-
- var6[var8] = (char)(var9 + 48);
- } else {
- var7 = 20;
- var6 = new char[20];
- var8 = var7 - 1;
- int var17 = (int)(var2 % 10L);
-
- for(var2 /= 10L; var17 == 0; var2 /= 10L) {
- ++var1;
- var17 = (int)(var2 % 10L);
- }
-
- while(var2 != 0L) {
- var6[var8--] = (char)(var17 + 48);
- ++var1;
- var17 = (int)(var2 % 10L);
- var2 /= 10L;
- }
-
- var6[var8] = (char)(var17 + 48);
- }
-
- var7 -= var8;
- char[] var20;
- if (var8 == 0) {
- var20 = var6;
- } else {
- var20 = new char[var7];
- System.arraycopy(var6, var8, var20, 0, var7);
- }
-
- this.digits = var20;
- this.decExponent = var1 + 1;
- this.nDigits = var7;
- }
-
- private void roundup() {
- int var1;
- char var2 = this.digits[var1 = this.nDigits - 1];
- if (var2 == '9') {
- while(var2 == '9' && var1 > 0) {
- this.digits[var1] = '0';
- --var1;
- var2 = this.digits[var1];
- }
-
- if (var2 == '9') {
- ++this.decExponent;
- this.digits[0] = '1';
- return;
- }
- }
-
- this.digits[var1] = (char)(var2 + 1);
- }
-
- public FloatingDecimal(double var1) {
- long var3 = Double.doubleToLongBits(var1);
- if ((var3 & Long.MIN_VALUE) != 0L) {
- this.isNegative = true;
- var3 ^= Long.MIN_VALUE;
- } else {
- this.isNegative = false;
- }
-
- int var7 = (int)((var3 & 9218868437227405312L) >> 52);
- long var5 = var3 & 4503599627370495L;
- if (var7 == 2047) {
- this.isExceptional = true;
- if (var5 == 0L) {
- this.digits = infinity;
- } else {
- this.digits = notANumber;
- this.isNegative = false;
- }
-
- this.nDigits = this.digits.length;
- } else {
- this.isExceptional = false;
- int var8;
- if (var7 == 0) {
- if (var5 == 0L) {
- this.decExponent = 0;
- this.digits = zero;
- this.nDigits = 1;
- return;
- }
-
- while((var5 & 4503599627370496L) == 0L) {
- var5 <<= 1;
- --var7;
- }
-
- var8 = 52 + var7 + 1;
- ++var7;
- } else {
- var5 |= 4503599627370496L;
- var8 = 53;
- }
-
- var7 -= 1023;
- this.dtoa(var7, var5, var8);
- }
- }
-
- public FloatingDecimal(float var1) {
- int var2 = Float.floatToIntBits(var1);
- if ((var2 & Integer.MIN_VALUE) != 0) {
- this.isNegative = true;
- var2 ^= Integer.MIN_VALUE;
- } else {
- this.isNegative = false;
- }
-
- int var4 = (var2 & 2139095040) >> 23;
- int var3 = var2 & 8388607;
- if (var4 == 255) {
- this.isExceptional = true;
- if ((long)var3 == 0L) {
- this.digits = infinity;
- } else {
- this.digits = notANumber;
- this.isNegative = false;
- }
-
- this.nDigits = this.digits.length;
- } else {
- this.isExceptional = false;
- int var5;
- if (var4 == 0) {
- if (var3 == 0) {
- this.decExponent = 0;
- this.digits = zero;
- this.nDigits = 1;
- return;
- }
-
- while((var3 & 8388608) == 0) {
- var3 <<= 1;
- --var4;
- }
-
- var5 = 23 + var4 + 1;
- ++var4;
- } else {
- var3 |= 8388608;
- var5 = 24;
- }
-
- var4 -= 127;
- this.dtoa(var4, (long)var3 << 29, var5);
- }
- }
-
- private void dtoa(int var1, long var2, int var4) {
- int var5 = countBits(var2);
- int var6 = Math.max(0, var5 - var1 - 1);
- if (var1 <= 62 && var1 >= -21 && var6 < long5pow.length && var5 + n5bits[var6] < 64 && var6 == 0) {
- long var39;
- if (var1 > var4) {
- var39 = 1L << var1 - var4 - 1;
- } else {
- var39 = 0L;
- }
-
- if (var1 >= 52) {
- var2 <<= var1 - 52;
- } else {
- var2 >>>= 52 - var1;
- }
-
- this.developLongDigits(0, var2, var39);
- } else {
- double var8 = Double.longBitsToDouble(4607182418800017408L | var2 & -4503599627370497L);
- int var7 = (int)Math.floor((var8 - (double)1.5F) * 0.289529654 + 0.176091259 + (double)var1 * 0.301029995663981);
- int var11 = Math.max(0, -var7);
- int var10 = var11 + var6 + var1;
- int var13 = Math.max(0, var7);
- int var12 = var13 + var6;
- int var14 = var10 - var4;
- var2 >>>= 53 - var5;
- var10 -= var5 - 1;
- int var21 = Math.min(var10, var12);
- var10 -= var21;
- var12 -= var21;
- var14 -= var21;
- if (var5 == 1) {
- --var14;
- }
-
- if (var14 < 0) {
- var10 -= var14;
- var12 -= var14;
- var14 = 0;
- }
-
- char[] var22 = this.digits = new char[18];
- int var23 = 0;
- int var16 = var5 + var10 + (var11 < n5bits.length ? n5bits[var11] : var11 * 3);
- int var17 = var12 + 1 + (var13 + 1 < n5bits.length ? n5bits[var13 + 1] : (var13 + 1) * 3);
- boolean var24;
- boolean var25;
- long var26;
- if (var16 < 64 && var17 < 64) {
- if (var16 < 32 && var17 < 32) {
- int var53 = (int)var2 * small5pow[var11] << var10;
- int var55 = small5pow[var13] << var12;
- int var56 = small5pow[var11] << var14;
- int var32 = var55 * 10;
- var23 = 0;
- int var49 = var53 / var55;
- var53 = 10 * (var53 % var55);
- var56 *= 10;
- var24 = var53 < var56;
- var25 = var53 + var56 > var32;
- if (var49 >= 10) {
- throw new RuntimeException("Assertion botch: excessivly large digit " + var49);
- }
-
- if (var49 == 0 && !var25) {
- --var7;
- } else {
- var22[var23++] = (char)(48 + var49);
- }
-
- if (var7 <= -3 || var7 >= 8) {
- var24 = false;
- var25 = false;
- }
-
- for(; !var24 && !var25; var22[var23++] = (char)(48 + var49)) {
- var49 = var53 / var55;
- var53 = 10 * (var53 % var55);
- var56 *= 10;
- if (var49 >= 10) {
- throw new RuntimeException("Assertion botch: excessivly large digit " + var49);
- }
-
- if ((long)var56 > 0L) {
- var24 = var53 < var56;
- var25 = var53 + var56 > var32;
- } else {
- var24 = true;
- var25 = true;
- }
- }
-
- var26 = (long)((var53 << 1) - var32);
- } else {
- long var51 = var2 * long5pow[var11] << var10;
- long var31 = long5pow[var13] << var12;
- long var33 = long5pow[var11] << var14;
- long var35 = var31 * 10L;
- var23 = 0;
- int var47 = (int)(var51 / var31);
- var51 = 10L * (var51 % var31);
- var33 *= 10L;
- var24 = var51 < var33;
- var25 = var51 + var33 > var35;
- if (var47 >= 10) {
- throw new RuntimeException("Assertion botch: excessivly large digit " + var47);
- }
-
- if (var47 == 0 && !var25) {
- --var7;
- } else {
- var22[var23++] = (char)(48 + var47);
- }
-
- if (var7 <= -3 || var7 >= 8) {
- var24 = false;
- var25 = false;
- }
-
- for(; !var24 && !var25; var22[var23++] = (char)(48 + var47)) {
- var47 = (int)(var51 / var31);
- var51 = 10L * (var51 % var31);
- var33 *= 10L;
- if (var47 >= 10) {
- throw new RuntimeException("Assertion botch: excessivly large digit " + var47);
- }
-
- if (var33 > 0L) {
- var24 = var51 < var33;
- var25 = var51 + var33 > var35;
- } else {
- var24 = true;
- var25 = true;
- }
- }
-
- var26 = (var51 << 1) - var35;
- }
- } else {
- FDBigInt var19 = multPow52(new FDBigInt(var2), var11, var10);
- FDBigInt var18 = constructPow52(var13, var12);
- FDBigInt var20 = constructPow52(var11, var14);
- int var30;
- var19.lshiftMe(var30 = var18.normalizeMe());
- var20.lshiftMe(var30);
- FDBigInt var29 = var18.mult(10);
- var23 = 0;
- int var28 = var19.quoRemIteration(var18);
- var20 = var20.mult(10);
- var24 = var19.cmp(var20) < 0;
- var25 = var19.add(var20).cmp(var29) > 0;
- if (var28 >= 10) {
- throw new RuntimeException("Assertion botch: excessivly large digit " + var28);
- }
-
- if (var28 == 0 && !var25) {
- --var7;
- } else {
- var22[var23++] = (char)(48 + var28);
- }
-
- if (var7 <= -3 || var7 >= 8) {
- var24 = false;
- var25 = false;
- }
-
- while(!var24 && !var25) {
- var28 = var19.quoRemIteration(var18);
- var20 = var20.mult(10);
- if (var28 >= 10) {
- throw new RuntimeException("Assertion botch: excessivly large digit " + var28);
- }
-
- var24 = var19.cmp(var20) < 0;
- var25 = var19.add(var20).cmp(var29) > 0;
- var22[var23++] = (char)(48 + var28);
- }
-
- if (var25 && var24) {
- var19.lshiftMe(1);
- var26 = (long)var19.cmp(var29);
- } else {
- var26 = 0L;
- }
- }
-
- this.decExponent = var7 + 1;
- this.digits = var22;
- this.nDigits = var23;
- if (var25) {
- if (var24) {
- if (var26 == 0L) {
- if ((var22[this.nDigits - 1] & 1) != 0) {
- this.roundup();
- }
- } else if (var26 > 0L) {
- this.roundup();
- }
- } else {
- this.roundup();
- }
- }
-
- }
- }
-
- public String toString() {
- StringBuffer var1 = new StringBuffer(this.nDigits + 8);
- if (this.isNegative) {
- var1.append('-');
- }
-
- if (this.isExceptional) {
- var1.append(this.digits, 0, this.nDigits);
- } else {
- var1.append("0.");
- var1.append(this.digits, 0, this.nDigits);
- var1.append('e');
- var1.append(this.decExponent);
- }
-
- return new String(var1);
- }
-
- public String toJavaFormatString() {
- char[] var1 = new char[this.nDigits + 10];
- int var2 = 0;
- if (this.isNegative) {
- var1[0] = '-';
- var2 = 1;
- }
-
- if (this.isExceptional) {
- System.arraycopy(this.digits, 0, var1, var2, this.nDigits);
- var2 += this.nDigits;
- } else if (this.decExponent > 0 && this.decExponent < 8) {
- int var20 = Math.min(this.nDigits, this.decExponent);
- System.arraycopy(this.digits, 0, var1, var2, var20);
- var2 += var20;
- if (var20 < this.decExponent) {
- var20 = this.decExponent - var20;
- System.arraycopy(zero, 0, var1, var2, var20);
- var2 += var20;
- var1[var2++] = '.';
- var1[var2++] = '0';
- } else {
- var1[var2++] = '.';
- if (var20 < this.nDigits) {
- int var4 = this.nDigits - var20;
- System.arraycopy(this.digits, var20, var1, var2, var4);
- var2 += var4;
- } else {
- var1[var2++] = '0';
- }
- }
- } else if (this.decExponent <= 0 && this.decExponent > -3) {
- var1[var2++] = '0';
- var1[var2++] = '.';
- if (this.decExponent != 0) {
- System.arraycopy(zero, 0, var1, var2, -this.decExponent);
- var2 -= this.decExponent;
- }
-
- System.arraycopy(this.digits, 0, var1, var2, this.nDigits);
- var2 += this.nDigits;
- } else {
- var1[var2++] = this.digits[0];
- var1[var2++] = '.';
- if (this.nDigits > 1) {
- System.arraycopy(this.digits, 1, var1, var2, this.nDigits - 1);
- var2 += this.nDigits - 1;
- } else {
- var1[var2++] = '0';
- }
-
- var1[var2++] = 'E';
- int var3;
- if (this.decExponent <= 0) {
- var1[var2++] = '-';
- var3 = -this.decExponent + 1;
- } else {
- var3 = this.decExponent - 1;
- }
-
- if (var3 <= 9) {
- var1[var2++] = (char)(var3 + 48);
- } else if (var3 <= 99) {
- var1[var2++] = (char)(var3 / 10 + 48);
- var1[var2++] = (char)(var3 % 10 + 48);
- } else {
- var1[var2++] = (char)(var3 / 100 + 48);
- var3 %= 100;
- var1[var2++] = (char)(var3 / 10 + 48);
- var1[var2++] = (char)(var3 % 10 + 48);
- }
- }
-
- return new String(var1, 0, var2);
- }
-
- public static FloatingDecimal readJavaFormatString(String var0) throws NumberFormatException {
- boolean var1 = false;
- boolean var2 = false;
-
- try {
- var0 = var0.trim();
- int var5 = var0.length();
- if (var5 == 0) {
- throw new NumberFormatException("empty String");
- }
-
- int var6 = 0;
- char var4;
- char[] var7;
- int var8;
- boolean var9;
- int var10;
- int var11;
- int var12;
- switch (var4 = var0.charAt(var6)) {
- case '-':
- var1 = true;
- case '+':
- ++var6;
- var2 = true;
- default:
- var7 = new char[var5];
- var8 = 0;
- var9 = false;
- var10 = 0;
- var11 = 0;
- var12 = 0;
- }
-
- label91:
- for(; var6 < var5; ++var6) {
- switch (var4 = var0.charAt(var6)) {
- case '.':
- if (var9) {
- throw new NumberFormatException("multiple points");
- }
-
- var10 = var6;
- if (var2) {
- var10 = var6 - 1;
- }
-
- var9 = true;
- continue;
- case '/':
- default:
- break label91;
- case '0':
- if (var8 > 0) {
- ++var12;
- } else {
- ++var11;
- }
- continue;
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- }
-
- while(var12 > 0) {
- var7[var8++] = '0';
- --var12;
- }
-
- var7[var8++] = var4;
- }
-
- if (var8 == 0) {
- var7 = zero;
- var8 = 1;
- if (var11 == 0) {
- throw new NumberFormatException(var0);
- }
- }
-
- int var3;
- if (var9) {
- var3 = var10 - var11;
- } else {
- var3 = var8 + var12;
- }
-
- if (var6 < var5 && (var4 = var0.charAt(var6)) == 'e' || var4 == 'E') {
- byte var13 = 1;
- int var14 = 0;
- int var15 = 214748364;
- boolean var16 = false;
- ++var6;
- int var17;
- switch (var0.charAt(var6)) {
- case '-':
- var13 = -1;
- case '+':
- ++var6;
- default:
- var17 = var6;
- }
-
- label116:
- while(var6 < var5) {
- if (var14 >= var15) {
- var16 = true;
- }
-
- switch (var4 = var0.charAt(var6++)) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- var14 = var14 * 10 + (var4 - 48);
- break;
- default:
- --var6;
- break label116;
- }
- }
-
- int var18 = 324 + var8 + var12;
- if (!var16 && var14 <= var18) {
- var3 += var13 * var14;
- } else {
- var3 = var13 * var18;
- }
-
- if (var6 == var17) {
- throw new NumberFormatException(var0);
- }
- }
-
- if (var6 >= var5 || var6 == var5 - 1 && (var0.charAt(var6) == 'f' || var0.charAt(var6) == 'F' || var0.charAt(var6) == 'd' || var0.charAt(var6) == 'D')) {
- return new FloatingDecimal(var1, var3, var7, var8, false);
- }
- } catch (StringIndexOutOfBoundsException var19) {
- }
-
- throw new NumberFormatException(var0);
- }
-
- public double doubleValue() {
- int var1 = Math.min(this.nDigits, 16);
- this.roundDir = 0;
- int var10 = this.digits[0] - 48;
- int var11 = Math.min(var1, 9);
-
- for(int var12 = 1; var12 < var11; ++var12) {
- var10 = var10 * 10 + this.digits[var12] - 48;
- }
-
- long var2 = (long)var10;
-
- for(int var13 = var11; var13 < var1; ++var13) {
- var2 = var2 * 10L + (long)(this.digits[var13] - 48);
- }
-
- double var4 = (double)var2;
- int var14 = this.decExponent - var1;
- if (this.nDigits <= 15) {
- if (var14 == 0 || var4 == (double)0.0F) {
- return this.isNegative ? -var4 : var4;
- }
-
- if (var14 >= 0) {
- if (var14 <= maxSmallTen) {
- double var30 = var4 * small10pow[var14];
- if (this.mustSetRoundDir) {
- double var32 = var30 / small10pow[var14];
- this.roundDir = var32 == var4 ? 0 : (var32 < var4 ? 1 : -1);
- }
-
- return this.isNegative ? -var30 : var30;
- }
-
- int var15 = 15 - var1;
- if (var14 <= maxSmallTen + var15) {
- var4 *= small10pow[var15];
- double var6 = var4 * small10pow[var14 - var15];
- if (this.mustSetRoundDir) {
- double var8 = var6 / small10pow[var14 - var15];
- this.roundDir = var8 == var4 ? 0 : (var8 < var4 ? 1 : -1);
- }
-
- return this.isNegative ? -var6 : var6;
- }
- } else if (var14 >= -maxSmallTen) {
- double var31 = var4 / small10pow[-var14];
- double var33 = var31 * small10pow[-var14];
- if (this.mustSetRoundDir) {
- this.roundDir = var33 == var4 ? 0 : (var33 < var4 ? 1 : -1);
- }
-
- return this.isNegative ? -var31 : var31;
- }
- }
-
- if (var14 > 0) {
- if (this.decExponent > 309) {
- return this.isNegative ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
- }
-
- if ((var14 & 15) != 0) {
- var4 *= small10pow[var14 & 15];
- }
-
- if ((var14 = var14 >> 4) != 0) {
- int var38;
- for(var38 = 0; var14 > 1; var14 >>= 1) {
- if ((var14 & 1) != 0) {
- var4 *= big10pow[var38];
- }
-
- ++var38;
- }
-
- double var16 = var4 * big10pow[var38];
- if (Double.isInfinite(var16)) {
- var16 = var4 / (double)2.0F;
- var16 *= big10pow[var38];
- if (Double.isInfinite(var16)) {
- return this.isNegative ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
- }
-
- var16 = Double.MAX_VALUE;
- }
-
- var4 = var16;
- }
- } else if (var14 < 0) {
- var14 = -var14;
- if (this.decExponent < -325) {
- return this.isNegative ? (double)-0.0F : (double)0.0F;
- }
-
- if ((var14 & 15) != 0) {
- var4 /= small10pow[var14 & 15];
- }
-
- if ((var14 = var14 >> 4) != 0) {
- int var39;
- for(var39 = 0; var14 > 1; var14 >>= 1) {
- if ((var14 & 1) != 0) {
- var4 *= tiny10pow[var39];
- }
-
- ++var39;
- }
-
- double var43 = var4 * tiny10pow[var39];
- if (var43 == (double)0.0F) {
- var43 = var4 * (double)2.0F;
- var43 *= tiny10pow[var39];
- if (var43 == (double)0.0F) {
- return this.isNegative ? (double)-0.0F : (double)0.0F;
- }
-
- var43 = Double.MIN_VALUE;
- }
-
- var4 = var43;
- }
- }
-
- FDBigInt var40 = new FDBigInt(var2, this.digits, var1, this.nDigits);
- var14 = this.decExponent - this.nDigits;
-
- do {
- FDBigInt var46 = this.doubleToBigInt(var4);
- int var17;
- int var18;
- int var19;
- int var20;
- if (var14 >= 0) {
- var18 = 0;
- var17 = 0;
- var20 = var14;
- var19 = var14;
- } else {
- var17 = var18 = -var14;
- var20 = 0;
- var19 = 0;
- }
-
- if (this.bigIntExp >= 0) {
- var17 += this.bigIntExp;
- } else {
- var19 -= this.bigIntExp;
- }
-
- int var22;
- if (this.bigIntExp + this.bigIntNBits <= -1022) {
- var22 = this.bigIntExp + 1023 + 52;
- } else {
- var22 = 54 - this.bigIntNBits;
- }
-
- int var48 = var17 + var22;
- var19 += var22;
- int var23 = Math.min(var48, Math.min(var19, var17));
- int var49 = var48 - var23;
- var19 -= var23;
- int var52 = var17 - var23;
- var46 = multPow52(var46, var18, var49);
- FDBigInt var24 = multPow52(new FDBigInt(var40), var20, var19);
- FDBigInt var25;
- int var26;
- boolean var27;
- if ((var26 = var46.cmp(var24)) > 0) {
- var27 = true;
- var25 = var46.sub(var24);
- if (this.bigIntNBits == 1 && this.bigIntExp > -1023) {
- --var52;
- if (var52 < 0) {
- var52 = 0;
- var25.lshiftMe(1);
- }
- }
- } else {
- if (var26 >= 0) {
- break;
- }
-
- var27 = false;
- var25 = var24.sub(var46);
- }
-
- FDBigInt var28 = constructPow52(var18, var52);
- if ((var26 = var25.cmp(var28)) < 0) {
- this.roundDir = var27 ? -1 : 1;
- break;
- }
-
- if (var26 == 0) {
- var4 += (double)0.5F * ulp(var4, var27);
- this.roundDir = var27 ? -1 : 1;
- break;
- }
-
- var4 += ulp(var4, var27);
- } while(var4 != (double)0.0F && var4 != Double.POSITIVE_INFINITY);
-
- return this.isNegative ? -var4 : var4;
- }
-
- public float floatValue() {
- int var1 = Math.min(this.nDigits, 8);
- int var2 = this.digits[0] - 48;
-
- for(int var4 = 1; var4 < var1; ++var4) {
- var2 = var2 * 10 + this.digits[var4] - 48;
- }
-
- float var3 = (float)var2;
- int var5 = this.decExponent - var1;
- if (this.nDigits <= 7) {
- if (var5 == 0 || var3 == 0.0F) {
- return this.isNegative ? -var3 : var3;
- }
-
- if (var5 >= 0) {
- if (var5 <= singleMaxSmallTen) {
- var3 *= singleSmall10pow[var5];
- return this.isNegative ? -var3 : var3;
- }
-
- int var6 = 7 - var1;
- if (var5 <= singleMaxSmallTen + var6) {
- var3 *= singleSmall10pow[var6];
- var3 *= singleSmall10pow[var5 - var6];
- return this.isNegative ? -var3 : var3;
- }
- } else if (var5 >= -singleMaxSmallTen) {
- var3 /= singleSmall10pow[-var5];
- return this.isNegative ? -var3 : var3;
- }
- } else if (this.decExponent >= this.nDigits && this.nDigits + this.decExponent <= 15) {
- long var18 = (long)var2;
-
- for(int var8 = var1; var8 < this.nDigits; ++var8) {
- var18 = var18 * 10L + (long)(this.digits[var8] - 48);
- }
-
- double var9 = (double)var18;
- var5 = this.decExponent - this.nDigits;
- var9 *= small10pow[var5];
- var3 = (float)var9;
- return this.isNegative ? -var3 : var3;
- }
-
- if (this.decExponent > 39) {
- return this.isNegative ? Float.NEGATIVE_INFINITY : Float.POSITIVE_INFINITY;
- } else if (this.decExponent < -46) {
- return this.isNegative ? -0.0F : 0.0F;
- } else {
- this.mustSetRoundDir = true;
- double var17 = this.doubleValue();
- return this.stickyRound(var17);
- }
- }
-
- static {
- maxSmallTen = small10pow.length - 1;
- singleMaxSmallTen = singleSmall10pow.length - 1;
- small5pow = new int[]{1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, 48828125, 244140625, 1220703125};
- long5pow = new long[]{1L, 5L, 25L, 125L, 625L, 3125L, 15625L, 78125L, 390625L, 1953125L, 9765625L, 48828125L, 244140625L, 1220703125L, 6103515625L, 30517578125L, 152587890625L, 762939453125L, 3814697265625L, 19073486328125L, 95367431640625L, 476837158203125L, 2384185791015625L, 11920928955078125L, 59604644775390625L, 298023223876953125L, 1490116119384765625L};
- n5bits = new int[]{0, 3, 5, 7, 10, 12, 14, 17, 19, 21, 24, 26, 28, 31, 33, 35, 38, 40, 42, 45, 47, 49, 52, 54, 56, 59, 61};
- infinity = new char[]{'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'};
- notANumber = new char[]{'N', 'a', 'N'};
- zero = new char[]{'0', '0', '0', '0', '0', '0', '0', '0'};
- }
- }
-