home *** CD-ROM | disk | FTP | other *** search
- package java.lang;
-
- class FloatingDecimal {
- boolean isExceptional;
- boolean isNegative;
- int decExponent;
- char[] digits;
- int nDigits;
- 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 = 1L << 52;
- static final long expOne = 1023L << 52;
- static final int maxSmallBinExp = 62;
- static final int minSmallBinExp = -21;
- 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;
- private static FDBigInt[] b5p;
- private static final int[] small5pow = new int[]{1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, 48828125, 244140625, 1220703125};
- private static final long[] 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};
- private static final int[] 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};
- private static final char[] infinity = new char[]{'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'};
- private static final char[] notANumber = new char[]{'N', 'a', 'N'};
- private static final char[] zero = new char[]{'0', '0', '0', '0', '0', '0', '0', '0'};
-
- 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 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 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 == (int)(9218868437227405312L >> 52)) {
- 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 & 1L << 52) == 0L) {
- var5 <<= 1;
- --var7;
- }
-
- var8 = 52 + var7;
- ++var7;
- } else {
- var5 |= 1L << 52;
- 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;
- ++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(1023L << 52 | var2 & ~(1L << 52));
- 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 = new FDBigInt(var2);
- if (var11 != 0) {
- if (var11 < small5pow.length) {
- var19 = var19.mult(small5pow[var11]);
- } else {
- var19 = var19.mult(big5pow(var11));
- }
- }
-
- if (var10 != 0) {
- var19.lshiftMe(var10);
- }
-
- FDBigInt var18 = new FDBigInt(big5pow(var13));
- if (var12 != 0) {
- var18.lshiftMe(var12);
- }
-
- FDBigInt var20 = new FDBigInt(big5pow(var11));
- if (var14 != 0) {
- var20.lshiftMe(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();
- return;
- }
-
- return;
- }
-
- if (var26 > 0L) {
- this.roundup();
- return;
- }
- } 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);
- }
- }
-