Home | History | Annotate | Download | only in lang
      1    /*
      2  * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
      3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      4  *
      5  * This code is free software; you can redistribute it and/or modify it
      6  * under the terms of the GNU General Public License version 2 only, as
      7  * published by the Free Software Foundation.  Oracle designates this
      8  * particular file as subject to the "Classpath" exception as provided
      9  * by Oracle in the LICENSE file that accompanied this code.
     10  *
     11  * This code is distributed in the hope that it will be useful, but WITHOUT
     12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  * version 2 for more details (a copy is included in the LICENSE file that
     15  * accompanied this code).
     16  *
     17  * You should have received a copy of the GNU General Public License version
     18  * 2 along with this work; if not, write to the Free Software Foundation,
     19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     20  *
     21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     22  * or visit www.oracle.com if you need additional information or have any
     23  * questions.
     24  */
     25 
     26 package java.lang;
     27 
     28 import sun.misc.FpUtils;
     29 import sun.misc.FDBigInt;
     30 import sun.misc.DoubleConsts;
     31 import sun.misc.FloatConsts;
     32 import java.util.regex.*;
     33 
     34 public class FloatingDecimal {
     35     boolean     isExceptional;
     36     boolean     isNegative;
     37     int         decExponent;
     38     char        digits[];
     39     int         nDigits;
     40     int         bigIntExp;
     41     int         bigIntNBits;
     42     boolean     mustSetRoundDir = false;
     43     boolean     fromHex = false;
     44     int         roundDir = 0; // set by doubleValue
     45 
     46     /*
     47      * Constants of the implementation
     48      * Most are IEEE-754 related.
     49      * (There are more really boring constants at the end.)
     50      */
     51     static final long   signMask = 0x8000000000000000L;
     52     static final long   expMask  = 0x7ff0000000000000L;
     53     static final long   fractMask= ~(signMask|expMask);
     54     static final int    expShift = 52;
     55     static final int    expBias  = 1023;
     56     static final long   fractHOB = ( 1L<<expShift ); // assumed High-Order bit
     57     static final long   expOne   = ((long)expBias)<<expShift; // exponent of 1.0
     58     static final int    maxSmallBinExp = 62;
     59     static final int    minSmallBinExp = -( 63 / 3 );
     60     static final int    maxDecimalDigits = 15;
     61     static final int    maxDecimalExponent = 308;
     62     static final int    minDecimalExponent = -324;
     63     static final int    bigDecimalExponent = 324; // i.e. abs(minDecimalExponent)
     64 
     65     static final long   highbyte = 0xff00000000000000L;
     66     static final long   highbit  = 0x8000000000000000L;
     67     static final long   lowbytes = ~highbyte;
     68 
     69     static final int    singleSignMask =    0x80000000;
     70     static final int    singleExpMask  =    0x7f800000;
     71     static final int    singleFractMask =   ~(singleSignMask|singleExpMask);
     72     static final int    singleExpShift  =   23;
     73     static final int    singleFractHOB  =   1<<singleExpShift;
     74     static final int    singleExpBias   =   127;
     75     static final int    singleMaxDecimalDigits = 7;
     76     static final int    singleMaxDecimalExponent = 38;
     77     static final int    singleMinDecimalExponent = -45;
     78 
     79     static final int    intDecimalDigits = 9;
     80 
     81     /*
     82      * count number of bits from high-order 1 bit to low-order 1 bit,
     83      * inclusive.
     84      */
     85     private static int
     86     countBits( long v ){
     87         //
     88         // the strategy is to shift until we get a non-zero sign bit
     89         // then shift until we have no bits left, counting the difference.
     90         // we do byte shifting as a hack. Hope it helps.
     91         //
     92         if ( v == 0L ) return 0;
     93 
     94         while ( ( v & highbyte ) == 0L ){
     95             v <<= 8;
     96         }
     97         while ( v > 0L ) { // i.e. while ((v&highbit) == 0L )
     98             v <<= 1;
     99         }
    100 
    101         int n = 0;
    102         while (( v & lowbytes ) != 0L ){
    103             v <<= 8;
    104             n += 8;
    105         }
    106         while ( v != 0L ){
    107             v <<= 1;
    108             n += 1;
    109         }
    110         return n;
    111     }
    112 
    113     /*
    114      * Keep big powers of 5 handy for future reference.
    115      */
    116     private static FDBigInt b5p[];
    117 
    118     private static synchronized FDBigInt
    119     big5pow( int p ){
    120         assert p >= 0 : p; // negative power of 5
    121         if ( b5p == null ){
    122             b5p = new FDBigInt[ p+1 ];
    123         }else if (b5p.length <= p ){
    124             FDBigInt t[] = new FDBigInt[ p+1 ];
    125             System.arraycopy( b5p, 0, t, 0, b5p.length );
    126             b5p = t;
    127         }
    128         if ( b5p[p] != null )
    129             return b5p[p];
    130         else if ( p < small5pow.length )
    131             return b5p[p] = new FDBigInt( small5pow[p] );
    132         else if ( p < long5pow.length )
    133             return b5p[p] = new FDBigInt( long5pow[p] );
    134         else {
    135             // construct the value.
    136             // recursively.
    137             int q, r;
    138             // in order to compute 5^p,
    139             // compute its square root, 5^(p/2) and square.
    140             // or, let q = p / 2, r = p -q, then
    141             // 5^p = 5^(q+r) = 5^q * 5^r
    142             q = p >> 1;
    143             r = p - q;
    144             FDBigInt bigq =  b5p[q];
    145             if ( bigq == null )
    146                 bigq = big5pow ( q );
    147             if ( r < small5pow.length ){
    148                 return (b5p[p] = bigq.mult( small5pow[r] ) );
    149             }else{
    150                 FDBigInt bigr = b5p[ r ];
    151                 if ( bigr == null )
    152                     bigr = big5pow( r );
    153                 return (b5p[p] = bigq.mult( bigr ) );
    154             }
    155         }
    156     }
    157 
    158     //
    159     // a common operation
    160     //
    161     private static FDBigInt
    162     multPow52( FDBigInt v, int p5, int p2 ){
    163         if ( p5 != 0 ){
    164             if ( p5 < small5pow.length ){
    165                 v = v.mult( small5pow[p5] );
    166             } else {
    167                 v = v.mult( big5pow( p5 ) );
    168             }
    169         }
    170         if ( p2 != 0 ){
    171             v.lshiftMe( p2 );
    172         }
    173         return v;
    174     }
    175 
    176     //
    177     // another common operation
    178     //
    179     private static FDBigInt
    180     constructPow52( int p5, int p2 ){
    181         FDBigInt v = new FDBigInt( big5pow( p5 ) );
    182         if ( p2 != 0 ){
    183             v.lshiftMe( p2 );
    184         }
    185         return v;
    186     }
    187 
    188     /*
    189      * Make a floating double into a FDBigInt.
    190      * This could also be structured as a FDBigInt
    191      * constructor, but we'd have to build a lot of knowledge
    192      * about floating-point representation into it, and we don't want to.
    193      *
    194      * AS A SIDE EFFECT, THIS METHOD WILL SET THE INSTANCE VARIABLES
    195      * bigIntExp and bigIntNBits
    196      *
    197      */
    198     private FDBigInt
    199     doubleToBigInt( double dval ){
    200         long lbits = Double.doubleToLongBits( dval ) & ~signMask;
    201         int binexp = (int)(lbits >>> expShift);
    202         lbits &= fractMask;
    203         if ( binexp > 0 ){
    204             lbits |= fractHOB;
    205         } else {
    206             assert lbits != 0L : lbits; // doubleToBigInt(0.0)
    207             binexp +=1;
    208             while ( (lbits & fractHOB ) == 0L){
    209                 lbits <<= 1;
    210                 binexp -= 1;
    211             }
    212         }
    213         binexp -= expBias;
    214         int nbits = countBits( lbits );
    215         /*
    216          * We now know where the high-order 1 bit is,
    217          * and we know how many there are.
    218          */
    219         int lowOrderZeros = expShift+1-nbits;
    220         lbits >>>= lowOrderZeros;
    221 
    222         bigIntExp = binexp+1-nbits;
    223         bigIntNBits = nbits;
    224         return new FDBigInt( lbits );
    225     }
    226 
    227     /*
    228      * Compute a number that is the ULP of the given value,
    229      * for purposes of addition/subtraction. Generally easy.
    230      * More difficult if subtracting and the argument
    231      * is a normalized a power of 2, as the ULP changes at these points.
    232      */
    233     private static double ulp( double dval, boolean subtracting ){
    234         long lbits = Double.doubleToLongBits( dval ) & ~signMask;
    235         int binexp = (int)(lbits >>> expShift);
    236         double ulpval;
    237         if ( subtracting && ( binexp >= expShift ) && ((lbits&fractMask) == 0L) ){
    238             // for subtraction from normalized, powers of 2,
    239             // use next-smaller exponent
    240             binexp -= 1;
    241         }
    242         if ( binexp > expShift ){
    243             ulpval = Double.longBitsToDouble( ((long)(binexp-expShift))<<expShift );
    244         } else if ( binexp == 0 ){
    245             ulpval = Double.MIN_VALUE;
    246         } else {
    247             ulpval = Double.longBitsToDouble( 1L<<(binexp-1) );
    248         }
    249         if ( subtracting ) ulpval = - ulpval;
    250 
    251         return ulpval;
    252     }
    253 
    254     /*
    255      * Round a double to a float.
    256      * In addition to the fraction bits of the double,
    257      * look at the class instance variable roundDir,
    258      * which should help us avoid double-rounding error.
    259      * roundDir was set in hardValueOf if the estimate was
    260      * close enough, but not exact. It tells us which direction
    261      * of rounding is preferred.
    262      */
    263     float
    264     stickyRound( double dval ){
    265         long lbits = Double.doubleToLongBits( dval );
    266         long binexp = lbits & expMask;
    267         if ( binexp == 0L || binexp == expMask ){
    268             // what we have here is special.
    269             // don't worry, the right thing will happen.
    270             return (float) dval;
    271         }
    272         lbits += (long)roundDir; // hack-o-matic.
    273         return (float)Double.longBitsToDouble( lbits );
    274     }
    275 
    276 
    277     /*
    278      * This is the easy subcase --
    279      * all the significant bits, after scaling, are held in lvalue.
    280      * negSign and decExponent tell us what processing and scaling
    281      * has already been done. Exceptional cases have already been
    282      * stripped out.
    283      * In particular:
    284      * lvalue is a finite number (not Inf, nor NaN)
    285      * lvalue > 0L (not zero, nor negative).
    286      *
    287      * The only reason that we develop the digits here, rather than
    288      * calling on Long.toString() is that we can do it a little faster,
    289      * and besides want to treat trailing 0s specially. If Long.toString
    290      * changes, we should re-evaluate this strategy!
    291      */
    292     private void
    293     developLongDigits( int decExponent, long lvalue, long insignificant ){
    294         char digits[];
    295         int  ndigits;
    296         int  digitno;
    297         int  c;
    298         //
    299         // Discard non-significant low-order bits, while rounding,
    300         // up to insignificant value.
    301         int i;
    302         for ( i = 0; insignificant >= 10L; i++ )
    303             insignificant /= 10L;
    304         if ( i != 0 ){
    305             long pow10 = long5pow[i] << i; // 10^i == 5^i * 2^i;
    306             long residue = lvalue % pow10;
    307             lvalue /= pow10;
    308             decExponent += i;
    309             if ( residue >= (pow10>>1) ){
    310                 // round up based on the low-order bits we're discarding
    311                 lvalue++;
    312             }
    313         }
    314         if ( lvalue <= Integer.MAX_VALUE ){
    315             assert lvalue > 0L : lvalue; // lvalue <= 0
    316             // even easier subcase!
    317             // can do int arithmetic rather than long!
    318             int  ivalue = (int)lvalue;
    319             ndigits = 10;
    320             digits = (char[])(perThreadBuffer.get());
    321             digitno = ndigits-1;
    322             c = ivalue%10;
    323             ivalue /= 10;
    324             while ( c == 0 ){
    325                 decExponent++;
    326                 c = ivalue%10;
    327                 ivalue /= 10;
    328             }
    329             while ( ivalue != 0){
    330                 digits[digitno--] = (char)(c+'0');
    331                 decExponent++;
    332                 c = ivalue%10;
    333                 ivalue /= 10;
    334             }
    335             digits[digitno] = (char)(c+'0');
    336         } else {
    337             // same algorithm as above (same bugs, too )
    338             // but using long arithmetic.
    339             ndigits = 20;
    340             digits = (char[])(perThreadBuffer.get());
    341             digitno = ndigits-1;
    342             c = (int)(lvalue%10L);
    343             lvalue /= 10L;
    344             while ( c == 0 ){
    345                 decExponent++;
    346                 c = (int)(lvalue%10L);
    347                 lvalue /= 10L;
    348             }
    349             while ( lvalue != 0L ){
    350                 digits[digitno--] = (char)(c+'0');
    351                 decExponent++;
    352                 c = (int)(lvalue%10L);
    353                 lvalue /= 10;
    354             }
    355             digits[digitno] = (char)(c+'0');
    356         }
    357         char result [];
    358         ndigits -= digitno;
    359         result = new char[ ndigits ];
    360         System.arraycopy( digits, digitno, result, 0, ndigits );
    361         this.digits = result;
    362         this.decExponent = decExponent+1;
    363         this.nDigits = ndigits;
    364     }
    365 
    366     //
    367     // add one to the least significant digit.
    368     // in the unlikely event there is a carry out,
    369     // deal with it.
    370     // assert that this will only happen where there
    371     // is only one digit, e.g. (float)1e-44 seems to do it.
    372     //
    373     private void
    374     roundup(){
    375         int i;
    376         int q = digits[ i = (nDigits-1)];
    377         if ( q == '9' ){
    378             while ( q == '9' && i > 0 ){
    379                 digits[i] = '0';
    380                 q = digits[--i];
    381             }
    382             if ( q == '9' ){
    383                 // carryout! High-order 1, rest 0s, larger exp.
    384                 decExponent += 1;
    385                 digits[0] = '1';
    386                 return;
    387             }
    388             // else fall through.
    389         }
    390         digits[i] = (char)(q+1);
    391     }
    392 
    393     private FloatingDecimal() {}
    394 
    395     private static final ThreadLocal<FloatingDecimal> TL_INSTANCE = new ThreadLocal<FloatingDecimal>() {
    396         @Override protected FloatingDecimal initialValue() {
    397             return new FloatingDecimal();
    398         }
    399     };
    400     public static FloatingDecimal getThreadLocalInstance() {
    401         return TL_INSTANCE.get();
    402     }
    403 
    404     /*
    405      * FIRST IMPORTANT LOAD: DOUBLE
    406      */
    407     public FloatingDecimal loadDouble(double d) {
    408         long    dBits = Double.doubleToLongBits( d );
    409         long    fractBits;
    410         int     binExp;
    411         int     nSignificantBits;
    412 
    413         mustSetRoundDir = false;
    414         fromHex = false;
    415         roundDir = 0;
    416 
    417         // discover and delete sign
    418         if ( (dBits&signMask) != 0 ){
    419             isNegative = true;
    420             dBits ^= signMask;
    421         } else {
    422             isNegative = false;
    423         }
    424         // Begin to unpack
    425         // Discover obvious special cases of NaN and Infinity.
    426         binExp = (int)( (dBits&expMask) >> expShift );
    427         fractBits = dBits&fractMask;
    428         if ( binExp == (int)(expMask>>expShift) ) {
    429             isExceptional = true;
    430             if ( fractBits == 0L ){
    431                 digits =  infinity;
    432             } else {
    433                 digits = notANumber;
    434                 isNegative = false; // NaN has no sign!
    435             }
    436             nDigits = digits.length;
    437             return this;
    438         }
    439         isExceptional = false;
    440         // Finish unpacking
    441         // Normalize denormalized numbers.
    442         // Insert assumed high-order bit for normalized numbers.
    443         // Subtract exponent bias.
    444         if ( binExp == 0 ){
    445             if ( fractBits == 0L ){
    446                 // not a denorm, just a 0!
    447                 decExponent = 0;
    448                 digits = zero;
    449                 nDigits = 1;
    450                 return this;
    451             }
    452             while ( (fractBits&fractHOB) == 0L ){
    453                 fractBits <<= 1;
    454                 binExp -= 1;
    455             }
    456             nSignificantBits = expShift + binExp +1; // recall binExp is  - shift count.
    457             binExp += 1;
    458         } else {
    459             fractBits |= fractHOB;
    460             nSignificantBits = expShift+1;
    461         }
    462         binExp -= expBias;
    463         // call the routine that actually does all the hard work.
    464         dtoa( binExp, fractBits, nSignificantBits );
    465         return this;
    466     }
    467 
    468     /*
    469      * SECOND IMPORTANT LOAD: SINGLE
    470      */
    471     public FloatingDecimal loadFloat(float f) {
    472         int     fBits = Float.floatToIntBits( f );
    473         int     fractBits;
    474         int     binExp;
    475         int     nSignificantBits;
    476 
    477         mustSetRoundDir = false;
    478         fromHex = false;
    479         roundDir = 0;
    480 
    481         // discover and delete sign
    482         if ( (fBits&singleSignMask) != 0 ){
    483             isNegative = true;
    484             fBits ^= singleSignMask;
    485         } else {
    486             isNegative = false;
    487         }
    488         // Begin to unpack
    489         // Discover obvious special cases of NaN and Infinity.
    490         binExp = (int)( (fBits&singleExpMask) >> singleExpShift );
    491         fractBits = fBits&singleFractMask;
    492         if ( binExp == (int)(singleExpMask>>singleExpShift) ) {
    493             isExceptional = true;
    494             if ( fractBits == 0L ){
    495                 digits =  infinity;
    496             } else {
    497                 digits = notANumber;
    498                 isNegative = false; // NaN has no sign!
    499             }
    500             nDigits = digits.length;
    501             return this;
    502         }
    503         isExceptional = false;
    504         // Finish unpacking
    505         // Normalize denormalized numbers.
    506         // Insert assumed high-order bit for normalized numbers.
    507         // Subtract exponent bias.
    508         if ( binExp == 0 ){
    509             if ( fractBits == 0 ){
    510                 // not a denorm, just a 0!
    511                 decExponent = 0;
    512                 digits = zero;
    513                 nDigits = 1;
    514                 return this;
    515             }
    516             while ( (fractBits&singleFractHOB) == 0 ){
    517                 fractBits <<= 1;
    518                 binExp -= 1;
    519             }
    520             nSignificantBits = singleExpShift + binExp +1; // recall binExp is  - shift count.
    521             binExp += 1;
    522         } else {
    523             fractBits |= singleFractHOB;
    524             nSignificantBits = singleExpShift+1;
    525         }
    526         binExp -= singleExpBias;
    527         // call the routine that actually does all the hard work.
    528         dtoa( binExp, ((long)fractBits)<<(expShift-singleExpShift), nSignificantBits );
    529         return this;
    530     }
    531 
    532     private void
    533     dtoa( int binExp, long fractBits, int nSignificantBits )
    534     {
    535         int     nFractBits; // number of significant bits of fractBits;
    536         int     nTinyBits;  // number of these to the right of the point.
    537         int     decExp;
    538 
    539         // Examine number. Determine if it is an easy case,
    540         // which we can do pretty trivially using float/long conversion,
    541         // or whether we must do real work.
    542         nFractBits = countBits( fractBits );
    543         nTinyBits = Math.max( 0, nFractBits - binExp - 1 );
    544         if ( binExp <= maxSmallBinExp && binExp >= minSmallBinExp ){
    545             // Look more closely at the number to decide if,
    546             // with scaling by 10^nTinyBits, the result will fit in
    547             // a long.
    548             if ( (nTinyBits < long5pow.length) && ((nFractBits + n5bits[nTinyBits]) < 64 ) ){
    549                 /*
    550                  * We can do this:
    551                  * take the fraction bits, which are normalized.
    552                  * (a) nTinyBits == 0: Shift left or right appropriately
    553                  *     to align the binary point at the extreme right, i.e.
    554                  *     where a long int point is expected to be. The integer
    555                  *     result is easily converted to a string.
    556                  * (b) nTinyBits > 0: Shift right by expShift-nFractBits,
    557                  *     which effectively converts to long and scales by
    558                  *     2^nTinyBits. Then multiply by 5^nTinyBits to
    559                  *     complete the scaling. We know this won't overflow
    560                  *     because we just counted the number of bits necessary
    561                  *     in the result. The integer you get from this can
    562                  *     then be converted to a string pretty easily.
    563                  */
    564                 long halfULP;
    565                 if ( nTinyBits == 0 ) {
    566                     if ( binExp > nSignificantBits ){
    567                         halfULP = 1L << ( binExp-nSignificantBits-1);
    568                     } else {
    569                         halfULP = 0L;
    570                     }
    571                     if ( binExp >= expShift ){
    572                         fractBits <<= (binExp-expShift);
    573                     } else {
    574                         fractBits >>>= (expShift-binExp) ;
    575                     }
    576                     developLongDigits( 0, fractBits, halfULP );
    577                     return;
    578                 }
    579                 /*
    580                  * The following causes excess digits to be printed
    581                  * out in the single-float case. Our manipulation of
    582                  * halfULP here is apparently not correct. If we
    583                  * better understand how this works, perhaps we can
    584                  * use this special case again. But for the time being,
    585                  * we do not.
    586                  * else {
    587                  *     fractBits >>>= expShift+1-nFractBits;
    588                  *     fractBits *= long5pow[ nTinyBits ];
    589                  *     halfULP = long5pow[ nTinyBits ] >> (1+nSignificantBits-nFractBits);
    590                  *     developLongDigits( -nTinyBits, fractBits, halfULP );
    591                  *     return;
    592                  * }
    593                  */
    594             }
    595         }
    596         /*
    597          * This is the hard case. We are going to compute large positive
    598          * integers B and S and integer decExp, s.t.
    599          *      d = ( B / S ) * 10^decExp
    600          *      1 <= B / S < 10
    601          * Obvious choices are:
    602          *      decExp = floor( log10(d) )
    603          *      B      = d * 2^nTinyBits * 10^max( 0, -decExp )
    604          *      S      = 10^max( 0, decExp) * 2^nTinyBits
    605          * (noting that nTinyBits has already been forced to non-negative)
    606          * I am also going to compute a large positive integer
    607          *      M      = (1/2^nSignificantBits) * 2^nTinyBits * 10^max( 0, -decExp )
    608          * i.e. M is (1/2) of the ULP of d, scaled like B.
    609          * When we iterate through dividing B/S and picking off the
    610          * quotient bits, we will know when to stop when the remainder
    611          * is <= M.
    612          *
    613          * We keep track of powers of 2 and powers of 5.
    614          */
    615 
    616         /*
    617          * Estimate decimal exponent. (If it is small-ish,
    618          * we could double-check.)
    619          *
    620          * First, scale the mantissa bits such that 1 <= d2 < 2.
    621          * We are then going to estimate
    622          *          log10(d2) ~=~  (d2-1.5)/1.5 + log(1.5)
    623          * and so we can estimate
    624          *      log10(d) ~=~ log10(d2) + binExp * log10(2)
    625          * take the floor and call it decExp.
    626          * FIXME -- use more precise constants here. It costs no more.
    627          */
    628         double d2 = Double.longBitsToDouble(
    629             expOne | ( fractBits &~ fractHOB ) );
    630         decExp = (int)Math.floor(
    631             (d2-1.5D)*0.289529654D + 0.176091259 + (double)binExp * 0.301029995663981 );
    632         int B2, B5; // powers of 2 and powers of 5, respectively, in B
    633         int S2, S5; // powers of 2 and powers of 5, respectively, in S
    634         int M2, M5; // powers of 2 and powers of 5, respectively, in M
    635         int Bbits; // binary digits needed to represent B, approx.
    636         int tenSbits; // binary digits needed to represent 10*S, approx.
    637         FDBigInt Sval, Bval, Mval;
    638 
    639         B5 = Math.max( 0, -decExp );
    640         B2 = B5 + nTinyBits + binExp;
    641 
    642         S5 = Math.max( 0, decExp );
    643         S2 = S5 + nTinyBits;
    644 
    645         M5 = B5;
    646         M2 = B2 - nSignificantBits;
    647 
    648         /*
    649          * the long integer fractBits contains the (nFractBits) interesting
    650          * bits from the mantissa of d ( hidden 1 added if necessary) followed
    651          * by (expShift+1-nFractBits) zeros. In the interest of compactness,
    652          * I will shift out those zeros before turning fractBits into a
    653          * FDBigInt. The resulting whole number will be
    654          *      d * 2^(nFractBits-1-binExp).
    655          */
    656         fractBits >>>= (expShift+1-nFractBits);
    657         B2 -= nFractBits-1;
    658         int common2factor = Math.min( B2, S2 );
    659         B2 -= common2factor;
    660         S2 -= common2factor;
    661         M2 -= common2factor;
    662 
    663         /*
    664          * HACK!! For exact powers of two, the next smallest number
    665          * is only half as far away as we think (because the meaning of
    666          * ULP changes at power-of-two bounds) for this reason, we
    667          * hack M2. Hope this works.
    668          */
    669         if ( nFractBits == 1 )
    670             M2 -= 1;
    671 
    672         if ( M2 < 0 ){
    673             // oops.
    674             // since we cannot scale M down far enough,
    675             // we must scale the other values up.
    676             B2 -= M2;
    677             S2 -= M2;
    678             M2 =  0;
    679         }
    680         /*
    681          * Construct, Scale, iterate.
    682          * Some day, we'll write a stopping test that takes
    683          * account of the asymmetry of the spacing of floating-point
    684          * numbers below perfect powers of 2
    685          * 26 Sept 96 is not that day.
    686          * So we use a symmetric test.
    687          */
    688         char digits[] = this.digits = new char[18];
    689         int  ndigit = 0;
    690         boolean low, high;
    691         long lowDigitDifference;
    692         int  q;
    693 
    694         /*
    695          * Detect the special cases where all the numbers we are about
    696          * to compute will fit in int or long integers.
    697          * In these cases, we will avoid doing FDBigInt arithmetic.
    698          * We use the same algorithms, except that we "normalize"
    699          * our FDBigInts before iterating. This is to make division easier,
    700          * as it makes our fist guess (quotient of high-order words)
    701          * more accurate!
    702          *
    703          * Some day, we'll write a stopping test that takes
    704          * account of the asymmetry of the spacing of floating-point
    705          * numbers below perfect powers of 2
    706          * 26 Sept 96 is not that day.
    707          * So we use a symmetric test.
    708          */
    709         Bbits = nFractBits + B2 + (( B5 < n5bits.length )? n5bits[B5] : ( B5*3 ));
    710         tenSbits = S2+1 + (( (S5+1) < n5bits.length )? n5bits[(S5+1)] : ( (S5+1)*3 ));
    711         if ( Bbits < 64 && tenSbits < 64){
    712             if ( Bbits < 32 && tenSbits < 32){
    713                 // wa-hoo! They're all ints!
    714                 int b = ((int)fractBits * small5pow[B5] ) << B2;
    715                 int s = small5pow[S5] << S2;
    716                 int m = small5pow[M5] << M2;
    717                 int tens = s * 10;
    718                 /*
    719                  * Unroll the first iteration. If our decExp estimate
    720                  * was too high, our first quotient will be zero. In this
    721                  * case, we discard it and decrement decExp.
    722                  */
    723                 ndigit = 0;
    724                 q = b / s;
    725                 b = 10 * ( b % s );
    726                 m *= 10;
    727                 low  = (b <  m );
    728                 high = (b+m > tens );
    729                 assert q < 10 : q; // excessively large digit
    730                 if ( (q == 0) && ! high ){
    731                     // oops. Usually ignore leading zero.
    732                     decExp--;
    733                 } else {
    734                     digits[ndigit++] = (char)('0' + q);
    735                 }
    736                 /*
    737                  * HACK! Java spec sez that we always have at least
    738                  * one digit after the . in either F- or E-form output.
    739                  * Thus we will need more than one digit if we're using
    740                  * E-form
    741                  */
    742                 if ( decExp < -3 || decExp >= 8 ){
    743                     high = low = false;
    744                 }
    745                 while( ! low && ! high ){
    746                     q = b / s;
    747                     b = 10 * ( b % s );
    748                     m *= 10;
    749                     assert q < 10 : q; // excessively large digit
    750                     if ( m > 0L ){
    751                         low  = (b <  m );
    752                         high = (b+m > tens );
    753                     } else {
    754                         // hack -- m might overflow!
    755                         // in this case, it is certainly > b,
    756                         // which won't
    757                         // and b+m > tens, too, since that has overflowed
    758                         // either!
    759                         low = true;
    760                         high = true;
    761                     }
    762                     digits[ndigit++] = (char)('0' + q);
    763                 }
    764                 lowDigitDifference = (b<<1) - tens;
    765             } else {
    766                 // still good! they're all longs!
    767                 long b = (fractBits * long5pow[B5] ) << B2;
    768                 long s = long5pow[S5] << S2;
    769                 long m = long5pow[M5] << M2;
    770                 long tens = s * 10L;
    771                 /*
    772                  * Unroll the first iteration. If our decExp estimate
    773                  * was too high, our first quotient will be zero. In this
    774                  * case, we discard it and decrement decExp.
    775                  */
    776                 ndigit = 0;
    777                 q = (int) ( b / s );
    778                 b = 10L * ( b % s );
    779                 m *= 10L;
    780                 low  = (b <  m );
    781                 high = (b+m > tens );
    782                 assert q < 10 : q; // excessively large digit
    783                 if ( (q == 0) && ! high ){
    784                     // oops. Usually ignore leading zero.
    785                     decExp--;
    786                 } else {
    787                     digits[ndigit++] = (char)('0' + q);
    788                 }
    789                 /*
    790                  * HACK! Java spec sez that we always have at least
    791                  * one digit after the . in either F- or E-form output.
    792                  * Thus we will need more than one digit if we're using
    793                  * E-form
    794                  */
    795                 if ( decExp < -3 || decExp >= 8 ){
    796                     high = low = false;
    797                 }
    798                 while( ! low && ! high ){
    799                     q = (int) ( b / s );
    800                     b = 10 * ( b % s );
    801                     m *= 10;
    802                     assert q < 10 : q;  // excessively large digit
    803                     if ( m > 0L ){
    804                         low  = (b <  m );
    805                         high = (b+m > tens );
    806                     } else {
    807                         // hack -- m might overflow!
    808                         // in this case, it is certainly > b,
    809                         // which won't
    810                         // and b+m > tens, too, since that has overflowed
    811                         // either!
    812                         low = true;
    813                         high = true;
    814                     }
    815                     digits[ndigit++] = (char)('0' + q);
    816                 }
    817                 lowDigitDifference = (b<<1) - tens;
    818             }
    819         } else {
    820             FDBigInt tenSval;
    821             int  shiftBias;
    822 
    823             /*
    824              * We really must do FDBigInt arithmetic.
    825              * Fist, construct our FDBigInt initial values.
    826              */
    827             Bval = multPow52( new FDBigInt( fractBits  ), B5, B2 );
    828             Sval = constructPow52( S5, S2 );
    829             Mval = constructPow52( M5, M2 );
    830 
    831 
    832             // normalize so that division works better
    833             Bval.lshiftMe( shiftBias = Sval.normalizeMe() );
    834             Mval.lshiftMe( shiftBias );
    835             tenSval = Sval.mult( 10 );
    836             /*
    837              * Unroll the first iteration. If our decExp estimate
    838              * was too high, our first quotient will be zero. In this
    839              * case, we discard it and decrement decExp.
    840              */
    841             ndigit = 0;
    842             q = Bval.quoRemIteration( Sval );
    843             Mval = Mval.mult( 10 );
    844             low  = (Bval.cmp( Mval ) < 0);
    845             high = (Bval.add( Mval ).cmp( tenSval ) > 0 );
    846             assert q < 10 : q; // excessively large digit
    847             if ( (q == 0) && ! high ){
    848                 // oops. Usually ignore leading zero.
    849                 decExp--;
    850             } else {
    851                 digits[ndigit++] = (char)('0' + q);
    852             }
    853             /*
    854              * HACK! Java spec sez that we always have at least
    855              * one digit after the . in either F- or E-form output.
    856              * Thus we will need more than one digit if we're using
    857              * E-form
    858              */
    859             if ( decExp < -3 || decExp >= 8 ){
    860                 high = low = false;
    861             }
    862             while( ! low && ! high ){
    863                 q = Bval.quoRemIteration( Sval );
    864                 Mval = Mval.mult( 10 );
    865                 assert q < 10 : q;  // excessively large digit
    866                 low  = (Bval.cmp( Mval ) < 0);
    867                 high = (Bval.add( Mval ).cmp( tenSval ) > 0 );
    868                 digits[ndigit++] = (char)('0' + q);
    869             }
    870             if ( high && low ){
    871                 Bval.lshiftMe(1);
    872                 lowDigitDifference = Bval.cmp(tenSval);
    873             } else
    874                 lowDigitDifference = 0L; // this here only for flow analysis!
    875         }
    876         this.decExponent = decExp+1;
    877         this.digits = digits;
    878         this.nDigits = ndigit;
    879         /*
    880          * Last digit gets rounded based on stopping condition.
    881          */
    882         if ( high ){
    883             if ( low ){
    884                 if ( lowDigitDifference == 0L ){
    885                     // it's a tie!
    886                     // choose based on which digits we like.
    887                     if ( (digits[nDigits-1]&1) != 0 ) roundup();
    888                 } else if ( lowDigitDifference > 0 ){
    889                     roundup();
    890                 }
    891             } else {
    892                 roundup();
    893             }
    894         }
    895     }
    896 
    897     public String
    898     toString(){
    899         // most brain-dead version
    900         StringBuffer result = new StringBuffer( nDigits+8 );
    901         if ( isNegative ){ result.append( '-' ); }
    902         if ( isExceptional ){
    903             result.append( digits, 0, nDigits );
    904         } else {
    905             result.append( "0.");
    906             result.append( digits, 0, nDigits );
    907             result.append('e');
    908             result.append( decExponent );
    909         }
    910         return new String(result);
    911     }
    912 
    913     public String toJavaFormatString() {
    914         char result[] = (char[])(perThreadBuffer.get());
    915         int i = getChars(result);
    916         return new String(result, 0, i);
    917     }
    918 
    919     private int getChars(char[] result) {
    920         assert nDigits <= 19 : nDigits; // generous bound on size of nDigits
    921         int i = 0;
    922         if (isNegative) { result[0] = '-'; i = 1; }
    923         if (isExceptional) {
    924             System.arraycopy(digits, 0, result, i, nDigits);
    925             i += nDigits;
    926         } else {
    927             if (decExponent > 0 && decExponent < 8) {
    928                 // case with digits.digits
    929                 int charLength = Math.min(nDigits, decExponent);
    930                 System.arraycopy(digits, 0, result, i, charLength);
    931                 i += charLength;
    932                 if (charLength < decExponent) {
    933                     charLength = decExponent-charLength;
    934                     System.arraycopy(zero, 0, result, i, charLength);
    935                     i += charLength;
    936                     result[i++] = '.';
    937                     result[i++] = '0';
    938                 } else {
    939                     result[i++] = '.';
    940                     if (charLength < nDigits) {
    941                         int t = nDigits - charLength;
    942                         System.arraycopy(digits, charLength, result, i, t);
    943                         i += t;
    944                     } else {
    945                         result[i++] = '0';
    946                     }
    947                 }
    948             } else if (decExponent <=0 && decExponent > -3) {
    949                 // case with 0.digits
    950                 result[i++] = '0';
    951                 result[i++] = '.';
    952                 if (decExponent != 0) {
    953                     System.arraycopy(zero, 0, result, i, -decExponent);
    954                     i -= decExponent;
    955                 }
    956                 System.arraycopy(digits, 0, result, i, nDigits);
    957                 i += nDigits;
    958             } else {
    959                 // case with digit.digitsEexponent
    960                 result[i++] = digits[0];
    961                 result[i++] = '.';
    962                 if (nDigits > 1) {
    963                     System.arraycopy(digits, 1, result, i, nDigits-1);
    964                     i += nDigits-1;
    965                 } else {
    966                     result[i++] = '0';
    967                 }
    968                 result[i++] = 'E';
    969                 int e;
    970                 if (decExponent <= 0) {
    971                     result[i++] = '-';
    972                     e = -decExponent+1;
    973                 } else {
    974                     e = decExponent-1;
    975                 }
    976                 // decExponent has 1, 2, or 3, digits
    977                 if (e <= 9) {
    978                     result[i++] = (char)(e+'0');
    979                 } else if (e <= 99) {
    980                     result[i++] = (char)(e/10 +'0');
    981                     result[i++] = (char)(e%10 + '0');
    982                 } else {
    983                     result[i++] = (char)(e/100+'0');
    984                     e %= 100;
    985                     result[i++] = (char)(e/10+'0');
    986                     result[i++] = (char)(e%10 + '0');
    987                 }
    988             }
    989         }
    990         return i;
    991     }
    992 
    993     // Per-thread buffer for string/stringbuffer conversion
    994     private static ThreadLocal perThreadBuffer = new ThreadLocal() {
    995             protected synchronized Object initialValue() {
    996                 return new char[26];
    997             }
    998         };
    999 
   1000     public void appendTo(AbstractStringBuilder buf) {
   1001         if (isNegative) { buf.append('-'); }
   1002         if (isExceptional) {
   1003             buf.append(digits, 0 , nDigits);
   1004             return;
   1005         }
   1006         if (decExponent > 0 && decExponent < 8) {
   1007             // print digits.digits.
   1008             int charLength = Math.min(nDigits, decExponent);
   1009             buf.append(digits, 0 , charLength);
   1010             if (charLength < decExponent) {
   1011                 charLength = decExponent-charLength;
   1012                 buf.append(zero, 0 , charLength);
   1013                 buf.append(".0");
   1014             } else {
   1015                 buf.append('.');
   1016                 if (charLength < nDigits) {
   1017                     buf.append(digits, charLength, nDigits - charLength);
   1018                 } else {
   1019                     buf.append('0');
   1020                 }
   1021             }
   1022         } else if (decExponent <=0 && decExponent > -3) {
   1023             buf.append("0.");
   1024             if (decExponent != 0) {
   1025                 buf.append(zero, 0, -decExponent);
   1026             }
   1027             buf.append(digits, 0, nDigits);
   1028         } else {
   1029             buf.append(digits[0]);
   1030             buf.append('.');
   1031             if (nDigits > 1) {
   1032                 buf.append(digits, 1, nDigits-1);
   1033             } else {
   1034                 buf.append('0');
   1035             }
   1036             buf.append('E');
   1037             int e;
   1038             if (decExponent <= 0) {
   1039                 buf.append('-');
   1040                 e = -decExponent + 1;
   1041             } else {
   1042                 e = decExponent - 1;
   1043             }
   1044             // decExponent has 1, 2, or 3, digits
   1045             if (e <= 9) {
   1046                 buf.append((char)(e + '0'));
   1047             } else if (e <= 99) {
   1048                 buf.append((char)(e/10 + '0'));
   1049                 buf.append((char)(e%10 + '0'));
   1050             } else {
   1051                 buf.append((char)(e/100 + '0'));
   1052                 e %= 100;
   1053                 buf.append((char)(e/10 + '0'));
   1054                 buf.append((char)(e%10 + '0'));
   1055             }
   1056         }
   1057     }
   1058 
   1059     public FloatingDecimal
   1060     readJavaFormatString( String in ) throws NumberFormatException {
   1061         boolean isNegative = false;
   1062         boolean signSeen   = false;
   1063         int     decExp;
   1064         char    c;
   1065 
   1066     parseNumber:
   1067         try{
   1068             in = in.trim(); // don't fool around with white space.
   1069                             // throws NullPointerException if null
   1070             int l = in.length();
   1071             if ( l == 0 ) throw new NumberFormatException("empty String");
   1072             int i = 0;
   1073             switch ( c = in.charAt( i ) ){
   1074             case '-':
   1075                 isNegative = true;
   1076                 //FALLTHROUGH
   1077             case '+':
   1078                 i++;
   1079                 signSeen = true;
   1080             }
   1081 
   1082             // Check for NaN and Infinity strings
   1083             c = in.charAt(i);
   1084             if(c == 'N' || c == 'I') { // possible NaN or infinity
   1085                 boolean potentialNaN = false;
   1086                 char targetChars[] = null;  // char array of "NaN" or "Infinity"
   1087 
   1088                 if(c == 'N') {
   1089                     targetChars = notANumber;
   1090                     potentialNaN = true;
   1091                 } else {
   1092                     targetChars = infinity;
   1093                 }
   1094 
   1095                 // compare Input string to "NaN" or "Infinity"
   1096                 int j = 0;
   1097                 while(i < l && j < targetChars.length) {
   1098                     if(in.charAt(i) == targetChars[j]) {
   1099                         i++; j++;
   1100                     }
   1101                     else // something is amiss, throw exception
   1102                         break parseNumber;
   1103                 }
   1104 
   1105                 // For the candidate string to be a NaN or infinity,
   1106                 // all characters in input string and target char[]
   1107                 // must be matched ==> j must equal targetChars.length
   1108                 // and i must equal l
   1109                 if( (j == targetChars.length) && (i == l) ) { // return NaN or infinity
   1110                     return (potentialNaN ? loadDouble(Double.NaN) // NaN has no sign
   1111                             : loadDouble(isNegative?
   1112                                                   Double.NEGATIVE_INFINITY:
   1113                                                   Double.POSITIVE_INFINITY)) ;
   1114                 }
   1115                 else { // something went wrong, throw exception
   1116                     break parseNumber;
   1117                 }
   1118 
   1119             } else if (c == '0')  { // check for hexadecimal floating-point number
   1120                 if (l > i+1 ) {
   1121                     char ch = in.charAt(i+1);
   1122                     if (ch == 'x' || ch == 'X' ) // possible hex string
   1123                         return parseHexString(in);
   1124                 }
   1125             }  // look for and process decimal floating-point string
   1126 
   1127             char[] digits = new char[ l ];
   1128             int    nDigits= 0;
   1129             boolean decSeen = false;
   1130             int decPt = 0;
   1131             int nLeadZero = 0;
   1132             int nTrailZero= 0;
   1133         digitLoop:
   1134             while ( i < l ){
   1135                 switch ( c = in.charAt( i ) ){
   1136                 case '0':
   1137                     if ( nDigits > 0 ){
   1138                         nTrailZero += 1;
   1139                     } else {
   1140                         nLeadZero += 1;
   1141                     }
   1142                     break; // out of switch.
   1143                 case '1':
   1144                 case '2':
   1145                 case '3':
   1146                 case '4':
   1147                 case '5':
   1148                 case '6':
   1149                 case '7':
   1150                 case '8':
   1151                 case '9':
   1152                     while ( nTrailZero > 0 ){
   1153                         digits[nDigits++] = '0';
   1154                         nTrailZero -= 1;
   1155                     }
   1156                     digits[nDigits++] = c;
   1157                     break; // out of switch.
   1158                 case '.':
   1159                     if ( decSeen ){
   1160                         // already saw one ., this is the 2nd.
   1161                         throw new NumberFormatException("multiple points");
   1162                     }
   1163                     decPt = i;
   1164                     if ( signSeen ){
   1165                         decPt -= 1;
   1166                     }
   1167                     decSeen = true;
   1168                     break; // out of switch.
   1169                 default:
   1170                     break digitLoop;
   1171                 }
   1172                 i++;
   1173             }
   1174             /*
   1175              * At this point, we've scanned all the digits and decimal
   1176              * point we're going to see. Trim off leading and trailing
   1177              * zeros, which will just confuse us later, and adjust
   1178              * our initial decimal exponent accordingly.
   1179              * To review:
   1180              * we have seen i total characters.
   1181              * nLeadZero of them were zeros before any other digits.
   1182              * nTrailZero of them were zeros after any other digits.
   1183              * if ( decSeen ), then a . was seen after decPt characters
   1184              * ( including leading zeros which have been discarded )
   1185              * nDigits characters were neither lead nor trailing
   1186              * zeros, nor point
   1187              */
   1188             /*
   1189              * special hack: if we saw no non-zero digits, then the
   1190              * answer is zero!
   1191              * Unfortunately, we feel honor-bound to keep parsing!
   1192              */
   1193             if ( nDigits == 0 ){
   1194                 digits = zero;
   1195                 nDigits = 1;
   1196                 if ( nLeadZero == 0 ){
   1197                     // we saw NO DIGITS AT ALL,
   1198                     // not even a crummy 0!
   1199                     // this is not allowed.
   1200                     break parseNumber; // go throw exception
   1201                 }
   1202 
   1203             }
   1204 
   1205             /* Our initial exponent is decPt, adjusted by the number of
   1206              * discarded zeros. Or, if there was no decPt,
   1207              * then its just nDigits adjusted by discarded trailing zeros.
   1208              */
   1209             if ( decSeen ){
   1210                 decExp = decPt - nLeadZero;
   1211             } else {
   1212                 decExp = nDigits+nTrailZero;
   1213             }
   1214 
   1215             /*
   1216              * Look for 'e' or 'E' and an optionally signed integer.
   1217              */
   1218             if ( (i < l) &&  (((c = in.charAt(i) )=='e') || (c == 'E') ) ){
   1219                 int expSign = 1;
   1220                 int expVal  = 0;
   1221                 int reallyBig = Integer.MAX_VALUE / 10;
   1222                 boolean expOverflow = false;
   1223                 switch( in.charAt(++i) ){
   1224                 case '-':
   1225                     expSign = -1;
   1226                     //FALLTHROUGH
   1227                 case '+':
   1228                     i++;
   1229                 }
   1230                 int expAt = i;
   1231             expLoop:
   1232                 while ( i < l  ){
   1233                     if ( expVal >= reallyBig ){
   1234                         // the next character will cause integer
   1235                         // overflow.
   1236                         expOverflow = true;
   1237                     }
   1238                     switch ( c = in.charAt(i++) ){
   1239                     case '0':
   1240                     case '1':
   1241                     case '2':
   1242                     case '3':
   1243                     case '4':
   1244                     case '5':
   1245                     case '6':
   1246                     case '7':
   1247                     case '8':
   1248                     case '9':
   1249                         expVal = expVal*10 + ( (int)c - (int)'0' );
   1250                         continue;
   1251                     default:
   1252                         i--;           // back up.
   1253                         break expLoop; // stop parsing exponent.
   1254                     }
   1255                 }
   1256                 int expLimit = bigDecimalExponent+nDigits+nTrailZero;
   1257                 if ( expOverflow || ( expVal > expLimit ) ){
   1258                     //
   1259                     // The intent here is to end up with
   1260                     // infinity or zero, as appropriate.
   1261                     // The reason for yielding such a small decExponent,
   1262                     // rather than something intuitive such as
   1263                     // expSign*Integer.MAX_VALUE, is that this value
   1264                     // is subject to further manipulation in
   1265                     // doubleValue() and floatValue(), and I don't want
   1266                     // it to be able to cause overflow there!
   1267                     // (The only way we can get into trouble here is for
   1268                     // really outrageous nDigits+nTrailZero, such as 2 billion. )
   1269                     //
   1270                     decExp = expSign*expLimit;
   1271                 } else {
   1272                     // this should not overflow, since we tested
   1273                     // for expVal > (MAX+N), where N >= abs(decExp)
   1274                     decExp = decExp + expSign*expVal;
   1275                 }
   1276 
   1277                 // if we saw something not a digit ( or end of string )
   1278                 // after the [Ee][+-], without seeing any digits at all
   1279                 // this is certainly an error. If we saw some digits,
   1280                 // but then some trailing garbage, that might be ok.
   1281                 // so we just fall through in that case.
   1282                 // HUMBUG
   1283                 if ( i == expAt )
   1284                     break parseNumber; // certainly bad
   1285             }
   1286             /*
   1287              * We parsed everything we could.
   1288              * If there are leftovers, then this is not good input!
   1289              */
   1290             if ( i < l &&
   1291                 ((i != l - 1) ||
   1292                 (in.charAt(i) != 'f' &&
   1293                  in.charAt(i) != 'F' &&
   1294                  in.charAt(i) != 'd' &&
   1295                  in.charAt(i) != 'D'))) {
   1296                 break parseNumber; // go throw exception
   1297             }
   1298 
   1299             this.isNegative = isNegative;
   1300             this.decExponent = decExp;
   1301             this.digits = digits;
   1302             this.nDigits = nDigits;
   1303             this.isExceptional = false;
   1304             return this;
   1305         } catch ( StringIndexOutOfBoundsException e ){ }
   1306         throw new NumberFormatException("For input string: \"" + in + "\"");
   1307     }
   1308 
   1309     /*
   1310      * Take a FloatingDecimal, which we presumably just scanned in,
   1311      * and find out what its value is, as a double.
   1312      *
   1313      * AS A SIDE EFFECT, SET roundDir TO INDICATE PREFERRED
   1314      * ROUNDING DIRECTION in case the result is really destined
   1315      * for a single-precision float.
   1316      */
   1317 
   1318     public strictfp double doubleValue(){
   1319         int     kDigits = Math.min( nDigits, maxDecimalDigits+1 );
   1320         long    lValue;
   1321         double  dValue;
   1322         double  rValue, tValue;
   1323 
   1324         // First, check for NaN and Infinity values
   1325         if(digits == infinity || digits == notANumber) {
   1326             if(digits == notANumber)
   1327                 return Double.NaN;
   1328             else
   1329                 return (isNegative?Double.NEGATIVE_INFINITY:Double.POSITIVE_INFINITY);
   1330         }
   1331         else {
   1332             if (mustSetRoundDir) {
   1333                 roundDir = 0;
   1334             }
   1335             /*
   1336              * convert the lead kDigits to a long integer.
   1337              */
   1338             // (special performance hack: start to do it using int)
   1339             int iValue = (int)digits[0]-(int)'0';
   1340             int iDigits = Math.min( kDigits, intDecimalDigits );
   1341             for ( int i=1; i < iDigits; i++ ){
   1342                 iValue = iValue*10 + (int)digits[i]-(int)'0';
   1343             }
   1344             lValue = (long)iValue;
   1345             for ( int i=iDigits; i < kDigits; i++ ){
   1346                 lValue = lValue*10L + (long)((int)digits[i]-(int)'0');
   1347             }
   1348             dValue = (double)lValue;
   1349             int exp = decExponent-kDigits;
   1350             /*
   1351              * lValue now contains a long integer with the value of
   1352              * the first kDigits digits of the number.
   1353              * dValue contains the (double) of the same.
   1354              */
   1355 
   1356             if ( nDigits <= maxDecimalDigits ){
   1357                 /*
   1358                  * possibly an easy case.
   1359                  * We know that the digits can be represented
   1360                  * exactly. And if the exponent isn't too outrageous,
   1361                  * the whole thing can be done with one operation,
   1362                  * thus one rounding error.
   1363                  * Note that all our constructors trim all leading and
   1364                  * trailing zeros, so simple values (including zero)
   1365                  * will always end up here
   1366                  */
   1367                 if (exp == 0 || dValue == 0.0)
   1368                     return (isNegative)? -dValue : dValue; // small floating integer
   1369                 else if ( exp >= 0 ){
   1370                     if ( exp <= maxSmallTen ){
   1371                         /*
   1372                          * Can get the answer with one operation,
   1373                          * thus one roundoff.
   1374                          */
   1375                         rValue = dValue * small10pow[exp];
   1376                         if ( mustSetRoundDir ){
   1377                             tValue = rValue / small10pow[exp];
   1378                             roundDir = ( tValue ==  dValue ) ? 0
   1379                                 :( tValue < dValue ) ? 1
   1380                                 : -1;
   1381                         }
   1382                         return (isNegative)? -rValue : rValue;
   1383                     }
   1384                     int slop = maxDecimalDigits - kDigits;
   1385                     if ( exp <= maxSmallTen+slop ){
   1386                         /*
   1387                          * We can multiply dValue by 10^(slop)
   1388                          * and it is still "small" and exact.
   1389                          * Then we can multiply by 10^(exp-slop)
   1390                          * with one rounding.
   1391                          */
   1392                         dValue *= small10pow[slop];
   1393                         rValue = dValue * small10pow[exp-slop];
   1394 
   1395                         if ( mustSetRoundDir ){
   1396                             tValue = rValue / small10pow[exp-slop];
   1397                             roundDir = ( tValue ==  dValue ) ? 0
   1398                                 :( tValue < dValue ) ? 1
   1399                                 : -1;
   1400                         }
   1401                         return (isNegative)? -rValue : rValue;
   1402                     }
   1403                     /*
   1404                      * Else we have a hard case with a positive exp.
   1405                      */
   1406                 } else {
   1407                     if ( exp >= -maxSmallTen ){
   1408                         /*
   1409                          * Can get the answer in one division.
   1410                          */
   1411                         rValue = dValue / small10pow[-exp];
   1412                         tValue = rValue * small10pow[-exp];
   1413                         if ( mustSetRoundDir ){
   1414                             roundDir = ( tValue ==  dValue ) ? 0
   1415                                 :( tValue < dValue ) ? 1
   1416                                 : -1;
   1417                         }
   1418                         return (isNegative)? -rValue : rValue;
   1419                     }
   1420                     /*
   1421                      * Else we have a hard case with a negative exp.
   1422                      */
   1423                 }
   1424             }
   1425 
   1426             /*
   1427              * Harder cases:
   1428              * The sum of digits plus exponent is greater than
   1429              * what we think we can do with one error.
   1430              *
   1431              * Start by approximating the right answer by,
   1432              * naively, scaling by powers of 10.
   1433              */
   1434             if ( exp > 0 ){
   1435                 if ( decExponent > maxDecimalExponent+1 ){
   1436                     /*
   1437                      * Lets face it. This is going to be
   1438                      * Infinity. Cut to the chase.
   1439                      */
   1440                     return (isNegative)? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
   1441                 }
   1442                 if ( (exp&15) != 0 ){
   1443                     dValue *= small10pow[exp&15];
   1444                 }
   1445                 if ( (exp>>=4) != 0 ){
   1446                     int j;
   1447                     for( j = 0; exp > 1; j++, exp>>=1 ){
   1448                         if ( (exp&1)!=0)
   1449                             dValue *= big10pow[j];
   1450                     }
   1451                     /*
   1452                      * The reason for the weird exp > 1 condition
   1453                      * in the above loop was so that the last multiply
   1454                      * would get unrolled. We handle it here.
   1455                      * It could overflow.
   1456                      */
   1457                     double t = dValue * big10pow[j];
   1458                     if ( Double.isInfinite( t ) ){
   1459                         /*
   1460                          * It did overflow.
   1461                          * Look more closely at the result.
   1462                          * If the exponent is just one too large,
   1463                          * then use the maximum finite as our estimate
   1464                          * value. Else call the result infinity
   1465                          * and punt it.
   1466                          * ( I presume this could happen because
   1467                          * rounding forces the result here to be
   1468                          * an ULP or two larger than
   1469                          * Double.MAX_VALUE ).
   1470                          */
   1471                         t = dValue / 2.0;
   1472                         t *= big10pow[j];
   1473                         if ( Double.isInfinite( t ) ){
   1474                             return (isNegative)? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
   1475                         }
   1476                         t = Double.MAX_VALUE;
   1477                     }
   1478                     dValue = t;
   1479                 }
   1480             } else if ( exp < 0 ){
   1481                 exp = -exp;
   1482                 if ( decExponent < minDecimalExponent-1 ){
   1483                     /*
   1484                      * Lets face it. This is going to be
   1485                      * zero. Cut to the chase.
   1486                      */
   1487                     return (isNegative)? -0.0 : 0.0;
   1488                 }
   1489                 if ( (exp&15) != 0 ){
   1490                     dValue /= small10pow[exp&15];
   1491                 }
   1492                 if ( (exp>>=4) != 0 ){
   1493                     int j;
   1494                     for( j = 0; exp > 1; j++, exp>>=1 ){
   1495                         if ( (exp&1)!=0)
   1496                             dValue *= tiny10pow[j];
   1497                     }
   1498                     /*
   1499                      * The reason for the weird exp > 1 condition
   1500                      * in the above loop was so that the last multiply
   1501                      * would get unrolled. We handle it here.
   1502                      * It could underflow.
   1503                      */
   1504                     double t = dValue * tiny10pow[j];
   1505                     if ( t == 0.0 ){
   1506                         /*
   1507                          * It did underflow.
   1508                          * Look more closely at the result.
   1509                          * If the exponent is just one too small,
   1510                          * then use the minimum finite as our estimate
   1511                          * value. Else call the result 0.0
   1512                          * and punt it.
   1513                          * ( I presume this could happen because
   1514                          * rounding forces the result here to be
   1515                          * an ULP or two less than
   1516                          * Double.MIN_VALUE ).
   1517                          */
   1518                         t = dValue * 2.0;
   1519                         t *= tiny10pow[j];
   1520                         if ( t == 0.0 ){
   1521                             return (isNegative)? -0.0 : 0.0;
   1522                         }
   1523                         t = Double.MIN_VALUE;
   1524                     }
   1525                     dValue = t;
   1526                 }
   1527             }
   1528 
   1529             /*
   1530              * dValue is now approximately the result.
   1531              * The hard part is adjusting it, by comparison
   1532              * with FDBigInt arithmetic.
   1533              * Formulate the EXACT big-number result as
   1534              * bigD0 * 10^exp
   1535              */
   1536             FDBigInt bigD0 = new FDBigInt( lValue, digits, kDigits, nDigits );
   1537             exp   = decExponent - nDigits;
   1538 
   1539             correctionLoop:
   1540             while(true){
   1541                 /* AS A SIDE EFFECT, THIS METHOD WILL SET THE INSTANCE VARIABLES
   1542                  * bigIntExp and bigIntNBits
   1543                  */
   1544                 FDBigInt bigB = doubleToBigInt( dValue );
   1545 
   1546                 /*
   1547                  * Scale bigD, bigB appropriately for
   1548                  * big-integer operations.
   1549                  * Naively, we multiply by powers of ten
   1550                  * and powers of two. What we actually do
   1551                  * is keep track of the powers of 5 and
   1552                  * powers of 2 we would use, then factor out
   1553                  * common divisors before doing the work.
   1554                  */
   1555                 int B2, B5; // powers of 2, 5 in bigB
   1556                 int     D2, D5; // powers of 2, 5 in bigD
   1557                 int Ulp2;   // powers of 2 in halfUlp.
   1558                 if ( exp >= 0 ){
   1559                     B2 = B5 = 0;
   1560                     D2 = D5 = exp;
   1561                 } else {
   1562                     B2 = B5 = -exp;
   1563                     D2 = D5 = 0;
   1564                 }
   1565                 if ( bigIntExp >= 0 ){
   1566                     B2 += bigIntExp;
   1567                 } else {
   1568                     D2 -= bigIntExp;
   1569                 }
   1570                 Ulp2 = B2;
   1571                 // shift bigB and bigD left by a number s. t.
   1572                 // halfUlp is still an integer.
   1573                 int hulpbias;
   1574                 if ( bigIntExp+bigIntNBits <= -expBias+1 ){
   1575                     // This is going to be a denormalized number
   1576                     // (if not actually zero).
   1577                     // half an ULP is at 2^-(expBias+expShift+1)
   1578                     hulpbias = bigIntExp+ expBias + expShift;
   1579                 } else {
   1580                     hulpbias = expShift + 2 - bigIntNBits;
   1581                 }
   1582                 B2 += hulpbias;
   1583                 D2 += hulpbias;
   1584                 // if there are common factors of 2, we might just as well
   1585                 // factor them out, as they add nothing useful.
   1586                 int common2 = Math.min( B2, Math.min( D2, Ulp2 ) );
   1587                 B2 -= common2;
   1588                 D2 -= common2;
   1589                 Ulp2 -= common2;
   1590                 // do multiplications by powers of 5 and 2
   1591                 bigB = multPow52( bigB, B5, B2 );
   1592                 FDBigInt bigD = multPow52( new FDBigInt( bigD0 ), D5, D2 );
   1593                 //
   1594                 // to recap:
   1595                 // bigB is the scaled-big-int version of our floating-point
   1596                 // candidate.
   1597                 // bigD is the scaled-big-int version of the exact value
   1598                 // as we understand it.
   1599                 // halfUlp is 1/2 an ulp of bigB, except for special cases
   1600                 // of exact powers of 2
   1601                 //
   1602                 // the plan is to compare bigB with bigD, and if the difference
   1603                 // is less than halfUlp, then we're satisfied. Otherwise,
   1604                 // use the ratio of difference to halfUlp to calculate a fudge
   1605                 // factor to add to the floating value, then go 'round again.
   1606                 //
   1607                 FDBigInt diff;
   1608                 int cmpResult;
   1609                 boolean overvalue;
   1610                 if ( (cmpResult = bigB.cmp( bigD ) ) > 0 ){
   1611                     overvalue = true; // our candidate is too big.
   1612                     diff = bigB.sub( bigD );
   1613                     if ( (bigIntNBits == 1) && (bigIntExp > -expBias+1) ){
   1614                         // candidate is a normalized exact power of 2 and
   1615                         // is too big. We will be subtracting.
   1616                         // For our purposes, ulp is the ulp of the
   1617                         // next smaller range.
   1618                         Ulp2 -= 1;
   1619                         if ( Ulp2 < 0 ){
   1620                             // rats. Cannot de-scale ulp this far.
   1621                             // must scale diff in other direction.
   1622                             Ulp2 = 0;
   1623                             diff.lshiftMe( 1 );
   1624                         }
   1625                     }
   1626                 } else if ( cmpResult < 0 ){
   1627                     overvalue = false; // our candidate is too small.
   1628                     diff = bigD.sub( bigB );
   1629                 } else {
   1630                     // the candidate is exactly right!
   1631                     // this happens with surprising frequency
   1632                     break correctionLoop;
   1633                 }
   1634                 FDBigInt halfUlp = constructPow52( B5, Ulp2 );
   1635                 if ( (cmpResult = diff.cmp( halfUlp ) ) < 0 ){
   1636                     // difference is small.
   1637                     // this is close enough
   1638                     if (mustSetRoundDir) {
   1639                         roundDir = overvalue ? -1 : 1;
   1640                     }
   1641                     break correctionLoop;
   1642                 } else if ( cmpResult == 0 ){
   1643                     // difference is exactly half an ULP
   1644                     // round to some other value maybe, then finish
   1645                     dValue += 0.5*ulp( dValue, overvalue );
   1646                     // should check for bigIntNBits == 1 here??
   1647                     if (mustSetRoundDir) {
   1648                         roundDir = overvalue ? -1 : 1;
   1649                     }
   1650                     break correctionLoop;
   1651                 } else {
   1652                     // difference is non-trivial.
   1653                     // could scale addend by ratio of difference to
   1654                     // halfUlp here, if we bothered to compute that difference.
   1655                     // Most of the time ( I hope ) it is about 1 anyway.
   1656                     dValue += ulp( dValue, overvalue );
   1657                     if ( dValue == 0.0 || dValue == Double.POSITIVE_INFINITY )
   1658                         break correctionLoop; // oops. Fell off end of range.
   1659                     continue; // try again.
   1660                 }
   1661 
   1662             }
   1663             return (isNegative)? -dValue : dValue;
   1664         }
   1665     }
   1666 
   1667     /*
   1668      * Take a FloatingDecimal, which we presumably just scanned in,
   1669      * and find out what its value is, as a float.
   1670      * This is distinct from doubleValue() to avoid the extremely
   1671      * unlikely case of a double rounding error, wherein the conversion
   1672      * to double has one rounding error, and the conversion of that double
   1673      * to a float has another rounding error, IN THE WRONG DIRECTION,
   1674      * ( because of the preference to a zero low-order bit ).
   1675      */
   1676 
   1677     public strictfp float floatValue(){
   1678         int     kDigits = Math.min( nDigits, singleMaxDecimalDigits+1 );
   1679         int     iValue;
   1680         float   fValue;
   1681 
   1682         // First, check for NaN and Infinity values
   1683         if(digits == infinity || digits == notANumber) {
   1684             if(digits == notANumber)
   1685                 return Float.NaN;
   1686             else
   1687                 return (isNegative?Float.NEGATIVE_INFINITY:Float.POSITIVE_INFINITY);
   1688         }
   1689         else {
   1690             /*
   1691              * convert the lead kDigits to an integer.
   1692              */
   1693             iValue = (int)digits[0]-(int)'0';
   1694             for ( int i=1; i < kDigits; i++ ){
   1695                 iValue = iValue*10 + (int)digits[i]-(int)'0';
   1696             }
   1697             fValue = (float)iValue;
   1698             int exp = decExponent-kDigits;
   1699             /*
   1700              * iValue now contains an integer with the value of
   1701              * the first kDigits digits of the number.
   1702              * fValue contains the (float) of the same.
   1703              */
   1704 
   1705             if ( nDigits <= singleMaxDecimalDigits ){
   1706                 /*
   1707                  * possibly an easy case.
   1708                  * We know that the digits can be represented
   1709                  * exactly. And if the exponent isn't too outrageous,
   1710                  * the whole thing can be done with one operation,
   1711                  * thus one rounding error.
   1712                  * Note that all our constructors trim all leading and
   1713                  * trailing zeros, so simple values (including zero)
   1714                  * will always end up here.
   1715                  */
   1716                 if (exp == 0 || fValue == 0.0f)
   1717                     return (isNegative)? -fValue : fValue; // small floating integer
   1718                 else if ( exp >= 0 ){
   1719                     if ( exp <= singleMaxSmallTen ){
   1720                         /*
   1721                          * Can get the answer with one operation,
   1722                          * thus one roundoff.
   1723                          */
   1724                         fValue *= singleSmall10pow[exp];
   1725                         return (isNegative)? -fValue : fValue;
   1726                     }
   1727                     int slop = singleMaxDecimalDigits - kDigits;
   1728                     if ( exp <= singleMaxSmallTen+slop ){
   1729                         /*
   1730                          * We can multiply dValue by 10^(slop)
   1731                          * and it is still "small" and exact.
   1732                          * Then we can multiply by 10^(exp-slop)
   1733                          * with one rounding.
   1734                          */
   1735                         fValue *= singleSmall10pow[slop];
   1736                         fValue *= singleSmall10pow[exp-slop];
   1737                         return (isNegative)? -fValue : fValue;
   1738                     }
   1739                     /*
   1740                      * Else we have a hard case with a positive exp.
   1741                      */
   1742                 } else {
   1743                     if ( exp >= -singleMaxSmallTen ){
   1744                         /*
   1745                          * Can get the answer in one division.
   1746                          */
   1747                         fValue /= singleSmall10pow[-exp];
   1748                         return (isNegative)? -fValue : fValue;
   1749                     }
   1750                     /*
   1751                      * Else we have a hard case with a negative exp.
   1752                      */
   1753                 }
   1754             } else if ( (decExponent >= nDigits) && (nDigits+decExponent <= maxDecimalDigits) ){
   1755                 /*
   1756                  * In double-precision, this is an exact floating integer.
   1757                  * So we can compute to double, then shorten to float
   1758                  * with one round, and get the right answer.
   1759                  *
   1760                  * First, finish accumulating digits.
   1761                  * Then convert that integer to a double, multiply
   1762                  * by the appropriate power of ten, and convert to float.
   1763                  */
   1764                 long lValue = (long)iValue;
   1765                 for ( int i=kDigits; i < nDigits; i++ ){
   1766                     lValue = lValue*10L + (long)((int)digits[i]-(int)'0');
   1767                 }
   1768                 double dValue = (double)lValue;
   1769                 exp = decExponent-nDigits;
   1770                 dValue *= small10pow[exp];
   1771                 fValue = (float)dValue;
   1772                 return (isNegative)? -fValue : fValue;
   1773 
   1774             }
   1775             /*
   1776              * Harder cases:
   1777              * The sum of digits plus exponent is greater than
   1778              * what we think we can do with one error.
   1779              *
   1780              * Start by weeding out obviously out-of-range
   1781              * results, then convert to double and go to
   1782              * common hard-case code.
   1783              */
   1784             if ( decExponent > singleMaxDecimalExponent+1 ){
   1785                 /*
   1786                  * Lets face it. This is going to be
   1787                  * Infinity. Cut to the chase.
   1788                  */
   1789                 return (isNegative)? Float.NEGATIVE_INFINITY : Float.POSITIVE_INFINITY;
   1790             } else if ( decExponent < singleMinDecimalExponent-1 ){
   1791                 /*
   1792                  * Lets face it. This is going to be
   1793                  * zero. Cut to the chase.
   1794                  */
   1795                 return (isNegative)? -0.0f : 0.0f;
   1796             }
   1797 
   1798             /*
   1799              * Here, we do 'way too much work, but throwing away
   1800              * our partial results, and going and doing the whole
   1801              * thing as double, then throwing away half the bits that computes
   1802              * when we convert back to float.
   1803              *
   1804              * The alternative is to reproduce the whole multiple-precision
   1805              * algorithm for float precision, or to try to parameterize it
   1806              * for common usage. The former will take about 400 lines of code,
   1807              * and the latter I tried without success. Thus the semi-hack
   1808              * answer here.
   1809              */
   1810             mustSetRoundDir = !fromHex;
   1811             double dValue = doubleValue();
   1812             return stickyRound( dValue );
   1813         }
   1814     }
   1815 
   1816 
   1817     /*
   1818      * All the positive powers of 10 that can be
   1819      * represented exactly in double/float.
   1820      */
   1821     private static final double small10pow[] = {
   1822         1.0e0,
   1823         1.0e1, 1.0e2, 1.0e3, 1.0e4, 1.0e5,
   1824         1.0e6, 1.0e7, 1.0e8, 1.0e9, 1.0e10,
   1825         1.0e11, 1.0e12, 1.0e13, 1.0e14, 1.0e15,
   1826         1.0e16, 1.0e17, 1.0e18, 1.0e19, 1.0e20,
   1827         1.0e21, 1.0e22
   1828     };
   1829 
   1830     private static final float singleSmall10pow[] = {
   1831         1.0e0f,
   1832         1.0e1f, 1.0e2f, 1.0e3f, 1.0e4f, 1.0e5f,
   1833         1.0e6f, 1.0e7f, 1.0e8f, 1.0e9f, 1.0e10f
   1834     };
   1835 
   1836     private static final double big10pow[] = {
   1837         1e16, 1e32, 1e64, 1e128, 1e256 };
   1838     private static final double tiny10pow[] = {
   1839         1e-16, 1e-32, 1e-64, 1e-128, 1e-256 };
   1840 
   1841     private static final int maxSmallTen = small10pow.length-1;
   1842     private static final int singleMaxSmallTen = singleSmall10pow.length-1;
   1843 
   1844     private static final int small5pow[] = {
   1845         1,
   1846         5,
   1847         5*5,
   1848         5*5*5,
   1849         5*5*5*5,
   1850         5*5*5*5*5,
   1851         5*5*5*5*5*5,
   1852         5*5*5*5*5*5*5,
   1853         5*5*5*5*5*5*5*5,
   1854         5*5*5*5*5*5*5*5*5,
   1855         5*5*5*5*5*5*5*5*5*5,
   1856         5*5*5*5*5*5*5*5*5*5*5,
   1857         5*5*5*5*5*5*5*5*5*5*5*5,
   1858         5*5*5*5*5*5*5*5*5*5*5*5*5
   1859     };
   1860 
   1861 
   1862     private static final long long5pow[] = {
   1863         1L,
   1864         5L,
   1865         5L*5,
   1866         5L*5*5,
   1867         5L*5*5*5,
   1868         5L*5*5*5*5,
   1869         5L*5*5*5*5*5,
   1870         5L*5*5*5*5*5*5,
   1871         5L*5*5*5*5*5*5*5,
   1872         5L*5*5*5*5*5*5*5*5,
   1873         5L*5*5*5*5*5*5*5*5*5,
   1874         5L*5*5*5*5*5*5*5*5*5*5,
   1875         5L*5*5*5*5*5*5*5*5*5*5*5,
   1876         5L*5*5*5*5*5*5*5*5*5*5*5*5,
   1877         5L*5*5*5*5*5*5*5*5*5*5*5*5*5,
   1878         5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
   1879         5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
   1880         5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
   1881         5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
   1882         5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
   1883         5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
   1884         5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
   1885         5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
   1886         5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
   1887         5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
   1888         5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
   1889         5L*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5,
   1890     };
   1891 
   1892     // approximately ceil( log2( long5pow[i] ) )
   1893     private static final int n5bits[] = {
   1894         0,
   1895         3,
   1896         5,
   1897         7,
   1898         10,
   1899         12,
   1900         14,
   1901         17,
   1902         19,
   1903         21,
   1904         24,
   1905         26,
   1906         28,
   1907         31,
   1908         33,
   1909         35,
   1910         38,
   1911         40,
   1912         42,
   1913         45,
   1914         47,
   1915         49,
   1916         52,
   1917         54,
   1918         56,
   1919         59,
   1920         61,
   1921     };
   1922 
   1923     private static final char infinity[] = { 'I', 'n', 'f', 'i', 'n', 'i', 't', 'y' };
   1924     private static final char notANumber[] = { 'N', 'a', 'N' };
   1925     private static final char zero[] = { '0', '0', '0', '0', '0', '0', '0', '0' };
   1926 
   1927 
   1928     /*
   1929      * Grammar is compatible with hexadecimal floating-point constants
   1930      * described in section 6.4.4.2 of the C99 specification.
   1931      */
   1932     private static Pattern hexFloatPattern = null;
   1933     private static synchronized Pattern getHexFloatPattern() {
   1934         if (hexFloatPattern == null) {
   1935            hexFloatPattern = Pattern.compile(
   1936                    //1           234                   56                7                   8      9
   1937                     "([-+])?0[xX](((\\p{XDigit}+)\\.?)|((\\p{XDigit}*)\\.(\\p{XDigit}+)))[pP]([-+])?(\\p{Digit}+)[fFdD]?"
   1938                     );
   1939         }
   1940         return hexFloatPattern;
   1941     }
   1942 
   1943     /*
   1944      * Convert string s to a suitable floating decimal; uses the
   1945      * double constructor and set the roundDir variable appropriately
   1946      * in case the value is later converted to a float.
   1947      */
   1948     FloatingDecimal parseHexString(String s) {
   1949         // Verify string is a member of the hexadecimal floating-point
   1950         // string language.
   1951         Matcher m = getHexFloatPattern().matcher(s);
   1952         boolean validInput = m.matches();
   1953 
   1954         if (!validInput) {
   1955             // Input does not match pattern
   1956             throw new NumberFormatException("For input string: \"" + s + "\"");
   1957         } else { // validInput
   1958             /*
   1959              * We must isolate the sign, significand, and exponent
   1960              * fields.  The sign value is straightforward.  Since
   1961              * floating-point numbers are stored with a normalized
   1962              * representation, the significand and exponent are
   1963              * interrelated.
   1964              *
   1965              * After extracting the sign, we normalized the
   1966              * significand as a hexadecimal value, calculating an
   1967              * exponent adjust for any shifts made during
   1968              * normalization.  If the significand is zero, the
   1969              * exponent doesn't need to be examined since the output
   1970              * will be zero.
   1971              *
   1972              * Next the exponent in the input string is extracted.
   1973              * Afterwards, the significand is normalized as a *binary*
   1974              * value and the input value's normalized exponent can be
   1975              * computed.  The significand bits are copied into a
   1976              * double significand; if the string has more logical bits
   1977              * than can fit in a double, the extra bits affect the
   1978              * round and sticky bits which are used to round the final
   1979              * value.
   1980              */
   1981 
   1982             //  Extract significand sign
   1983             String group1 = m.group(1);
   1984             double sign = (( group1 == null ) || group1.equals("+"))? 1.0 : -1.0;
   1985 
   1986 
   1987             //  Extract Significand magnitude
   1988             /*
   1989              * Based on the form of the significand, calculate how the
   1990              * binary exponent needs to be adjusted to create a
   1991              * normalized *hexadecimal* floating-point number; that
   1992              * is, a number where there is one nonzero hex digit to
   1993              * the left of the (hexa)decimal point.  Since we are
   1994              * adjusting a binary, not hexadecimal exponent, the
   1995              * exponent is adjusted by a multiple of 4.
   1996              *
   1997              * There are a number of significand scenarios to consider;
   1998              * letters are used in indicate nonzero digits:
   1999              *
   2000              * 1. 000xxxx       =>      x.xxx   normalized
   2001              *    increase exponent by (number of x's - 1)*4
   2002              *
   2003              * 2. 000xxx.yyyy =>        x.xxyyyy        normalized
   2004              *    increase exponent by (number of x's - 1)*4
   2005              *
   2006              * 3. .000yyy  =>   y.yy    normalized
   2007              *    decrease exponent by (number of zeros + 1)*4
   2008              *
   2009              * 4. 000.00000yyy => y.yy normalized
   2010              *    decrease exponent by (number of zeros to right of point + 1)*4
   2011              *
   2012              * If the significand is exactly zero, return a properly
   2013              * signed zero.
   2014              */
   2015 
   2016             String significandString =null;
   2017             int signifLength = 0;
   2018             int exponentAdjust = 0;
   2019             {
   2020                 int leftDigits  = 0; // number of meaningful digits to
   2021                                      // left of "decimal" point
   2022                                      // (leading zeros stripped)
   2023                 int rightDigits = 0; // number of digits to right of
   2024                                      // "decimal" point; leading zeros
   2025                                      // must always be accounted for
   2026                 /*
   2027                  * The significand is made up of either
   2028                  *
   2029                  * 1. group 4 entirely (integer portion only)
   2030                  *
   2031                  * OR
   2032                  *
   2033                  * 2. the fractional portion from group 7 plus any
   2034                  * (optional) integer portions from group 6.
   2035                  */
   2036                 String group4;
   2037                 if( (group4 = m.group(4)) != null) {  // Integer-only significand
   2038                     // Leading zeros never matter on the integer portion
   2039                     significandString = stripLeadingZeros(group4);
   2040                     leftDigits = significandString.length();
   2041                 }
   2042                 else {
   2043                     // Group 6 is the optional integer; leading zeros
   2044                     // never matter on the integer portion
   2045                     String group6 = stripLeadingZeros(m.group(6));
   2046                     leftDigits = group6.length();
   2047 
   2048                     // fraction
   2049                     String group7 = m.group(7);
   2050                     rightDigits = group7.length();
   2051 
   2052                     // Turn "integer.fraction" into "integer"+"fraction"
   2053                     significandString =
   2054                         ((group6 == null)?"":group6) + // is the null
   2055                         // check necessary?
   2056                         group7;
   2057                 }
   2058 
   2059                 significandString = stripLeadingZeros(significandString);
   2060                 signifLength  = significandString.length();
   2061 
   2062                 /*
   2063                  * Adjust exponent as described above
   2064                  */
   2065                 if (leftDigits >= 1) {  // Cases 1 and 2
   2066                     exponentAdjust = 4*(leftDigits - 1);
   2067                 } else {                // Cases 3 and 4
   2068                     exponentAdjust = -4*( rightDigits - signifLength + 1);
   2069                 }
   2070 
   2071                 // If the significand is zero, the exponent doesn't
   2072                 // matter; return a properly signed zero.
   2073 
   2074                 if (signifLength == 0) { // Only zeros in input
   2075                     return loadDouble(sign * 0.0);
   2076                 }
   2077             }
   2078 
   2079             //  Extract Exponent
   2080             /*
   2081              * Use an int to read in the exponent value; this should
   2082              * provide more than sufficient range for non-contrived
   2083              * inputs.  If reading the exponent in as an int does
   2084              * overflow, examine the sign of the exponent and
   2085              * significand to determine what to do.
   2086              */
   2087             String group8 = m.group(8);
   2088             boolean positiveExponent = ( group8 == null ) || group8.equals("+");
   2089             long unsignedRawExponent;
   2090             try {
   2091                 unsignedRawExponent = Integer.parseInt(m.group(9));
   2092             }
   2093             catch (NumberFormatException e) {
   2094                 // At this point, we know the exponent is
   2095                 // syntactically well-formed as a sequence of
   2096                 // digits.  Therefore, if an NumberFormatException
   2097                 // is thrown, it must be due to overflowing int's
   2098                 // range.  Also, at this point, we have already
   2099                 // checked for a zero significand.  Thus the signs
   2100                 // of the exponent and significand determine the
   2101                 // final result:
   2102                 //
   2103                 //                      significand
   2104                 //                      +               -
   2105                 // exponent     +       +infinity       -infinity
   2106                 //              -       +0.0            -0.0
   2107                 return loadDouble(sign * (positiveExponent ?
   2108                                           Double.POSITIVE_INFINITY : 0.0));
   2109             }
   2110 
   2111             long rawExponent =
   2112                 (positiveExponent ? 1L : -1L) * // exponent sign
   2113                 unsignedRawExponent;            // exponent magnitude
   2114 
   2115             // Calculate partially adjusted exponent
   2116             long exponent = rawExponent + exponentAdjust ;
   2117 
   2118             // Starting copying non-zero bits into proper position in
   2119             // a long; copy explicit bit too; this will be masked
   2120             // later for normal values.
   2121 
   2122             boolean round = false;
   2123             boolean sticky = false;
   2124             int bitsCopied=0;
   2125             int nextShift=0;
   2126             long significand=0L;
   2127             // First iteration is different, since we only copy
   2128             // from the leading significand bit; one more exponent
   2129             // adjust will be needed...
   2130 
   2131             // IMPORTANT: make leadingDigit a long to avoid
   2132             // surprising shift semantics!
   2133             long leadingDigit = getHexDigit(significandString, 0);
   2134 
   2135             /*
   2136              * Left shift the leading digit (53 - (bit position of
   2137              * leading 1 in digit)); this sets the top bit of the
   2138              * significand to 1.  The nextShift value is adjusted
   2139              * to take into account the number of bit positions of
   2140              * the leadingDigit actually used.  Finally, the
   2141              * exponent is adjusted to normalize the significand
   2142              * as a binary value, not just a hex value.
   2143              */
   2144             if (leadingDigit == 1) {
   2145                 significand |= leadingDigit << 52;
   2146                 nextShift = 52 - 4;
   2147                 /* exponent += 0 */     }
   2148             else if (leadingDigit <= 3) { // [2, 3]
   2149                 significand |= leadingDigit << 51;
   2150                 nextShift = 52 - 5;
   2151                 exponent += 1;
   2152             }
   2153             else if (leadingDigit <= 7) { // [4, 7]
   2154                 significand |= leadingDigit << 50;
   2155                 nextShift = 52 - 6;
   2156                 exponent += 2;
   2157             }
   2158             else if (leadingDigit <= 15) { // [8, f]
   2159                 significand |= leadingDigit << 49;
   2160                 nextShift = 52 - 7;
   2161                 exponent += 3;
   2162             } else {
   2163                 throw new AssertionError("Result from digit conversion too large!");
   2164             }
   2165             // The preceding if-else could be replaced by a single
   2166             // code block based on the high-order bit set in
   2167             // leadingDigit.  Given leadingOnePosition,
   2168 
   2169             // significand |= leadingDigit << (SIGNIFICAND_WIDTH - leadingOnePosition);
   2170             // nextShift = 52 - (3 + leadingOnePosition);
   2171             // exponent += (leadingOnePosition-1);
   2172 
   2173 
   2174             /*
   2175              * Now the exponent variable is equal to the normalized
   2176              * binary exponent.  Code below will make representation
   2177              * adjustments if the exponent is incremented after
   2178              * rounding (includes overflows to infinity) or if the
   2179              * result is subnormal.
   2180              */
   2181 
   2182             // Copy digit into significand until the significand can't
   2183             // hold another full hex digit or there are no more input
   2184             // hex digits.
   2185             int i = 0;
   2186             for(i = 1;
   2187                 i < signifLength && nextShift >= 0;
   2188                 i++) {
   2189                 long currentDigit = getHexDigit(significandString, i);
   2190                 significand |= (currentDigit << nextShift);
   2191                 nextShift-=4;
   2192             }
   2193 
   2194             // After the above loop, the bulk of the string is copied.
   2195             // Now, we must copy any partial hex digits into the
   2196             // significand AND compute the round bit and start computing
   2197             // sticky bit.
   2198 
   2199             if ( i < signifLength ) { // at least one hex input digit exists
   2200                 long currentDigit = getHexDigit(significandString, i);
   2201 
   2202                 // from nextShift, figure out how many bits need
   2203                 // to be copied, if any
   2204                 switch(nextShift) { // must be negative
   2205                 case -1:
   2206                     // three bits need to be copied in; can
   2207                     // set round bit
   2208                     significand |= ((currentDigit & 0xEL) >> 1);
   2209                     round = (currentDigit & 0x1L)  != 0L;
   2210                     break;
   2211 
   2212                 case -2:
   2213                     // two bits need to be copied in; can
   2214                     // set round and start sticky
   2215                     significand |= ((currentDigit & 0xCL) >> 2);
   2216                     round = (currentDigit &0x2L)  != 0L;
   2217                     sticky = (currentDigit & 0x1L) != 0;
   2218                     break;
   2219 
   2220                 case -3:
   2221                     // one bit needs to be copied in
   2222                     significand |= ((currentDigit & 0x8L)>>3);
   2223                     // Now set round and start sticky, if possible
   2224                     round = (currentDigit &0x4L)  != 0L;
   2225                     sticky = (currentDigit & 0x3L) != 0;
   2226                     break;
   2227 
   2228                 case -4:
   2229                     // all bits copied into significand; set
   2230                     // round and start sticky
   2231                     round = ((currentDigit & 0x8L) != 0);  // is top bit set?
   2232                     // nonzeros in three low order bits?
   2233                     sticky = (currentDigit & 0x7L) != 0;
   2234                     break;
   2235 
   2236                 default:
   2237                     throw new AssertionError("Unexpected shift distance remainder.");
   2238                     // break;
   2239                 }
   2240 
   2241                 // Round is set; sticky might be set.
   2242 
   2243                 // For the sticky bit, it suffices to check the
   2244                 // current digit and test for any nonzero digits in
   2245                 // the remaining unprocessed input.
   2246                 i++;
   2247                 while(i < signifLength && !sticky) {
   2248                     currentDigit =  getHexDigit(significandString,i);
   2249                     sticky = sticky || (currentDigit != 0);
   2250                     i++;
   2251                 }
   2252 
   2253             }
   2254             // else all of string was seen, round and sticky are
   2255             // correct as false.
   2256 
   2257 
   2258             // Check for overflow and update exponent accordingly.
   2259 
   2260             if (exponent > DoubleConsts.MAX_EXPONENT) {         // Infinite result
   2261                 // overflow to properly signed infinity
   2262                 return loadDouble(sign * Double.POSITIVE_INFINITY);
   2263             } else {  // Finite return value
   2264                 if (exponent <= DoubleConsts.MAX_EXPONENT && // (Usually) normal result
   2265                     exponent >= DoubleConsts.MIN_EXPONENT) {
   2266 
   2267                     // The result returned in this block cannot be a
   2268                     // zero or subnormal; however after the
   2269                     // significand is adjusted from rounding, we could
   2270                     // still overflow in infinity.
   2271 
   2272                     // AND exponent bits into significand; if the
   2273                     // significand is incremented and overflows from
   2274                     // rounding, this combination will update the
   2275                     // exponent correctly, even in the case of
   2276                     // Double.MAX_VALUE overflowing to infinity.
   2277 
   2278                     significand = (( ((long)exponent +
   2279                                      (long)DoubleConsts.EXP_BIAS) <<
   2280                                      (DoubleConsts.SIGNIFICAND_WIDTH-1))
   2281                                    & DoubleConsts.EXP_BIT_MASK) |
   2282                         (DoubleConsts.SIGNIF_BIT_MASK & significand);
   2283 
   2284                 }  else  {  // Subnormal or zero
   2285                     // (exponent < DoubleConsts.MIN_EXPONENT)
   2286 
   2287                     if (exponent < (DoubleConsts.MIN_SUB_EXPONENT -1 )) {
   2288                         // No way to round back to nonzero value
   2289                         // regardless of significand if the exponent is
   2290                         // less than -1075.
   2291                         return loadDouble(sign * 0.0);
   2292                     } else { //  -1075 <= exponent <= MIN_EXPONENT -1 = -1023
   2293                         /*
   2294                          * Find bit position to round to; recompute
   2295                          * round and sticky bits, and shift
   2296                          * significand right appropriately.
   2297                          */
   2298 
   2299                         sticky = sticky || round;
   2300                         round = false;
   2301 
   2302                         // Number of bits of significand to preserve is
   2303                         // exponent - abs_min_exp +1
   2304                         // check:
   2305                         // -1075 +1074 + 1 = 0
   2306                         // -1023 +1074 + 1 = 52
   2307 
   2308                         int bitsDiscarded = 53 -
   2309                             ((int)exponent - DoubleConsts.MIN_SUB_EXPONENT + 1);
   2310                         assert bitsDiscarded >= 1 && bitsDiscarded <= 53;
   2311 
   2312                         // What to do here:
   2313                         // First, isolate the new round bit
   2314                         round = (significand & (1L << (bitsDiscarded -1))) != 0L;
   2315                         if (bitsDiscarded > 1) {
   2316                             // create mask to update sticky bits; low
   2317                             // order bitsDiscarded bits should be 1
   2318                             long mask = ~((~0L) << (bitsDiscarded -1));
   2319                             sticky = sticky || ((significand & mask) != 0L ) ;
   2320                         }
   2321 
   2322                         // Now, discard the bits
   2323                         significand = significand >> bitsDiscarded;
   2324 
   2325                         significand = (( ((long)(DoubleConsts.MIN_EXPONENT -1) + // subnorm exp.
   2326                                           (long)DoubleConsts.EXP_BIAS) <<
   2327                                          (DoubleConsts.SIGNIFICAND_WIDTH-1))
   2328                                        & DoubleConsts.EXP_BIT_MASK) |
   2329                             (DoubleConsts.SIGNIF_BIT_MASK & significand);
   2330                     }
   2331                 }
   2332 
   2333                 // The significand variable now contains the currently
   2334                 // appropriate exponent bits too.
   2335 
   2336                 /*
   2337                  * Determine if significand should be incremented;
   2338                  * making this determination depends on the least
   2339                  * significant bit and the round and sticky bits.
   2340                  *
   2341                  * Round to nearest even rounding table, adapted from
   2342                  * table 4.7 in "Computer Arithmetic" by IsraelKoren.
   2343                  * The digit to the left of the "decimal" point is the
   2344                  * least significant bit, the digits to the right of
   2345                  * the point are the round and sticky bits
   2346                  *
   2347                  * Number       Round(x)
   2348                  * x0.00        x0.
   2349                  * x0.01        x0.
   2350                  * x0.10        x0.
   2351                  * x0.11        x1. = x0. +1
   2352                  * x1.00        x1.
   2353                  * x1.01        x1.
   2354                  * x1.10        x1. + 1
   2355                  * x1.11        x1. + 1
   2356                  */
   2357                 boolean incremented = false;
   2358                 boolean leastZero  = ((significand & 1L) == 0L);
   2359                 if( (  leastZero  && round && sticky ) ||
   2360                     ((!leastZero) && round )) {
   2361                     incremented = true;
   2362                     significand++;
   2363                 }
   2364 
   2365                 loadDouble(FpUtils.rawCopySign(
   2366                                                Double.longBitsToDouble(significand),
   2367                                                sign));
   2368 
   2369                 /*
   2370                  * Set roundingDir variable field of fd properly so
   2371                  * that the input string can be properly rounded to a
   2372                  * float value.  There are two cases to consider:
   2373                  *
   2374                  * 1. rounding to double discards sticky bit
   2375                  * information that would change the result of a float
   2376                  * rounding (near halfway case between two floats)
   2377                  *
   2378                  * 2. rounding to double rounds up when rounding up
   2379                  * would not occur when rounding to float.
   2380                  *
   2381                  * For former case only needs to be considered when
   2382                  * the bits rounded away when casting to float are all
   2383                  * zero; otherwise, float round bit is properly set
   2384                  * and sticky will already be true.
   2385                  *
   2386                  * The lower exponent bound for the code below is the
   2387                  * minimum (normalized) subnormal exponent - 1 since a
   2388                  * value with that exponent can round up to the
   2389                  * minimum subnormal value and the sticky bit
   2390                  * information must be preserved (i.e. case 1).
   2391                  */
   2392                 if ((exponent >= FloatConsts.MIN_SUB_EXPONENT-1) &&
   2393                     (exponent <= FloatConsts.MAX_EXPONENT ) ){
   2394                     // Outside above exponent range, the float value
   2395                     // will be zero or infinity.
   2396 
   2397                     /*
   2398                      * If the low-order 28 bits of a rounded double
   2399                      * significand are 0, the double could be a
   2400                      * half-way case for a rounding to float.  If the
   2401                      * double value is a half-way case, the double
   2402                      * significand may have to be modified to round
   2403                      * the the right float value (see the stickyRound
   2404                      * method).  If the rounding to double has lost
   2405                      * what would be float sticky bit information, the
   2406                      * double significand must be incremented.  If the
   2407                      * double value's significand was itself
   2408                      * incremented, the float value may end up too
   2409                      * large so the increment should be undone.
   2410                      */
   2411                     if ((significand & 0xfffffffL) ==  0x0L) {
   2412                         // For negative values, the sign of the
   2413                         // roundDir is the same as for positive values
   2414                         // since adding 1 increasing the significand's
   2415                         // magnitude and subtracting 1 decreases the
   2416                         // significand's magnitude.  If neither round
   2417                         // nor sticky is true, the double value is
   2418                         // exact and no adjustment is required for a
   2419                         // proper float rounding.
   2420                         if( round || sticky) {
   2421                             if (leastZero) { // prerounding lsb is 0
   2422                                 // If round and sticky were both true,
   2423                                 // and the least significant
   2424                                 // significand bit were 0, the rounded
   2425                                 // significand would not have its
   2426                                 // low-order bits be zero.  Therefore,
   2427                                 // we only need to adjust the
   2428                                 // significand if round XOR sticky is
   2429                                 // true.
   2430                                 if (round ^ sticky) {
   2431                                     this.roundDir =  1;
   2432                                 }
   2433                             }
   2434                             else { // prerounding lsb is 1
   2435                                 // If the prerounding lsb is 1 and the
   2436                                 // resulting significand has its
   2437                                 // low-order bits zero, the significand
   2438                                 // was incremented.  Here, we undo the
   2439                                 // increment, which will ensure the
   2440                                 // right guard and sticky bits for the
   2441                                 // float rounding.
   2442                                 if (round)
   2443                                     this.roundDir =  -1;
   2444                             }
   2445                         }
   2446                     }
   2447                 }
   2448 
   2449                 this.fromHex = true;
   2450                 return this;
   2451             }
   2452         }
   2453     }
   2454 
   2455     /**
   2456      * Return <code>s</code> with any leading zeros removed.
   2457      */
   2458     static String stripLeadingZeros(String s) {
   2459         return  s.replaceFirst("^0+", "");
   2460     }
   2461 
   2462     /**
   2463      * Extract a hexadecimal digit from position <code>position</code>
   2464      * of string <code>s</code>.
   2465      */
   2466     static int getHexDigit(String s, int position) {
   2467         int value = Character.digit(s.charAt(position), 16);
   2468         if (value <= -1 || value >= 16) {
   2469             throw new AssertionError("Unexpected failure of digit conversion of " +
   2470                                      s.charAt(position));
   2471         }
   2472         return value;
   2473     }
   2474 
   2475 
   2476 }
   2477