Home | History | Annotate | Download | only in util
      1 /*
      2  * Licensed to the Apache Software Foundation (ASF) under one or more
      3  * contributor license agreements.  See the NOTICE file distributed with
      4  * this work for additional information regarding copyright ownership.
      5  * The ASF licenses this file to You under the Apache License, Version 2.0
      6  * (the "License"); you may not use this file except in compliance with
      7  * the License.  You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 package org.apache.commons.math.util;
     18 
     19 /**
     20  * Faster, more accurate, portable alternative to {@link StrictMath}.
     21  * <p>
     22  * Additionally implements the following methods not found in StrictMath:
     23  * <ul>
     24  * <li>{@link #asinh(double)}</li>
     25  * <li>{@link #acosh(double)}</li>
     26  * <li>{@link #atanh(double)}</li>
     27  * </ul>
     28  * The following methods are found in StrictMath since 1.6 only
     29  * <ul>
     30  * <li>{@link #copySign(double, double)}</li>
     31  * <li>{@link #getExponent(double)}</li>
     32  * <li>{@link #nextAfter(double,double)}</li>
     33  * <li>{@link #nextUp(double)}</li>
     34  * <li>{@link #scalb(double, int)}</li>
     35  * <li>{@link #copySign(float, float)}</li>
     36  * <li>{@link #getExponent(float)}</li>
     37  * <li>{@link #nextAfter(float,double)}</li>
     38  * <li>{@link #nextUp(float)}</li>
     39  * <li>{@link #scalb(float, int)}</li>
     40  * </ul>
     41  * @version $Revision: 1074294 $ $Date: 2011-02-24 22:18:59 +0100 (jeu. 24 fvr. 2011) $
     42  * @since 2.2
     43  */
     44 public class FastMath {
     45 
     46     /** Archimede's constant PI, ratio of circle circumference to diameter. */
     47     public static final double PI = 105414357.0 / 33554432.0 + 1.984187159361080883e-9;
     48 
     49     /** Napier's constant e, base of the natural logarithm. */
     50     public static final double E = 2850325.0 / 1048576.0 + 8.254840070411028747e-8;
     51 
     52     /** Exponential evaluated at integer values,
     53      * exp(x) =  expIntTableA[x + 750] + expIntTableB[x+750].
     54      */
     55     private static final double EXP_INT_TABLE_A[] = new double[1500];
     56 
     57     /** Exponential evaluated at integer values,
     58      * exp(x) =  expIntTableA[x + 750] + expIntTableB[x+750]
     59      */
     60     private static final double EXP_INT_TABLE_B[] = new double[1500];
     61 
     62     /** Exponential over the range of 0 - 1 in increments of 2^-10
     63      * exp(x/1024) =  expFracTableA[x] + expFracTableB[x].
     64      */
     65     private static final double EXP_FRAC_TABLE_A[] = new double[1025];
     66 
     67     /** Exponential over the range of 0 - 1 in increments of 2^-10
     68      * exp(x/1024) =  expFracTableA[x] + expFracTableB[x].
     69      */
     70     private static final double EXP_FRAC_TABLE_B[] = new double[1025];
     71 
     72     /** Factorial table, for Taylor series expansions. */
     73     private static final double FACT[] = new double[20];
     74 
     75     /** Extended precision logarithm table over the range 1 - 2 in increments of 2^-10. */
     76     private static final double LN_MANT[][] = new double[1024][];
     77 
     78     /** log(2) (high bits). */
     79     private static final double LN_2_A = 0.693147063255310059;
     80 
     81     /** log(2) (low bits). */
     82     private static final double LN_2_B = 1.17304635250823482e-7;
     83 
     84     /** Coefficients for slowLog. */
     85     private static final double LN_SPLIT_COEF[][] = {
     86         {2.0, 0.0},
     87         {0.6666666269302368, 3.9736429850260626E-8},
     88         {0.3999999761581421, 2.3841857910019882E-8},
     89         {0.2857142686843872, 1.7029898543501842E-8},
     90         {0.2222222089767456, 1.3245471311735498E-8},
     91         {0.1818181574344635, 2.4384203044354907E-8},
     92         {0.1538461446762085, 9.140260083262505E-9},
     93         {0.13333332538604736, 9.220590270857665E-9},
     94         {0.11764700710773468, 1.2393345855018391E-8},
     95         {0.10526403784751892, 8.251545029714408E-9},
     96         {0.0952233225107193, 1.2675934823758863E-8},
     97         {0.08713622391223907, 1.1430250008909141E-8},
     98         {0.07842259109020233, 2.404307984052299E-9},
     99         {0.08371849358081818, 1.176342548272881E-8},
    100         {0.030589580535888672, 1.2958646899018938E-9},
    101         {0.14982303977012634, 1.225743062930824E-8},
    102     };
    103 
    104     /** Coefficients for log, when input 0.99 < x < 1.01. */
    105     private static final double LN_QUICK_COEF[][] = {
    106         {1.0, 5.669184079525E-24},
    107         {-0.25, -0.25},
    108         {0.3333333134651184, 1.986821492305628E-8},
    109         {-0.25, -6.663542893624021E-14},
    110         {0.19999998807907104, 1.1921056801463227E-8},
    111         {-0.1666666567325592, -7.800414592973399E-9},
    112         {0.1428571343421936, 5.650007086920087E-9},
    113         {-0.12502530217170715, -7.44321345601866E-11},
    114         {0.11113807559013367, 9.219544613762692E-9},
    115     };
    116 
    117     /** Coefficients for log in the range of 1.0 < x < 1.0 + 2^-10. */
    118     private static final double LN_HI_PREC_COEF[][] = {
    119         {1.0, -6.032174644509064E-23},
    120         {-0.25, -0.25},
    121         {0.3333333134651184, 1.9868161777724352E-8},
    122         {-0.2499999701976776, -2.957007209750105E-8},
    123         {0.19999954104423523, 1.5830993332061267E-10},
    124         {-0.16624879837036133, -2.6033824355191673E-8}
    125     };
    126 
    127     /** Sine table (high bits). */
    128     private static final double SINE_TABLE_A[] = new double[14];
    129 
    130     /** Sine table (low bits). */
    131     private static final double SINE_TABLE_B[] = new double[14];
    132 
    133     /** Cosine table (high bits). */
    134     private static final double COSINE_TABLE_A[] = new double[14];
    135 
    136     /** Cosine table (low bits). */
    137     private static final double COSINE_TABLE_B[] = new double[14];
    138 
    139     /** Tangent table, used by atan() (high bits). */
    140     private static final double TANGENT_TABLE_A[] = new double[14];
    141 
    142     /** Tangent table, used by atan() (low bits). */
    143     private static final double TANGENT_TABLE_B[] = new double[14];
    144 
    145     /** Bits of 1/(2*pi), need for reducePayneHanek(). */
    146     private static final long RECIP_2PI[] = new long[] {
    147         (0x28be60dbL << 32) | 0x9391054aL,
    148         (0x7f09d5f4L << 32) | 0x7d4d3770L,
    149         (0x36d8a566L << 32) | 0x4f10e410L,
    150         (0x7f9458eaL << 32) | 0xf7aef158L,
    151         (0x6dc91b8eL << 32) | 0x909374b8L,
    152         (0x01924bbaL << 32) | 0x82746487L,
    153         (0x3f877ac7L << 32) | 0x2c4a69cfL,
    154         (0xba208d7dL << 32) | 0x4baed121L,
    155         (0x3a671c09L << 32) | 0xad17df90L,
    156         (0x4e64758eL << 32) | 0x60d4ce7dL,
    157         (0x272117e2L << 32) | 0xef7e4a0eL,
    158         (0xc7fe25ffL << 32) | 0xf7816603L,
    159         (0xfbcbc462L << 32) | 0xd6829b47L,
    160         (0xdb4d9fb3L << 32) | 0xc9f2c26dL,
    161         (0xd3d18fd9L << 32) | 0xa797fa8bL,
    162         (0x5d49eeb1L << 32) | 0xfaf97c5eL,
    163         (0xcf41ce7dL << 32) | 0xe294a4baL,
    164          0x9afed7ecL << 32  };
    165 
    166     /** Bits of pi/4, need for reducePayneHanek(). */
    167     private static final long PI_O_4_BITS[] = new long[] {
    168         (0xc90fdaa2L << 32) | 0x2168c234L,
    169         (0xc4c6628bL << 32) | 0x80dc1cd1L };
    170 
    171     /** Eighths.
    172      * This is used by sinQ, because its faster to do a table lookup than
    173      * a multiply in this time-critical routine
    174      */
    175     private static final double EIGHTHS[] = {0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0, 1.125, 1.25, 1.375, 1.5, 1.625};
    176 
    177     /** Table of 2^((n+2)/3) */
    178     private static final double CBRTTWO[] = { 0.6299605249474366,
    179                                             0.7937005259840998,
    180                                             1.0,
    181                                             1.2599210498948732,
    182                                             1.5874010519681994 };
    183 
    184     /*
    185      *  There are 52 bits in the mantissa of a double.
    186      *  For additional precision, the code splits double numbers into two parts,
    187      *  by clearing the low order 30 bits if possible, and then performs the arithmetic
    188      *  on each half separately.
    189      */
    190 
    191     /**
    192      * 0x40000000 - used to split a double into two parts, both with the low order bits cleared.
    193      * Equivalent to 2^30.
    194      */
    195     private static final long HEX_40000000 = 0x40000000L; // 1073741824L
    196 
    197     /** Mask used to clear low order 30 bits */
    198     private static final long MASK_30BITS = -1L - (HEX_40000000 -1); // 0xFFFFFFFFC0000000L;
    199 
    200     /** 2^52 - double numbers this large must be integral (no fraction) or NaN or Infinite */
    201     private static final double TWO_POWER_52 = 4503599627370496.0;
    202 
    203     // Initialize tables
    204     static {
    205         int i;
    206 
    207         // Generate an array of factorials
    208         FACT[0] = 1.0;
    209         for (i = 1; i < FACT.length; i++) {
    210             FACT[i] = FACT[i-1] * i;
    211         }
    212 
    213         double tmp[] = new double[2];
    214         double recip[] = new double[2];
    215 
    216         // Populate expIntTable
    217         for (i = 0; i < 750; i++) {
    218             expint(i, tmp);
    219             EXP_INT_TABLE_A[i+750] = tmp[0];
    220             EXP_INT_TABLE_B[i+750] = tmp[1];
    221 
    222             if (i != 0) {
    223                 // Negative integer powers
    224                 splitReciprocal(tmp, recip);
    225                 EXP_INT_TABLE_A[750-i] = recip[0];
    226                 EXP_INT_TABLE_B[750-i] = recip[1];
    227             }
    228         }
    229 
    230         // Populate expFracTable
    231         for (i = 0; i < EXP_FRAC_TABLE_A.length; i++) {
    232             slowexp(i/1024.0, tmp);
    233             EXP_FRAC_TABLE_A[i] = tmp[0];
    234             EXP_FRAC_TABLE_B[i] = tmp[1];
    235         }
    236 
    237         // Populate lnMant table
    238         for (i = 0; i < LN_MANT.length; i++) {
    239             double d = Double.longBitsToDouble( (((long) i) << 42) | 0x3ff0000000000000L );
    240             LN_MANT[i] = slowLog(d);
    241         }
    242 
    243         // Build the sine and cosine tables
    244         buildSinCosTables();
    245     }
    246 
    247     /**
    248      * Private Constructor
    249      */
    250     private FastMath() {
    251     }
    252 
    253     // Generic helper methods
    254 
    255     /**
    256      * Get the high order bits from the mantissa.
    257      * Equivalent to adding and subtracting HEX_40000 but also works for very large numbers
    258      *
    259      * @param d the value to split
    260      * @return the high order part of the mantissa
    261      */
    262     private static double doubleHighPart(double d) {
    263         if (d > -MathUtils.SAFE_MIN && d < MathUtils.SAFE_MIN){
    264             return d; // These are un-normalised - don't try to convert
    265         }
    266         long xl = Double.doubleToLongBits(d);
    267         xl = xl & MASK_30BITS; // Drop low order bits
    268         return Double.longBitsToDouble(xl);
    269     }
    270 
    271     /** Compute the square root of a number.
    272      * <p><b>Note:</b> this implementation currently delegates to {@link Math#sqrt}
    273      * @param a number on which evaluation is done
    274      * @return square root of a
    275      */
    276     public static double sqrt(final double a) {
    277         return Math.sqrt(a);
    278     }
    279 
    280     /** Compute the hyperbolic cosine of a number.
    281      * @param x number on which evaluation is done
    282      * @return hyperbolic cosine of x
    283      */
    284     public static double cosh(double x) {
    285       if (x != x) {
    286           return x;
    287       }
    288 
    289       if (x > 20.0) {
    290           return exp(x)/2.0;
    291       }
    292 
    293       if (x < -20) {
    294           return exp(-x)/2.0;
    295       }
    296 
    297       double hiPrec[] = new double[2];
    298       if (x < 0.0) {
    299           x = -x;
    300       }
    301       exp(x, 0.0, hiPrec);
    302 
    303       double ya = hiPrec[0] + hiPrec[1];
    304       double yb = -(ya - hiPrec[0] - hiPrec[1]);
    305 
    306       double temp = ya * HEX_40000000;
    307       double yaa = ya + temp - temp;
    308       double yab = ya - yaa;
    309 
    310       // recip = 1/y
    311       double recip = 1.0/ya;
    312       temp = recip * HEX_40000000;
    313       double recipa = recip + temp - temp;
    314       double recipb = recip - recipa;
    315 
    316       // Correct for rounding in division
    317       recipb += (1.0 - yaa*recipa - yaa*recipb - yab*recipa - yab*recipb) * recip;
    318       // Account for yb
    319       recipb += -yb * recip * recip;
    320 
    321       // y = y + 1/y
    322       temp = ya + recipa;
    323       yb += -(temp - ya - recipa);
    324       ya = temp;
    325       temp = ya + recipb;
    326       yb += -(temp - ya - recipb);
    327       ya = temp;
    328 
    329       double result = ya + yb;
    330       result *= 0.5;
    331       return result;
    332     }
    333 
    334     /** Compute the hyperbolic sine of a number.
    335      * @param x number on which evaluation is done
    336      * @return hyperbolic sine of x
    337      */
    338     public static double sinh(double x) {
    339       boolean negate = false;
    340       if (x != x) {
    341           return x;
    342       }
    343 
    344       if (x > 20.0) {
    345           return exp(x)/2.0;
    346       }
    347 
    348       if (x < -20) {
    349           return -exp(-x)/2.0;
    350       }
    351 
    352       if (x == 0) {
    353           return x;
    354       }
    355 
    356       if (x < 0.0) {
    357           x = -x;
    358           negate = true;
    359       }
    360 
    361       double result;
    362 
    363       if (x > 0.25) {
    364           double hiPrec[] = new double[2];
    365           exp(x, 0.0, hiPrec);
    366 
    367           double ya = hiPrec[0] + hiPrec[1];
    368           double yb = -(ya - hiPrec[0] - hiPrec[1]);
    369 
    370           double temp = ya * HEX_40000000;
    371           double yaa = ya + temp - temp;
    372           double yab = ya - yaa;
    373 
    374           // recip = 1/y
    375           double recip = 1.0/ya;
    376           temp = recip * HEX_40000000;
    377           double recipa = recip + temp - temp;
    378           double recipb = recip - recipa;
    379 
    380           // Correct for rounding in division
    381           recipb += (1.0 - yaa*recipa - yaa*recipb - yab*recipa - yab*recipb) * recip;
    382           // Account for yb
    383           recipb += -yb * recip * recip;
    384 
    385           recipa = -recipa;
    386           recipb = -recipb;
    387 
    388           // y = y + 1/y
    389           temp = ya + recipa;
    390           yb += -(temp - ya - recipa);
    391           ya = temp;
    392           temp = ya + recipb;
    393           yb += -(temp - ya - recipb);
    394           ya = temp;
    395 
    396           result = ya + yb;
    397           result *= 0.5;
    398       }
    399       else {
    400           double hiPrec[] = new double[2];
    401           expm1(x, hiPrec);
    402 
    403           double ya = hiPrec[0] + hiPrec[1];
    404           double yb = -(ya - hiPrec[0] - hiPrec[1]);
    405 
    406           /* Compute expm1(-x) = -expm1(x) / (expm1(x) + 1) */
    407           double denom = 1.0 + ya;
    408           double denomr = 1.0 / denom;
    409           double denomb = -(denom - 1.0 - ya) + yb;
    410           double ratio = ya * denomr;
    411           double temp = ratio * HEX_40000000;
    412           double ra = ratio + temp - temp;
    413           double rb = ratio - ra;
    414 
    415           temp = denom * HEX_40000000;
    416           double za = denom + temp - temp;
    417           double zb = denom - za;
    418 
    419           rb += (ya - za*ra - za*rb - zb*ra - zb*rb) * denomr;
    420 
    421           // Adjust for yb
    422           rb += yb*denomr;                        // numerator
    423           rb += -ya * denomb * denomr * denomr;   // denominator
    424 
    425           // y = y - 1/y
    426           temp = ya + ra;
    427           yb += -(temp - ya - ra);
    428           ya = temp;
    429           temp = ya + rb;
    430           yb += -(temp - ya - rb);
    431           ya = temp;
    432 
    433           result = ya + yb;
    434           result *= 0.5;
    435       }
    436 
    437       if (negate) {
    438           result = -result;
    439       }
    440 
    441       return result;
    442     }
    443 
    444     /** Compute the hyperbolic tangent of a number.
    445      * @param x number on which evaluation is done
    446      * @return hyperbolic tangent of x
    447      */
    448     public static double tanh(double x) {
    449       boolean negate = false;
    450 
    451       if (x != x) {
    452           return x;
    453       }
    454 
    455       if (x > 20.0) {
    456           return 1.0;
    457       }
    458 
    459       if (x < -20) {
    460           return -1.0;
    461       }
    462 
    463       if (x == 0) {
    464           return x;
    465       }
    466 
    467       if (x < 0.0) {
    468           x = -x;
    469           negate = true;
    470       }
    471 
    472       double result;
    473       if (x >= 0.5) {
    474           double hiPrec[] = new double[2];
    475           // tanh(x) = (exp(2x) - 1) / (exp(2x) + 1)
    476           exp(x*2.0, 0.0, hiPrec);
    477 
    478           double ya = hiPrec[0] + hiPrec[1];
    479           double yb = -(ya - hiPrec[0] - hiPrec[1]);
    480 
    481           /* Numerator */
    482           double na = -1.0 + ya;
    483           double nb = -(na + 1.0 - ya);
    484           double temp = na + yb;
    485           nb += -(temp - na - yb);
    486           na = temp;
    487 
    488           /* Denominator */
    489           double da = 1.0 + ya;
    490           double db = -(da - 1.0 - ya);
    491           temp = da + yb;
    492           db += -(temp - da - yb);
    493           da = temp;
    494 
    495           temp = da * HEX_40000000;
    496           double daa = da + temp - temp;
    497           double dab = da - daa;
    498 
    499           // ratio = na/da
    500           double ratio = na/da;
    501           temp = ratio * HEX_40000000;
    502           double ratioa = ratio + temp - temp;
    503           double ratiob = ratio - ratioa;
    504 
    505           // Correct for rounding in division
    506           ratiob += (na - daa*ratioa - daa*ratiob - dab*ratioa - dab*ratiob) / da;
    507 
    508           // Account for nb
    509           ratiob += nb / da;
    510           // Account for db
    511           ratiob += -db * na / da / da;
    512 
    513           result = ratioa + ratiob;
    514       }
    515       else {
    516           double hiPrec[] = new double[2];
    517           // tanh(x) = expm1(2x) / (expm1(2x) + 2)
    518           expm1(x*2.0, hiPrec);
    519 
    520           double ya = hiPrec[0] + hiPrec[1];
    521           double yb = -(ya - hiPrec[0] - hiPrec[1]);
    522 
    523           /* Numerator */
    524           double na = ya;
    525           double nb = yb;
    526 
    527           /* Denominator */
    528           double da = 2.0 + ya;
    529           double db = -(da - 2.0 - ya);
    530           double temp = da + yb;
    531           db += -(temp - da - yb);
    532           da = temp;
    533 
    534           temp = da * HEX_40000000;
    535           double daa = da + temp - temp;
    536           double dab = da - daa;
    537 
    538           // ratio = na/da
    539           double ratio = na/da;
    540           temp = ratio * HEX_40000000;
    541           double ratioa = ratio + temp - temp;
    542           double ratiob = ratio - ratioa;
    543 
    544           // Correct for rounding in division
    545           ratiob += (na - daa*ratioa - daa*ratiob - dab*ratioa - dab*ratiob) / da;
    546 
    547           // Account for nb
    548           ratiob += nb / da;
    549           // Account for db
    550           ratiob += -db * na / da / da;
    551 
    552           result = ratioa + ratiob;
    553       }
    554 
    555       if (negate) {
    556           result = -result;
    557       }
    558 
    559       return result;
    560     }
    561 
    562     /** Compute the inverse hyperbolic cosine of a number.
    563      * @param a number on which evaluation is done
    564      * @return inverse hyperbolic cosine of a
    565      */
    566     public static double acosh(final double a) {
    567         return FastMath.log(a + FastMath.sqrt(a * a - 1));
    568     }
    569 
    570     /** Compute the inverse hyperbolic sine of a number.
    571      * @param a number on which evaluation is done
    572      * @return inverse hyperbolic sine of a
    573      */
    574     public static double asinh(double a) {
    575 
    576         boolean negative = false;
    577         if (a < 0) {
    578             negative = true;
    579             a = -a;
    580         }
    581 
    582         double absAsinh;
    583         if (a > 0.167) {
    584             absAsinh = FastMath.log(FastMath.sqrt(a * a + 1) + a);
    585         } else {
    586             final double a2 = a * a;
    587             if (a > 0.097) {
    588                 absAsinh = a * (1 - a2 * (1 / 3.0 - a2 * (1 / 5.0 - a2 * (1 / 7.0 - a2 * (1 / 9.0 - a2 * (1.0 / 11.0 - a2 * (1.0 / 13.0 - a2 * (1.0 / 15.0 - a2 * (1.0 / 17.0) * 15.0 / 16.0) * 13.0 / 14.0) * 11.0 / 12.0) * 9.0 / 10.0) * 7.0 / 8.0) * 5.0 / 6.0) * 3.0 / 4.0) / 2.0);
    589             } else if (a > 0.036) {
    590                 absAsinh = a * (1 - a2 * (1 / 3.0 - a2 * (1 / 5.0 - a2 * (1 / 7.0 - a2 * (1 / 9.0 - a2 * (1.0 / 11.0 - a2 * (1.0 / 13.0) * 11.0 / 12.0) * 9.0 / 10.0) * 7.0 / 8.0) * 5.0 / 6.0) * 3.0 / 4.0) / 2.0);
    591             } else if (a > 0.0036) {
    592                 absAsinh = a * (1 - a2 * (1 / 3.0 - a2 * (1 / 5.0 - a2 * (1 / 7.0 - a2 * (1 / 9.0) * 7.0 / 8.0) * 5.0 / 6.0) * 3.0 / 4.0) / 2.0);
    593             } else {
    594                 absAsinh = a * (1 - a2 * (1 / 3.0 - a2 * (1 / 5.0) * 3.0 / 4.0) / 2.0);
    595             }
    596         }
    597 
    598         return negative ? -absAsinh : absAsinh;
    599 
    600     }
    601 
    602     /** Compute the inverse hyperbolic tangent of a number.
    603      * @param a number on which evaluation is done
    604      * @return inverse hyperbolic tangent of a
    605      */
    606     public static double atanh(double a) {
    607 
    608         boolean negative = false;
    609         if (a < 0) {
    610             negative = true;
    611             a = -a;
    612         }
    613 
    614         double absAtanh;
    615         if (a > 0.15) {
    616             absAtanh = 0.5 * FastMath.log((1 + a) / (1 - a));
    617         } else {
    618             final double a2 = a * a;
    619             if (a > 0.087) {
    620                 absAtanh = a * (1 + a2 * (1.0 / 3.0 + a2 * (1.0 / 5.0 + a2 * (1.0 / 7.0 + a2 * (1.0 / 9.0 + a2 * (1.0 / 11.0 + a2 * (1.0 / 13.0 + a2 * (1.0 / 15.0 + a2 * (1.0 / 17.0)))))))));
    621             } else if (a > 0.031) {
    622                 absAtanh = a * (1 + a2 * (1.0 / 3.0 + a2 * (1.0 / 5.0 + a2 * (1.0 / 7.0 + a2 * (1.0 / 9.0 + a2 * (1.0 / 11.0 + a2 * (1.0 / 13.0)))))));
    623             } else if (a > 0.003) {
    624                 absAtanh = a * (1 + a2 * (1.0 / 3.0 + a2 * (1.0 / 5.0 + a2 * (1.0 / 7.0 + a2 * (1.0 / 9.0)))));
    625             } else {
    626                 absAtanh = a * (1 + a2 * (1.0 / 3.0 + a2 * (1.0 / 5.0)));
    627             }
    628         }
    629 
    630         return negative ? -absAtanh : absAtanh;
    631 
    632     }
    633 
    634     /** Compute the signum of a number.
    635      * The signum is -1 for negative numbers, +1 for positive numbers and 0 otherwise
    636      * @param a number on which evaluation is done
    637      * @return -1.0, -0.0, +0.0, +1.0 or NaN depending on sign of a
    638      */
    639     public static double signum(final double a) {
    640         return (a < 0.0) ? -1.0 : ((a > 0.0) ? 1.0 : a); // return +0.0/-0.0/NaN depending on a
    641     }
    642 
    643     /** Compute the signum of a number.
    644      * The signum is -1 for negative numbers, +1 for positive numbers and 0 otherwise
    645      * @param a number on which evaluation is done
    646      * @return -1.0, -0.0, +0.0, +1.0 or NaN depending on sign of a
    647      */
    648     public static float signum(final float a) {
    649         return (a < 0.0f) ? -1.0f : ((a > 0.0f) ? 1.0f : a); // return +0.0/-0.0/NaN depending on a
    650     }
    651 
    652     /** Compute next number towards positive infinity.
    653      * @param a number to which neighbor should be computed
    654      * @return neighbor of a towards positive infinity
    655      */
    656     public static double nextUp(final double a) {
    657         return nextAfter(a, Double.POSITIVE_INFINITY);
    658     }
    659 
    660     /** Compute next number towards positive infinity.
    661      * @param a number to which neighbor should be computed
    662      * @return neighbor of a towards positive infinity
    663      */
    664     public static float nextUp(final float a) {
    665         return nextAfter(a, Float.POSITIVE_INFINITY);
    666     }
    667 
    668     /** Returns a pseudo-random number between 0.0 and 1.0.
    669      * <p><b>Note:</b> this implementation currently delegates to {@link Math#random}
    670      * @return a random number between 0.0 and 1.0
    671      */
    672     public static double random() {
    673         return Math.random();
    674     }
    675 
    676     /**
    677      * Exponential function.
    678      *
    679      * Computes exp(x), function result is nearly rounded.   It will be correctly
    680      * rounded to the theoretical value for 99.9% of input values, otherwise it will
    681      * have a 1 UPL error.
    682      *
    683      * Method:
    684      *    Lookup intVal = exp(int(x))
    685      *    Lookup fracVal = exp(int(x-int(x) / 1024.0) * 1024.0 );
    686      *    Compute z as the exponential of the remaining bits by a polynomial minus one
    687      *    exp(x) = intVal * fracVal * (1 + z)
    688      *
    689      * Accuracy:
    690      *    Calculation is done with 63 bits of precision, so result should be correctly
    691      *    rounded for 99.9% of input values, with less than 1 ULP error otherwise.
    692      *
    693      * @param x   a double
    694      * @return double e<sup>x</sup>
    695      */
    696     public static double exp(double x) {
    697         return exp(x, 0.0, null);
    698     }
    699 
    700     /**
    701      * Internal helper method for exponential function.
    702      * @param x original argument of the exponential function
    703      * @param extra extra bits of precision on input (To Be Confirmed)
    704      * @param hiPrec extra bits of precision on output (To Be Confirmed)
    705      * @return exp(x)
    706      */
    707     private static double exp(double x, double extra, double[] hiPrec) {
    708         double intPartA;
    709         double intPartB;
    710         int intVal;
    711 
    712         /* Lookup exp(floor(x)).
    713          * intPartA will have the upper 22 bits, intPartB will have the lower
    714          * 52 bits.
    715          */
    716         if (x < 0.0) {
    717             intVal = (int) -x;
    718 
    719             if (intVal > 746) {
    720                 if (hiPrec != null) {
    721                     hiPrec[0] = 0.0;
    722                     hiPrec[1] = 0.0;
    723                 }
    724                 return 0.0;
    725             }
    726 
    727             if (intVal > 709) {
    728                 /* This will produce a subnormal output */
    729                 final double result = exp(x+40.19140625, extra, hiPrec) / 285040095144011776.0;
    730                 if (hiPrec != null) {
    731                     hiPrec[0] /= 285040095144011776.0;
    732                     hiPrec[1] /= 285040095144011776.0;
    733                 }
    734                 return result;
    735             }
    736 
    737             if (intVal == 709) {
    738                 /* exp(1.494140625) is nearly a machine number... */
    739                 final double result = exp(x+1.494140625, extra, hiPrec) / 4.455505956692756620;
    740                 if (hiPrec != null) {
    741                     hiPrec[0] /= 4.455505956692756620;
    742                     hiPrec[1] /= 4.455505956692756620;
    743                 }
    744                 return result;
    745             }
    746 
    747             intVal++;
    748 
    749             intPartA = EXP_INT_TABLE_A[750-intVal];
    750             intPartB = EXP_INT_TABLE_B[750-intVal];
    751 
    752             intVal = -intVal;
    753         } else {
    754             intVal = (int) x;
    755 
    756             if (intVal > 709) {
    757                 if (hiPrec != null) {
    758                     hiPrec[0] = Double.POSITIVE_INFINITY;
    759                     hiPrec[1] = 0.0;
    760                 }
    761                 return Double.POSITIVE_INFINITY;
    762             }
    763 
    764             intPartA = EXP_INT_TABLE_A[750+intVal];
    765             intPartB = EXP_INT_TABLE_B[750+intVal];
    766         }
    767 
    768         /* Get the fractional part of x, find the greatest multiple of 2^-10 less than
    769          * x and look up the exp function of it.
    770          * fracPartA will have the upper 22 bits, fracPartB the lower 52 bits.
    771          */
    772         final int intFrac = (int) ((x - intVal) * 1024.0);
    773         final double fracPartA = EXP_FRAC_TABLE_A[intFrac];
    774         final double fracPartB = EXP_FRAC_TABLE_B[intFrac];
    775 
    776         /* epsilon is the difference in x from the nearest multiple of 2^-10.  It
    777          * has a value in the range 0 <= epsilon < 2^-10.
    778          * Do the subtraction from x as the last step to avoid possible loss of percison.
    779          */
    780         final double epsilon = x - (intVal + intFrac / 1024.0);
    781 
    782         /* Compute z = exp(epsilon) - 1.0 via a minimax polynomial.  z has
    783        full double precision (52 bits).  Since z < 2^-10, we will have
    784        62 bits of precision when combined with the contant 1.  This will be
    785        used in the last addition below to get proper rounding. */
    786 
    787         /* Remez generated polynomial.  Converges on the interval [0, 2^-10], error
    788        is less than 0.5 ULP */
    789         double z = 0.04168701738764507;
    790         z = z * epsilon + 0.1666666505023083;
    791         z = z * epsilon + 0.5000000000042687;
    792         z = z * epsilon + 1.0;
    793         z = z * epsilon + -3.940510424527919E-20;
    794 
    795         /* Compute (intPartA+intPartB) * (fracPartA+fracPartB) by binomial
    796        expansion.
    797        tempA is exact since intPartA and intPartB only have 22 bits each.
    798        tempB will have 52 bits of precision.
    799          */
    800         double tempA = intPartA * fracPartA;
    801         double tempB = intPartA * fracPartB + intPartB * fracPartA + intPartB * fracPartB;
    802 
    803         /* Compute the result.  (1+z)(tempA+tempB).  Order of operations is
    804        important.  For accuracy add by increasing size.  tempA is exact and
    805        much larger than the others.  If there are extra bits specified from the
    806        pow() function, use them. */
    807         final double tempC = tempB + tempA;
    808         final double result;
    809         if (extra != 0.0) {
    810             result = tempC*extra*z + tempC*extra + tempC*z + tempB + tempA;
    811         } else {
    812             result = tempC*z + tempB + tempA;
    813         }
    814 
    815         if (hiPrec != null) {
    816             // If requesting high precision
    817             hiPrec[0] = tempA;
    818             hiPrec[1] = tempC*extra*z + tempC*extra + tempC*z + tempB;
    819         }
    820 
    821         return result;
    822     }
    823 
    824     /** Compute exp(x) - 1
    825      * @param x number to compute shifted exponential
    826      * @return exp(x) - 1
    827      */
    828     public static double expm1(double x) {
    829       return expm1(x, null);
    830     }
    831 
    832     /** Internal helper method for expm1
    833      * @param x number to compute shifted exponential
    834      * @param hiPrecOut receive high precision result for -1.0 < x < 1.0
    835      * @return exp(x) - 1
    836      */
    837     private static double expm1(double x, double hiPrecOut[]) {
    838         if (x != x || x == 0.0) { // NaN or zero
    839             return x;
    840         }
    841 
    842         if (x <= -1.0 || x >= 1.0) {
    843             // If not between +/- 1.0
    844             //return exp(x) - 1.0;
    845             double hiPrec[] = new double[2];
    846             exp(x, 0.0, hiPrec);
    847             if (x > 0.0) {
    848                 return -1.0 + hiPrec[0] + hiPrec[1];
    849             } else {
    850                 final double ra = -1.0 + hiPrec[0];
    851                 double rb = -(ra + 1.0 - hiPrec[0]);
    852                 rb += hiPrec[1];
    853                 return ra + rb;
    854             }
    855         }
    856 
    857         double baseA;
    858         double baseB;
    859         double epsilon;
    860         boolean negative = false;
    861 
    862         if (x < 0.0) {
    863             x = -x;
    864             negative = true;
    865         }
    866 
    867         {
    868             int intFrac = (int) (x * 1024.0);
    869             double tempA = EXP_FRAC_TABLE_A[intFrac] - 1.0;
    870             double tempB = EXP_FRAC_TABLE_B[intFrac];
    871 
    872             double temp = tempA + tempB;
    873             tempB = -(temp - tempA - tempB);
    874             tempA = temp;
    875 
    876             temp = tempA * HEX_40000000;
    877             baseA = tempA + temp - temp;
    878             baseB = tempB + (tempA - baseA);
    879 
    880             epsilon = x - intFrac/1024.0;
    881         }
    882 
    883 
    884         /* Compute expm1(epsilon) */
    885         double zb = 0.008336750013465571;
    886         zb = zb * epsilon + 0.041666663879186654;
    887         zb = zb * epsilon + 0.16666666666745392;
    888         zb = zb * epsilon + 0.49999999999999994;
    889         zb = zb * epsilon;
    890         zb = zb * epsilon;
    891 
    892         double za = epsilon;
    893         double temp = za + zb;
    894         zb = -(temp - za - zb);
    895         za = temp;
    896 
    897         temp = za * HEX_40000000;
    898         temp = za + temp - temp;
    899         zb += za - temp;
    900         za = temp;
    901 
    902         /* Combine the parts.   expm1(a+b) = expm1(a) + expm1(b) + expm1(a)*expm1(b) */
    903         double ya = za * baseA;
    904         //double yb = za*baseB + zb*baseA + zb*baseB;
    905         temp = ya + za * baseB;
    906         double yb = -(temp - ya - za * baseB);
    907         ya = temp;
    908 
    909         temp = ya + zb * baseA;
    910         yb += -(temp - ya - zb * baseA);
    911         ya = temp;
    912 
    913         temp = ya + zb * baseB;
    914         yb += -(temp - ya - zb*baseB);
    915         ya = temp;
    916 
    917         //ya = ya + za + baseA;
    918         //yb = yb + zb + baseB;
    919         temp = ya + baseA;
    920         yb += -(temp - baseA - ya);
    921         ya = temp;
    922 
    923         temp = ya + za;
    924         //yb += (ya > za) ? -(temp - ya - za) : -(temp - za - ya);
    925         yb += -(temp - ya - za);
    926         ya = temp;
    927 
    928         temp = ya + baseB;
    929         //yb += (ya > baseB) ? -(temp - ya - baseB) : -(temp - baseB - ya);
    930         yb += -(temp - ya - baseB);
    931         ya = temp;
    932 
    933         temp = ya + zb;
    934         //yb += (ya > zb) ? -(temp - ya - zb) : -(temp - zb - ya);
    935         yb += -(temp - ya - zb);
    936         ya = temp;
    937 
    938         if (negative) {
    939             /* Compute expm1(-x) = -expm1(x) / (expm1(x) + 1) */
    940             double denom = 1.0 + ya;
    941             double denomr = 1.0 / denom;
    942             double denomb = -(denom - 1.0 - ya) + yb;
    943             double ratio = ya * denomr;
    944             temp = ratio * HEX_40000000;
    945             final double ra = ratio + temp - temp;
    946             double rb = ratio - ra;
    947 
    948             temp = denom * HEX_40000000;
    949             za = denom + temp - temp;
    950             zb = denom - za;
    951 
    952             rb += (ya - za * ra - za * rb - zb * ra - zb * rb) * denomr;
    953 
    954             // f(x) = x/1+x
    955             // Compute f'(x)
    956             // Product rule:  d(uv) = du*v + u*dv
    957             // Chain rule:  d(f(g(x)) = f'(g(x))*f(g'(x))
    958             // d(1/x) = -1/(x*x)
    959             // d(1/1+x) = -1/( (1+x)^2) *  1 =  -1/((1+x)*(1+x))
    960             // d(x/1+x) = -x/((1+x)(1+x)) + 1/1+x = 1 / ((1+x)(1+x))
    961 
    962             // Adjust for yb
    963             rb += yb * denomr;                      // numerator
    964             rb += -ya * denomb * denomr * denomr;   // denominator
    965 
    966             // negate
    967             ya = -ra;
    968             yb = -rb;
    969         }
    970 
    971         if (hiPrecOut != null) {
    972             hiPrecOut[0] = ya;
    973             hiPrecOut[1] = yb;
    974         }
    975 
    976         return ya + yb;
    977     }
    978 
    979     /**
    980      *  For x between 0 and 1, returns exp(x), uses extended precision
    981      *  @param x argument of exponential
    982      *  @param result placeholder where to place exp(x) split in two terms
    983      *  for extra precision (i.e. exp(x) = result[0]  result[1]
    984      *  @return exp(x)
    985      */
    986     private static double slowexp(final double x, final double result[]) {
    987         final double xs[] = new double[2];
    988         final double ys[] = new double[2];
    989         final double facts[] = new double[2];
    990         final double as[] = new double[2];
    991         split(x, xs);
    992         ys[0] = ys[1] = 0.0;
    993 
    994         for (int i = 19; i >= 0; i--) {
    995             splitMult(xs, ys, as);
    996             ys[0] = as[0];
    997             ys[1] = as[1];
    998 
    999             split(FACT[i], as);
   1000             splitReciprocal(as, facts);
   1001 
   1002             splitAdd(ys, facts, as);
   1003             ys[0] = as[0];
   1004             ys[1] = as[1];
   1005         }
   1006 
   1007         if (result != null) {
   1008             result[0] = ys[0];
   1009             result[1] = ys[1];
   1010         }
   1011 
   1012         return ys[0] + ys[1];
   1013     }
   1014 
   1015     /** Compute split[0], split[1] such that their sum is equal to d,
   1016      * and split[0] has its 30 least significant bits as zero.
   1017      * @param d number to split
   1018      * @param split placeholder where to place the result
   1019      */
   1020     private static void split(final double d, final double split[]) {
   1021         if (d < 8e298 && d > -8e298) {
   1022             final double a = d * HEX_40000000;
   1023             split[0] = (d + a) - a;
   1024             split[1] = d - split[0];
   1025         } else {
   1026             final double a = d * 9.31322574615478515625E-10;
   1027             split[0] = (d + a - d) * HEX_40000000;
   1028             split[1] = d - split[0];
   1029         }
   1030     }
   1031 
   1032     /** Recompute a split.
   1033      * @param a input/out array containing the split, changed
   1034      * on output
   1035      */
   1036     private static void resplit(final double a[]) {
   1037         final double c = a[0] + a[1];
   1038         final double d = -(c - a[0] - a[1]);
   1039 
   1040         if (c < 8e298 && c > -8e298) {
   1041             double z = c * HEX_40000000;
   1042             a[0] = (c + z) - z;
   1043             a[1] = c - a[0] + d;
   1044         } else {
   1045             double z = c * 9.31322574615478515625E-10;
   1046             a[0] = (c + z - c) * HEX_40000000;
   1047             a[1] = c - a[0] + d;
   1048         }
   1049     }
   1050 
   1051     /** Multiply two numbers in split form.
   1052      * @param a first term of multiplication
   1053      * @param b second term of multiplication
   1054      * @param ans placeholder where to put the result
   1055      */
   1056     private static void splitMult(double a[], double b[], double ans[]) {
   1057         ans[0] = a[0] * b[0];
   1058         ans[1] = a[0] * b[1] + a[1] * b[0] + a[1] * b[1];
   1059 
   1060         /* Resplit */
   1061         resplit(ans);
   1062     }
   1063 
   1064     /** Add two numbers in split form.
   1065      * @param a first term of addition
   1066      * @param b second term of addition
   1067      * @param ans placeholder where to put the result
   1068      */
   1069     private static void splitAdd(final double a[], final double b[], final double ans[]) {
   1070         ans[0] = a[0] + b[0];
   1071         ans[1] = a[1] + b[1];
   1072 
   1073         resplit(ans);
   1074     }
   1075 
   1076     /** Compute the reciprocal of in.  Use the following algorithm.
   1077      *  in = c + d.
   1078      *  want to find x + y such that x+y = 1/(c+d) and x is much
   1079      *  larger than y and x has several zero bits on the right.
   1080      *
   1081      *  Set b = 1/(2^22),  a = 1 - b.  Thus (a+b) = 1.
   1082      *  Use following identity to compute (a+b)/(c+d)
   1083      *
   1084      *  (a+b)/(c+d)  =   a/c   +    (bc - ad) / (c^2 + cd)
   1085      *  set x = a/c  and y = (bc - ad) / (c^2 + cd)
   1086      *  This will be close to the right answer, but there will be
   1087      *  some rounding in the calculation of X.  So by carefully
   1088      *  computing 1 - (c+d)(x+y) we can compute an error and
   1089      *  add that back in.   This is done carefully so that terms
   1090      *  of similar size are subtracted first.
   1091      *  @param in initial number, in split form
   1092      *  @param result placeholder where to put the result
   1093      */
   1094     private static void splitReciprocal(final double in[], final double result[]) {
   1095         final double b = 1.0/4194304.0;
   1096         final double a = 1.0 - b;
   1097 
   1098         if (in[0] == 0.0) {
   1099             in[0] = in[1];
   1100             in[1] = 0.0;
   1101         }
   1102 
   1103         result[0] = a / in[0];
   1104         result[1] = (b*in[0]-a*in[1]) / (in[0]*in[0] + in[0]*in[1]);
   1105 
   1106         if (result[1] != result[1]) { // can happen if result[1] is NAN
   1107             result[1] = 0.0;
   1108         }
   1109 
   1110         /* Resplit */
   1111         resplit(result);
   1112 
   1113         for (int i = 0; i < 2; i++) {
   1114             /* this may be overkill, probably once is enough */
   1115             double err = 1.0 - result[0] * in[0] - result[0] * in[1] -
   1116             result[1] * in[0] - result[1] * in[1];
   1117             /*err = 1.0 - err; */
   1118             err = err * (result[0] + result[1]);
   1119             /*printf("err = %16e\n", err); */
   1120             result[1] += err;
   1121         }
   1122     }
   1123 
   1124     /** Compute (a[0] + a[1]) * (b[0] + b[1]) in extended precision.
   1125      * @param a first term of the multiplication
   1126      * @param b second term of the multiplication
   1127      * @param result placeholder where to put the result
   1128      */
   1129     private static void quadMult(final double a[], final double b[], final double result[]) {
   1130         final double xs[] = new double[2];
   1131         final double ys[] = new double[2];
   1132         final double zs[] = new double[2];
   1133 
   1134         /* a[0] * b[0] */
   1135         split(a[0], xs);
   1136         split(b[0], ys);
   1137         splitMult(xs, ys, zs);
   1138 
   1139         result[0] = zs[0];
   1140         result[1] = zs[1];
   1141 
   1142         /* a[0] * b[1] */
   1143         split(b[1], ys);
   1144         splitMult(xs, ys, zs);
   1145 
   1146         double tmp = result[0] + zs[0];
   1147         result[1] = result[1] - (tmp - result[0] - zs[0]);
   1148         result[0] = tmp;
   1149         tmp = result[0] + zs[1];
   1150         result[1] = result[1] - (tmp - result[0] - zs[1]);
   1151         result[0] = tmp;
   1152 
   1153         /* a[1] * b[0] */
   1154         split(a[1], xs);
   1155         split(b[0], ys);
   1156         splitMult(xs, ys, zs);
   1157 
   1158         tmp = result[0] + zs[0];
   1159         result[1] = result[1] - (tmp - result[0] - zs[0]);
   1160         result[0] = tmp;
   1161         tmp = result[0] + zs[1];
   1162         result[1] = result[1] - (tmp - result[0] - zs[1]);
   1163         result[0] = tmp;
   1164 
   1165         /* a[1] * b[0] */
   1166         split(a[1], xs);
   1167         split(b[1], ys);
   1168         splitMult(xs, ys, zs);
   1169 
   1170         tmp = result[0] + zs[0];
   1171         result[1] = result[1] - (tmp - result[0] - zs[0]);
   1172         result[0] = tmp;
   1173         tmp = result[0] + zs[1];
   1174         result[1] = result[1] - (tmp - result[0] - zs[1]);
   1175         result[0] = tmp;
   1176     }
   1177 
   1178     /** Compute exp(p) for a integer p in extended precision.
   1179      * @param p integer whose exponential is requested
   1180      * @param result placeholder where to put the result in extended precision
   1181      * @return exp(p) in standard precision (equal to result[0] + result[1])
   1182      */
   1183     private static double expint(int p, final double result[]) {
   1184         //double x = M_E;
   1185         final double xs[] = new double[2];
   1186         final double as[] = new double[2];
   1187         final double ys[] = new double[2];
   1188         //split(x, xs);
   1189         //xs[1] = (double)(2.7182818284590452353602874713526625L - xs[0]);
   1190         //xs[0] = 2.71827697753906250000;
   1191         //xs[1] = 4.85091998273542816811e-06;
   1192         //xs[0] = Double.longBitsToDouble(0x4005bf0800000000L);
   1193         //xs[1] = Double.longBitsToDouble(0x3ed458a2bb4a9b00L);
   1194 
   1195         /* E */
   1196         xs[0] = 2.718281828459045;
   1197         xs[1] = 1.4456468917292502E-16;
   1198 
   1199         split(1.0, ys);
   1200 
   1201         while (p > 0) {
   1202             if ((p & 1) != 0) {
   1203                 quadMult(ys, xs, as);
   1204                 ys[0] = as[0]; ys[1] = as[1];
   1205             }
   1206 
   1207             quadMult(xs, xs, as);
   1208             xs[0] = as[0]; xs[1] = as[1];
   1209 
   1210             p >>= 1;
   1211         }
   1212 
   1213         if (result != null) {
   1214             result[0] = ys[0];
   1215             result[1] = ys[1];
   1216 
   1217             resplit(result);
   1218         }
   1219 
   1220         return ys[0] + ys[1];
   1221     }
   1222 
   1223 
   1224     /**
   1225      * Natural logarithm.
   1226      *
   1227      * @param x   a double
   1228      * @return log(x)
   1229      */
   1230     public static double log(final double x) {
   1231         return log(x, null);
   1232     }
   1233 
   1234     /**
   1235      * Internal helper method for natural logarithm function.
   1236      * @param x original argument of the natural logarithm function
   1237      * @param hiPrec extra bits of precision on output (To Be Confirmed)
   1238      * @return log(x)
   1239      */
   1240     private static double log(final double x, final double[] hiPrec) {
   1241         if (x==0) { // Handle special case of +0/-0
   1242             return Double.NEGATIVE_INFINITY;
   1243         }
   1244         long bits = Double.doubleToLongBits(x);
   1245 
   1246         /* Handle special cases of negative input, and NaN */
   1247         if ((bits & 0x8000000000000000L) != 0 || x != x) {
   1248             if (x != 0.0) {
   1249                 if (hiPrec != null) {
   1250                     hiPrec[0] = Double.NaN;
   1251                 }
   1252 
   1253                 return Double.NaN;
   1254             }
   1255         }
   1256 
   1257         /* Handle special cases of Positive infinity. */
   1258         if (x == Double.POSITIVE_INFINITY) {
   1259             if (hiPrec != null) {
   1260                 hiPrec[0] = Double.POSITIVE_INFINITY;
   1261             }
   1262 
   1263             return Double.POSITIVE_INFINITY;
   1264         }
   1265 
   1266         /* Extract the exponent */
   1267         int exp = (int)(bits >> 52)-1023;
   1268 
   1269         if ((bits & 0x7ff0000000000000L) == 0) {
   1270             // Subnormal!
   1271             if (x == 0) {
   1272                 // Zero
   1273                 if (hiPrec != null) {
   1274                     hiPrec[0] = Double.NEGATIVE_INFINITY;
   1275                 }
   1276 
   1277                 return Double.NEGATIVE_INFINITY;
   1278             }
   1279 
   1280             /* Normalize the subnormal number. */
   1281             bits <<= 1;
   1282             while ( (bits & 0x0010000000000000L) == 0) {
   1283                 exp--;
   1284                 bits <<= 1;
   1285             }
   1286         }
   1287 
   1288 
   1289         if (exp == -1 || exp == 0) {
   1290             if (x < 1.01 && x > 0.99 && hiPrec == null) {
   1291                 /* The normal method doesn't work well in the range [0.99, 1.01], so call do a straight
   1292            polynomial expansion in higer precision. */
   1293 
   1294                /* Compute x - 1.0 and split it */
   1295                 double xa = x - 1.0;
   1296                 double xb = xa - x + 1.0;
   1297                 double tmp = xa * HEX_40000000;
   1298                 double aa = xa + tmp - tmp;
   1299                 double ab = xa - aa;
   1300                 xa = aa;
   1301                 xb = ab;
   1302 
   1303                 double ya = LN_QUICK_COEF[LN_QUICK_COEF.length-1][0];
   1304                 double yb = LN_QUICK_COEF[LN_QUICK_COEF.length-1][1];
   1305 
   1306                 for (int i = LN_QUICK_COEF.length - 2; i >= 0; i--) {
   1307                     /* Multiply a = y * x */
   1308                     aa = ya * xa;
   1309                     ab = ya * xb + yb * xa + yb * xb;
   1310                     /* split, so now y = a */
   1311                     tmp = aa * HEX_40000000;
   1312                     ya = aa + tmp - tmp;
   1313                     yb = aa - ya + ab;
   1314 
   1315                     /* Add  a = y + lnQuickCoef */
   1316                     aa = ya + LN_QUICK_COEF[i][0];
   1317                     ab = yb + LN_QUICK_COEF[i][1];
   1318                     /* Split y = a */
   1319                     tmp = aa * HEX_40000000;
   1320                     ya = aa + tmp - tmp;
   1321                     yb = aa - ya + ab;
   1322                 }
   1323 
   1324                 /* Multiply a = y * x */
   1325                 aa = ya * xa;
   1326                 ab = ya * xb + yb * xa + yb * xb;
   1327                 /* split, so now y = a */
   1328                 tmp = aa * HEX_40000000;
   1329                 ya = aa + tmp - tmp;
   1330                 yb = aa - ya + ab;
   1331 
   1332                 return ya + yb;
   1333             }
   1334         }
   1335 
   1336         // lnm is a log of a number in the range of 1.0 - 2.0, so 0 <= lnm < ln(2)
   1337         double lnm[] = LN_MANT[(int)((bits & 0x000ffc0000000000L) >> 42)];
   1338 
   1339         /*
   1340     double epsilon = x / Double.longBitsToDouble(bits & 0xfffffc0000000000L);
   1341 
   1342     epsilon -= 1.0;
   1343          */
   1344 
   1345         // y is the most significant 10 bits of the mantissa
   1346         //double y = Double.longBitsToDouble(bits & 0xfffffc0000000000L);
   1347         //double epsilon = (x - y) / y;
   1348         double epsilon = (bits & 0x3ffffffffffL) / (TWO_POWER_52 + (bits & 0x000ffc0000000000L));
   1349 
   1350         double lnza = 0.0;
   1351         double lnzb = 0.0;
   1352 
   1353         if (hiPrec != null) {
   1354             /* split epsilon -> x */
   1355             double tmp = epsilon * HEX_40000000;
   1356             double aa = epsilon + tmp - tmp;
   1357             double ab = epsilon - aa;
   1358             double xa = aa;
   1359             double xb = ab;
   1360 
   1361             /* Need a more accurate epsilon, so adjust the division. */
   1362             double numer = bits & 0x3ffffffffffL;
   1363             double denom = TWO_POWER_52 + (bits & 0x000ffc0000000000L);
   1364             aa = numer - xa*denom - xb * denom;
   1365             xb += aa / denom;
   1366 
   1367             /* Remez polynomial evaluation */
   1368             double ya = LN_HI_PREC_COEF[LN_HI_PREC_COEF.length-1][0];
   1369             double yb = LN_HI_PREC_COEF[LN_HI_PREC_COEF.length-1][1];
   1370 
   1371             for (int i = LN_HI_PREC_COEF.length - 2; i >= 0; i--) {
   1372                 /* Multiply a = y * x */
   1373                 aa = ya * xa;
   1374                 ab = ya * xb + yb * xa + yb * xb;
   1375                 /* split, so now y = a */
   1376                 tmp = aa * HEX_40000000;
   1377                 ya = aa + tmp - tmp;
   1378                 yb = aa - ya + ab;
   1379 
   1380                 /* Add  a = y + lnHiPrecCoef */
   1381                 aa = ya + LN_HI_PREC_COEF[i][0];
   1382                 ab = yb + LN_HI_PREC_COEF[i][1];
   1383                 /* Split y = a */
   1384                 tmp = aa * HEX_40000000;
   1385                 ya = aa + tmp - tmp;
   1386                 yb = aa - ya + ab;
   1387             }
   1388 
   1389             /* Multiply a = y * x */
   1390             aa = ya * xa;
   1391             ab = ya * xb + yb * xa + yb * xb;
   1392 
   1393             /* split, so now lnz = a */
   1394             /*
   1395       tmp = aa * 1073741824.0;
   1396       lnza = aa + tmp - tmp;
   1397       lnzb = aa - lnza + ab;
   1398              */
   1399             lnza = aa + ab;
   1400             lnzb = -(lnza - aa - ab);
   1401         } else {
   1402             /* High precision not required.  Eval Remez polynomial
   1403          using standard double precision */
   1404             lnza = -0.16624882440418567;
   1405             lnza = lnza * epsilon + 0.19999954120254515;
   1406             lnza = lnza * epsilon + -0.2499999997677497;
   1407             lnza = lnza * epsilon + 0.3333333333332802;
   1408             lnza = lnza * epsilon + -0.5;
   1409             lnza = lnza * epsilon + 1.0;
   1410             lnza = lnza * epsilon;
   1411         }
   1412 
   1413         /* Relative sizes:
   1414          * lnzb     [0, 2.33E-10]
   1415          * lnm[1]   [0, 1.17E-7]
   1416          * ln2B*exp [0, 1.12E-4]
   1417          * lnza      [0, 9.7E-4]
   1418          * lnm[0]   [0, 0.692]
   1419          * ln2A*exp [0, 709]
   1420          */
   1421 
   1422         /* Compute the following sum:
   1423          * lnzb + lnm[1] + ln2B*exp + lnza + lnm[0] + ln2A*exp;
   1424          */
   1425 
   1426         //return lnzb + lnm[1] + ln2B*exp + lnza + lnm[0] + ln2A*exp;
   1427         double a = LN_2_A*exp;
   1428         double b = 0.0;
   1429         double c = a+lnm[0];
   1430         double d = -(c-a-lnm[0]);
   1431         a = c;
   1432         b = b + d;
   1433 
   1434         c = a + lnza;
   1435         d = -(c - a - lnza);
   1436         a = c;
   1437         b = b + d;
   1438 
   1439         c = a + LN_2_B*exp;
   1440         d = -(c - a - LN_2_B*exp);
   1441         a = c;
   1442         b = b + d;
   1443 
   1444         c = a + lnm[1];
   1445         d = -(c - a - lnm[1]);
   1446         a = c;
   1447         b = b + d;
   1448 
   1449         c = a + lnzb;
   1450         d = -(c - a - lnzb);
   1451         a = c;
   1452         b = b + d;
   1453 
   1454         if (hiPrec != null) {
   1455             hiPrec[0] = a;
   1456             hiPrec[1] = b;
   1457         }
   1458 
   1459         return a + b;
   1460     }
   1461 
   1462     /** Compute log(1 + x).
   1463      * @param x a number
   1464      * @return log(1 + x)
   1465      */
   1466     public static double log1p(final double x) {
   1467         double xpa = 1.0 + x;
   1468         double xpb = -(xpa - 1.0 - x);
   1469 
   1470         if (x == -1) {
   1471             return x/0.0;   // -Infinity
   1472         }
   1473 
   1474         if (x > 0 && 1/x == 0) { // x = Infinity
   1475             return x;
   1476         }
   1477 
   1478         if (x>1e-6 || x<-1e-6) {
   1479             double hiPrec[] = new double[2];
   1480 
   1481             final double lores = log(xpa, hiPrec);
   1482             if (Double.isInfinite(lores)){ // don't allow this to be converted to NaN
   1483                 return lores;
   1484             }
   1485 
   1486             /* Do a taylor series expansion around xpa */
   1487             /* f(x+y) = f(x) + f'(x)*y + f''(x)/2 y^2 */
   1488             double fx1 = xpb/xpa;
   1489 
   1490             double epsilon = 0.5 * fx1 + 1.0;
   1491             epsilon = epsilon * fx1;
   1492 
   1493             return epsilon + hiPrec[1] + hiPrec[0];
   1494         }
   1495 
   1496         /* Value is small |x| < 1e6, do a Taylor series centered on 1.0 */
   1497         double y = x * 0.333333333333333 - 0.5;
   1498         y = y * x + 1.0;
   1499         y = y * x;
   1500 
   1501         return y;
   1502     }
   1503 
   1504     /** Compute the base 10 logarithm.
   1505      * @param x a number
   1506      * @return log10(x)
   1507      */
   1508     public static double log10(final double x) {
   1509         final double hiPrec[] = new double[2];
   1510 
   1511         final double lores = log(x, hiPrec);
   1512         if (Double.isInfinite(lores)){ // don't allow this to be converted to NaN
   1513             return lores;
   1514         }
   1515 
   1516         final double tmp = hiPrec[0] * HEX_40000000;
   1517         final double lna = hiPrec[0] + tmp - tmp;
   1518         final double lnb = hiPrec[0] - lna + hiPrec[1];
   1519 
   1520         final double rln10a = 0.4342944622039795;
   1521         final double rln10b = 1.9699272335463627E-8;
   1522 
   1523         return rln10b * lnb + rln10b * lna + rln10a * lnb + rln10a * lna;
   1524     }
   1525 
   1526     /**
   1527      * Power function.  Compute x^y.
   1528      *
   1529      * @param x   a double
   1530      * @param y   a double
   1531      * @return double
   1532      */
   1533     public static double pow(double x, double y) {
   1534         final double lns[] = new double[2];
   1535 
   1536         if (y == 0.0) {
   1537             return 1.0;
   1538         }
   1539 
   1540         if (x != x) { // X is NaN
   1541             return x;
   1542         }
   1543 
   1544 
   1545         if (x == 0) {
   1546             long bits = Double.doubleToLongBits(x);
   1547             if ((bits & 0x8000000000000000L) != 0) {
   1548                 // -zero
   1549                 long yi = (long) y;
   1550 
   1551                 if (y < 0 && y == yi && (yi & 1) == 1) {
   1552                     return Double.NEGATIVE_INFINITY;
   1553                 }
   1554 
   1555                 if (y < 0 && y == yi && (yi & 1) == 1) {
   1556                     return -0.0;
   1557                 }
   1558 
   1559                 if (y > 0 && y == yi && (yi & 1) == 1) {
   1560                     return -0.0;
   1561                 }
   1562             }
   1563 
   1564             if (y < 0) {
   1565                 return Double.POSITIVE_INFINITY;
   1566             }
   1567             if (y > 0) {
   1568                 return 0.0;
   1569             }
   1570 
   1571             return Double.NaN;
   1572         }
   1573 
   1574         if (x == Double.POSITIVE_INFINITY) {
   1575             if (y != y) { // y is NaN
   1576                 return y;
   1577             }
   1578             if (y < 0.0) {
   1579                 return 0.0;
   1580             } else {
   1581                 return Double.POSITIVE_INFINITY;
   1582             }
   1583         }
   1584 
   1585         if (y == Double.POSITIVE_INFINITY) {
   1586             if (x * x == 1.0)
   1587               return Double.NaN;
   1588 
   1589             if (x * x > 1.0) {
   1590                 return Double.POSITIVE_INFINITY;
   1591             } else {
   1592                 return 0.0;
   1593             }
   1594         }
   1595 
   1596         if (x == Double.NEGATIVE_INFINITY) {
   1597             if (y != y) { // y is NaN
   1598                 return y;
   1599             }
   1600 
   1601             if (y < 0) {
   1602                 long yi = (long) y;
   1603                 if (y == yi && (yi & 1) == 1) {
   1604                     return -0.0;
   1605                 }
   1606 
   1607                 return 0.0;
   1608             }
   1609 
   1610             if (y > 0)  {
   1611                 long yi = (long) y;
   1612                 if (y == yi && (yi & 1) == 1) {
   1613                     return Double.NEGATIVE_INFINITY;
   1614                 }
   1615 
   1616                 return Double.POSITIVE_INFINITY;
   1617             }
   1618         }
   1619 
   1620         if (y == Double.NEGATIVE_INFINITY) {
   1621 
   1622             if (x * x == 1.0) {
   1623                 return Double.NaN;
   1624             }
   1625 
   1626             if (x * x < 1.0) {
   1627                 return Double.POSITIVE_INFINITY;
   1628             } else {
   1629                 return 0.0;
   1630             }
   1631         }
   1632 
   1633         /* Handle special case x<0 */
   1634         if (x < 0) {
   1635             // y is an even integer in this case
   1636             if (y >= TWO_POWER_52 || y <= -TWO_POWER_52) {
   1637                 return pow(-x, y);
   1638             }
   1639 
   1640             if (y == (long) y) {
   1641                 // If y is an integer
   1642                 return ((long)y & 1) == 0 ? pow(-x, y) : -pow(-x, y);
   1643             } else {
   1644                 return Double.NaN;
   1645             }
   1646         }
   1647 
   1648         /* Split y into ya and yb such that y = ya+yb */
   1649         double ya;
   1650         double yb;
   1651         if (y < 8e298 && y > -8e298) {
   1652             double tmp1 = y * HEX_40000000;
   1653             ya = y + tmp1 - tmp1;
   1654             yb = y - ya;
   1655         } else {
   1656             double tmp1 = y * 9.31322574615478515625E-10;
   1657             double tmp2 = tmp1 * 9.31322574615478515625E-10;
   1658             ya = (tmp1 + tmp2 - tmp1) * HEX_40000000 * HEX_40000000;
   1659             yb = y - ya;
   1660         }
   1661 
   1662         /* Compute ln(x) */
   1663         final double lores = log(x, lns);
   1664         if (Double.isInfinite(lores)){ // don't allow this to be converted to NaN
   1665             return lores;
   1666         }
   1667 
   1668         double lna = lns[0];
   1669         double lnb = lns[1];
   1670 
   1671         /* resplit lns */
   1672         double tmp1 = lna * HEX_40000000;
   1673         double tmp2 = lna + tmp1 - tmp1;
   1674         lnb += lna - tmp2;
   1675         lna = tmp2;
   1676 
   1677         // y*ln(x) = (aa+ab)
   1678         final double aa = lna * ya;
   1679         final double ab = lna * yb + lnb * ya + lnb * yb;
   1680 
   1681         lna = aa+ab;
   1682         lnb = -(lna - aa - ab);
   1683 
   1684         double z = 1.0 / 120.0;
   1685         z = z * lnb + (1.0 / 24.0);
   1686         z = z * lnb + (1.0 / 6.0);
   1687         z = z * lnb + 0.5;
   1688         z = z * lnb + 1.0;
   1689         z = z * lnb;
   1690 
   1691         final double result = exp(lna, z, null);
   1692         //result = result + result * z;
   1693         return result;
   1694     }
   1695 
   1696     /** xi in the range of [1, 2].
   1697      *                                3        5        7
   1698      *      x+1           /          x        x        x          \
   1699      *  ln ----- =   2 *  |  x  +   ----  +  ----  +  ---- + ...  |
   1700      *      1-x           \          3        5        7          /
   1701      *
   1702      * So, compute a Remez approximation of the following function
   1703      *
   1704      *  ln ((sqrt(x)+1)/(1-sqrt(x)))  /  x
   1705      *
   1706      * This will be an even function with only positive coefficents.
   1707      * x is in the range [0 - 1/3].
   1708      *
   1709      * Transform xi for input to the above function by setting
   1710      * x = (xi-1)/(xi+1).   Input to the polynomial is x^2, then
   1711      * the result is multiplied by x.
   1712      * @param xi number from which log is requested
   1713      * @return log(xi)
   1714      */
   1715     private static double[] slowLog(double xi) {
   1716         double x[] = new double[2];
   1717         double x2[] = new double[2];
   1718         double y[] = new double[2];
   1719         double a[] = new double[2];
   1720 
   1721         split(xi, x);
   1722 
   1723         /* Set X = (x-1)/(x+1) */
   1724         x[0] += 1.0;
   1725         resplit(x);
   1726         splitReciprocal(x, a);
   1727         x[0] -= 2.0;
   1728         resplit(x);
   1729         splitMult(x, a, y);
   1730         x[0] = y[0];
   1731         x[1] = y[1];
   1732 
   1733         /* Square X -> X2*/
   1734         splitMult(x, x, x2);
   1735 
   1736 
   1737         //x[0] -= 1.0;
   1738         //resplit(x);
   1739 
   1740         y[0] = LN_SPLIT_COEF[LN_SPLIT_COEF.length-1][0];
   1741         y[1] = LN_SPLIT_COEF[LN_SPLIT_COEF.length-1][1];
   1742 
   1743         for (int i = LN_SPLIT_COEF.length-2; i >= 0; i--) {
   1744             splitMult(y, x2, a);
   1745             y[0] = a[0];
   1746             y[1] = a[1];
   1747             splitAdd(y, LN_SPLIT_COEF[i], a);
   1748             y[0] = a[0];
   1749             y[1] = a[1];
   1750         }
   1751 
   1752         splitMult(y, x, a);
   1753         y[0] = a[0];
   1754         y[1] = a[1];
   1755 
   1756         return y;
   1757     }
   1758 
   1759     /**
   1760      * For x between 0 and pi/4 compute sine.
   1761      * @param x number from which sine is requested
   1762      * @param result placeholder where to put the result in extended precision
   1763      * @return sin(x)
   1764      */
   1765     private static double slowSin(final double x, final double result[]) {
   1766         final double xs[] = new double[2];
   1767         final double ys[] = new double[2];
   1768         final double facts[] = new double[2];
   1769         final double as[] = new double[2];
   1770         split(x, xs);
   1771         ys[0] = ys[1] = 0.0;
   1772 
   1773         for (int i = 19; i >= 0; i--) {
   1774             splitMult(xs, ys, as);
   1775             ys[0] = as[0]; ys[1] = as[1];
   1776 
   1777             if ( (i & 1) == 0) {
   1778                 continue;
   1779             }
   1780 
   1781             split(FACT[i], as);
   1782             splitReciprocal(as, facts);
   1783 
   1784             if ( (i & 2) != 0 ) {
   1785                 facts[0] = -facts[0];
   1786                 facts[1] = -facts[1];
   1787             }
   1788 
   1789             splitAdd(ys, facts, as);
   1790             ys[0] = as[0]; ys[1] = as[1];
   1791         }
   1792 
   1793         if (result != null) {
   1794             result[0] = ys[0];
   1795             result[1] = ys[1];
   1796         }
   1797 
   1798         return ys[0] + ys[1];
   1799     }
   1800 
   1801     /**
   1802      *  For x between 0 and pi/4 compute cosine
   1803      * @param x number from which cosine is requested
   1804      * @param result placeholder where to put the result in extended precision
   1805      * @return cos(x)
   1806      */
   1807     private static double slowCos(final double x, final double result[]) {
   1808 
   1809         final double xs[] = new double[2];
   1810         final double ys[] = new double[2];
   1811         final double facts[] = new double[2];
   1812         final double as[] = new double[2];
   1813         split(x, xs);
   1814         ys[0] = ys[1] = 0.0;
   1815 
   1816         for (int i = 19; i >= 0; i--) {
   1817             splitMult(xs, ys, as);
   1818             ys[0] = as[0]; ys[1] = as[1];
   1819 
   1820             if ( (i & 1) != 0) {
   1821                 continue;
   1822             }
   1823 
   1824             split(FACT[i], as);
   1825             splitReciprocal(as, facts);
   1826 
   1827             if ( (i & 2) != 0 ) {
   1828                 facts[0] = -facts[0];
   1829                 facts[1] = -facts[1];
   1830             }
   1831 
   1832             splitAdd(ys, facts, as);
   1833             ys[0] = as[0]; ys[1] = as[1];
   1834         }
   1835 
   1836         if (result != null) {
   1837             result[0] = ys[0];
   1838             result[1] = ys[1];
   1839         }
   1840 
   1841         return ys[0] + ys[1];
   1842     }
   1843 
   1844     /** Build the sine and cosine tables.
   1845      */
   1846     private static void buildSinCosTables() {
   1847         final double result[] = new double[2];
   1848 
   1849         /* Use taylor series for 0 <= x <= 6/8 */
   1850         for (int i = 0; i < 7; i++) {
   1851             double x = i / 8.0;
   1852 
   1853             slowSin(x, result);
   1854             SINE_TABLE_A[i] = result[0];
   1855             SINE_TABLE_B[i] = result[1];
   1856 
   1857             slowCos(x, result);
   1858             COSINE_TABLE_A[i] = result[0];
   1859             COSINE_TABLE_B[i] = result[1];
   1860         }
   1861 
   1862         /* Use angle addition formula to complete table to 13/8, just beyond pi/2 */
   1863         for (int i = 7; i < 14; i++) {
   1864             double xs[] = new double[2];
   1865             double ys[] = new double[2];
   1866             double as[] = new double[2];
   1867             double bs[] = new double[2];
   1868             double temps[] = new double[2];
   1869 
   1870             if ( (i & 1) == 0) {
   1871                 // Even, use double angle
   1872                 xs[0] = SINE_TABLE_A[i/2];
   1873                 xs[1] = SINE_TABLE_B[i/2];
   1874                 ys[0] = COSINE_TABLE_A[i/2];
   1875                 ys[1] = COSINE_TABLE_B[i/2];
   1876 
   1877                 /* compute sine */
   1878                 splitMult(xs, ys, result);
   1879                 SINE_TABLE_A[i] = result[0] * 2.0;
   1880                 SINE_TABLE_B[i] = result[1] * 2.0;
   1881 
   1882                 /* Compute cosine */
   1883                 splitMult(ys, ys, as);
   1884                 splitMult(xs, xs, temps);
   1885                 temps[0] = -temps[0];
   1886                 temps[1] = -temps[1];
   1887                 splitAdd(as, temps, result);
   1888                 COSINE_TABLE_A[i] = result[0];
   1889                 COSINE_TABLE_B[i] = result[1];
   1890             } else {
   1891                 xs[0] = SINE_TABLE_A[i/2];
   1892                 xs[1] = SINE_TABLE_B[i/2];
   1893                 ys[0] = COSINE_TABLE_A[i/2];
   1894                 ys[1] = COSINE_TABLE_B[i/2];
   1895                 as[0] = SINE_TABLE_A[i/2+1];
   1896                 as[1] = SINE_TABLE_B[i/2+1];
   1897                 bs[0] = COSINE_TABLE_A[i/2+1];
   1898                 bs[1] = COSINE_TABLE_B[i/2+1];
   1899 
   1900                 /* compute sine */
   1901                 splitMult(xs, bs, temps);
   1902                 splitMult(ys, as, result);
   1903                 splitAdd(result, temps, result);
   1904                 SINE_TABLE_A[i] = result[0];
   1905                 SINE_TABLE_B[i] = result[1];
   1906 
   1907                 /* Compute cosine */
   1908                 splitMult(ys, bs, result);
   1909                 splitMult(xs, as, temps);
   1910                 temps[0] = -temps[0];
   1911                 temps[1] = -temps[1];
   1912                 splitAdd(result, temps, result);
   1913                 COSINE_TABLE_A[i] = result[0];
   1914                 COSINE_TABLE_B[i] = result[1];
   1915             }
   1916         }
   1917 
   1918         /* Compute tangent = sine/cosine */
   1919         for (int i = 0; i < 14; i++) {
   1920             double xs[] = new double[2];
   1921             double ys[] = new double[2];
   1922             double as[] = new double[2];
   1923 
   1924             as[0] = COSINE_TABLE_A[i];
   1925             as[1] = COSINE_TABLE_B[i];
   1926 
   1927             splitReciprocal(as, ys);
   1928 
   1929             xs[0] = SINE_TABLE_A[i];
   1930             xs[1] = SINE_TABLE_B[i];
   1931 
   1932             splitMult(xs, ys, as);
   1933 
   1934             TANGENT_TABLE_A[i] = as[0];
   1935             TANGENT_TABLE_B[i] = as[1];
   1936         }
   1937 
   1938     }
   1939 
   1940     /**
   1941      *  Computes sin(x) - x, where |x| < 1/16.
   1942      *  Use a Remez polynomial approximation.
   1943      *  @param x a number smaller than 1/16
   1944      *  @return sin(x) - x
   1945      */
   1946     private static double polySine(final double x)
   1947     {
   1948         double x2 = x*x;
   1949 
   1950         double p = 2.7553817452272217E-6;
   1951         p = p * x2 + -1.9841269659586505E-4;
   1952         p = p * x2 + 0.008333333333329196;
   1953         p = p * x2 + -0.16666666666666666;
   1954         //p *= x2;
   1955         //p *= x;
   1956         p = p * x2 * x;
   1957 
   1958         return p;
   1959     }
   1960 
   1961     /**
   1962      *  Computes cos(x) - 1, where |x| < 1/16.
   1963      *  Use a Remez polynomial approximation.
   1964      *  @param x a number smaller than 1/16
   1965      *  @return cos(x) - 1
   1966      */
   1967     private static double polyCosine(double x) {
   1968         double x2 = x*x;
   1969 
   1970         double p = 2.479773539153719E-5;
   1971         p = p * x2 + -0.0013888888689039883;
   1972         p = p * x2 + 0.041666666666621166;
   1973         p = p * x2 + -0.49999999999999994;
   1974         p *= x2;
   1975 
   1976         return p;
   1977     }
   1978 
   1979     /**
   1980      *  Compute sine over the first quadrant (0 < x < pi/2).
   1981      *  Use combination of table lookup and rational polynomial expansion.
   1982      *  @param xa number from which sine is requested
   1983      *  @param xb extra bits for x (may be 0.0)
   1984      *  @return sin(xa + xb)
   1985      */
   1986     private static double sinQ(double xa, double xb) {
   1987         int idx = (int) ((xa * 8.0) + 0.5);
   1988         final double epsilon = xa - EIGHTHS[idx]; //idx*0.125;
   1989 
   1990         // Table lookups
   1991         final double sintA = SINE_TABLE_A[idx];
   1992         final double sintB = SINE_TABLE_B[idx];
   1993         final double costA = COSINE_TABLE_A[idx];
   1994         final double costB = COSINE_TABLE_B[idx];
   1995 
   1996         // Polynomial eval of sin(epsilon), cos(epsilon)
   1997         double sinEpsA = epsilon;
   1998         double sinEpsB = polySine(epsilon);
   1999         final double cosEpsA = 1.0;
   2000         final double cosEpsB = polyCosine(epsilon);
   2001 
   2002         // Split epsilon   xa + xb = x
   2003         final double temp = sinEpsA * HEX_40000000;
   2004         double temp2 = (sinEpsA + temp) - temp;
   2005         sinEpsB +=  sinEpsA - temp2;
   2006         sinEpsA = temp2;
   2007 
   2008         /* Compute sin(x) by angle addition formula */
   2009         double result;
   2010 
   2011         /* Compute the following sum:
   2012          *
   2013          * result = sintA + costA*sinEpsA + sintA*cosEpsB + costA*sinEpsB +
   2014          *          sintB + costB*sinEpsA + sintB*cosEpsB + costB*sinEpsB;
   2015          *
   2016          * Ranges of elements
   2017          *
   2018          * xxxtA   0            PI/2
   2019          * xxxtB   -1.5e-9      1.5e-9
   2020          * sinEpsA -0.0625      0.0625
   2021          * sinEpsB -6e-11       6e-11
   2022          * cosEpsA  1.0
   2023          * cosEpsB  0           -0.0625
   2024          *
   2025          */
   2026 
   2027         //result = sintA + costA*sinEpsA + sintA*cosEpsB + costA*sinEpsB +
   2028         //          sintB + costB*sinEpsA + sintB*cosEpsB + costB*sinEpsB;
   2029 
   2030         //result = sintA + sintA*cosEpsB + sintB + sintB * cosEpsB;
   2031         //result += costA*sinEpsA + costA*sinEpsB + costB*sinEpsA + costB * sinEpsB;
   2032         double a = 0;
   2033         double b = 0;
   2034 
   2035         double t = sintA;
   2036         double c = a + t;
   2037         double d = -(c - a - t);
   2038         a = c;
   2039         b = b + d;
   2040 
   2041         t = costA * sinEpsA;
   2042         c = a + t;
   2043         d = -(c - a - t);
   2044         a = c;
   2045         b = b + d;
   2046 
   2047         b = b + sintA * cosEpsB + costA * sinEpsB;
   2048         /*
   2049     t = sintA*cosEpsB;
   2050     c = a + t;
   2051     d = -(c - a - t);
   2052     a = c;
   2053     b = b + d;
   2054 
   2055     t = costA*sinEpsB;
   2056     c = a + t;
   2057     d = -(c - a - t);
   2058     a = c;
   2059     b = b + d;
   2060          */
   2061 
   2062         b = b + sintB + costB * sinEpsA + sintB * cosEpsB + costB * sinEpsB;
   2063         /*
   2064     t = sintB;
   2065     c = a + t;
   2066     d = -(c - a - t);
   2067     a = c;
   2068     b = b + d;
   2069 
   2070     t = costB*sinEpsA;
   2071     c = a + t;
   2072     d = -(c - a - t);
   2073     a = c;
   2074     b = b + d;
   2075 
   2076     t = sintB*cosEpsB;
   2077     c = a + t;
   2078     d = -(c - a - t);
   2079     a = c;
   2080     b = b + d;
   2081 
   2082     t = costB*sinEpsB;
   2083     c = a + t;
   2084     d = -(c - a - t);
   2085     a = c;
   2086     b = b + d;
   2087          */
   2088 
   2089         if (xb != 0.0) {
   2090             t = ((costA + costB) * (cosEpsA + cosEpsB) -
   2091                  (sintA + sintB) * (sinEpsA + sinEpsB)) * xb;  // approximate cosine*xb
   2092             c = a + t;
   2093             d = -(c - a - t);
   2094             a = c;
   2095             b = b + d;
   2096         }
   2097 
   2098         result = a + b;
   2099 
   2100         return result;
   2101     }
   2102 
   2103     /**
   2104      * Compute cosine in the first quadrant by subtracting input from PI/2 and
   2105      * then calling sinQ.  This is more accurate as the input approaches PI/2.
   2106      *  @param xa number from which cosine is requested
   2107      *  @param xb extra bits for x (may be 0.0)
   2108      *  @return cos(xa + xb)
   2109      */
   2110     private static double cosQ(double xa, double xb) {
   2111         final double pi2a = 1.5707963267948966;
   2112         final double pi2b = 6.123233995736766E-17;
   2113 
   2114         final double a = pi2a - xa;
   2115         double b = -(a - pi2a + xa);
   2116         b += pi2b - xb;
   2117 
   2118         return sinQ(a, b);
   2119     }
   2120 
   2121     /**
   2122      *  Compute tangent (or cotangent) over the first quadrant.   0 < x < pi/2
   2123      *  Use combination of table lookup and rational polynomial expansion.
   2124      *  @param xa number from which sine is requested
   2125      *  @param xb extra bits for x (may be 0.0)
   2126      *  @param cotanFlag if true, compute the cotangent instead of the tangent
   2127      *  @return tan(xa+xb) (or cotangent, depending on cotanFlag)
   2128      */
   2129     private static double tanQ(double xa, double xb, boolean cotanFlag) {
   2130 
   2131         int idx = (int) ((xa * 8.0) + 0.5);
   2132         final double epsilon = xa - EIGHTHS[idx]; //idx*0.125;
   2133 
   2134         // Table lookups
   2135         final double sintA = SINE_TABLE_A[idx];
   2136         final double sintB = SINE_TABLE_B[idx];
   2137         final double costA = COSINE_TABLE_A[idx];
   2138         final double costB = COSINE_TABLE_B[idx];
   2139 
   2140         // Polynomial eval of sin(epsilon), cos(epsilon)
   2141         double sinEpsA = epsilon;
   2142         double sinEpsB = polySine(epsilon);
   2143         final double cosEpsA = 1.0;
   2144         final double cosEpsB = polyCosine(epsilon);
   2145 
   2146         // Split epsilon   xa + xb = x
   2147         double temp = sinEpsA * HEX_40000000;
   2148         double temp2 = (sinEpsA + temp) - temp;
   2149         sinEpsB +=  sinEpsA - temp2;
   2150         sinEpsA = temp2;
   2151 
   2152         /* Compute sin(x) by angle addition formula */
   2153 
   2154         /* Compute the following sum:
   2155          *
   2156          * result = sintA + costA*sinEpsA + sintA*cosEpsB + costA*sinEpsB +
   2157          *          sintB + costB*sinEpsA + sintB*cosEpsB + costB*sinEpsB;
   2158          *
   2159          * Ranges of elements
   2160          *
   2161          * xxxtA   0            PI/2
   2162          * xxxtB   -1.5e-9      1.5e-9
   2163          * sinEpsA -0.0625      0.0625
   2164          * sinEpsB -6e-11       6e-11
   2165          * cosEpsA  1.0
   2166          * cosEpsB  0           -0.0625
   2167          *
   2168          */
   2169 
   2170         //result = sintA + costA*sinEpsA + sintA*cosEpsB + costA*sinEpsB +
   2171         //          sintB + costB*sinEpsA + sintB*cosEpsB + costB*sinEpsB;
   2172 
   2173         //result = sintA + sintA*cosEpsB + sintB + sintB * cosEpsB;
   2174         //result += costA*sinEpsA + costA*sinEpsB + costB*sinEpsA + costB * sinEpsB;
   2175         double a = 0;
   2176         double b = 0;
   2177 
   2178         // Compute sine
   2179         double t = sintA;
   2180         double c = a + t;
   2181         double d = -(c - a - t);
   2182         a = c;
   2183         b = b + d;
   2184 
   2185         t = costA*sinEpsA;
   2186         c = a + t;
   2187         d = -(c - a - t);
   2188         a = c;
   2189         b = b + d;
   2190 
   2191         b = b + sintA*cosEpsB + costA*sinEpsB;
   2192         b = b + sintB + costB*sinEpsA + sintB*cosEpsB + costB*sinEpsB;
   2193 
   2194         double sina = a + b;
   2195         double sinb = -(sina - a - b);
   2196 
   2197         // Compute cosine
   2198 
   2199         a = b = c = d = 0.0;
   2200 
   2201         t = costA*cosEpsA;
   2202         c = a + t;
   2203         d = -(c - a - t);
   2204         a = c;
   2205         b = b + d;
   2206 
   2207         t = -sintA*sinEpsA;
   2208         c = a + t;
   2209         d = -(c - a - t);
   2210         a = c;
   2211         b = b + d;
   2212 
   2213         b = b + costB*cosEpsA + costA*cosEpsB + costB*cosEpsB;
   2214         b = b - (sintB*sinEpsA + sintA*sinEpsB + sintB*sinEpsB);
   2215 
   2216         double cosa = a + b;
   2217         double cosb = -(cosa - a - b);
   2218 
   2219         if (cotanFlag) {
   2220             double tmp;
   2221             tmp = cosa; cosa = sina; sina = tmp;
   2222             tmp = cosb; cosb = sinb; sinb = tmp;
   2223         }
   2224 
   2225 
   2226         /* estimate and correct, compute 1.0/(cosa+cosb) */
   2227         /*
   2228     double est = (sina+sinb)/(cosa+cosb);
   2229     double err = (sina - cosa*est) + (sinb - cosb*est);
   2230     est += err/(cosa+cosb);
   2231     err = (sina - cosa*est) + (sinb - cosb*est);
   2232          */
   2233 
   2234         // f(x) = 1/x,   f'(x) = -1/x^2
   2235 
   2236         double est = sina/cosa;
   2237 
   2238         /* Split the estimate to get more accurate read on division rounding */
   2239         temp = est * HEX_40000000;
   2240         double esta = (est + temp) - temp;
   2241         double estb =  est - esta;
   2242 
   2243         temp = cosa * HEX_40000000;
   2244         double cosaa = (cosa + temp) - temp;
   2245         double cosab =  cosa - cosaa;
   2246 
   2247         //double err = (sina - est*cosa)/cosa;  // Correction for division rounding
   2248         double err = (sina - esta*cosaa - esta*cosab - estb*cosaa - estb*cosab)/cosa;  // Correction for division rounding
   2249         err += sinb/cosa;                     // Change in est due to sinb
   2250         err += -sina * cosb / cosa / cosa;    // Change in est due to cosb
   2251 
   2252         if (xb != 0.0) {
   2253             // tan' = 1 + tan^2      cot' = -(1 + cot^2)
   2254             // Approximate impact of xb
   2255             double xbadj = xb + est*est*xb;
   2256             if (cotanFlag) {
   2257                 xbadj = -xbadj;
   2258             }
   2259 
   2260             err += xbadj;
   2261         }
   2262 
   2263         return est+err;
   2264     }
   2265 
   2266     /** Reduce the input argument using the Payne and Hanek method.
   2267      *  This is good for all inputs 0.0 < x < inf
   2268      *  Output is remainder after dividing by PI/2
   2269      *  The result array should contain 3 numbers.
   2270      *  result[0] is the integer portion, so mod 4 this gives the quadrant.
   2271      *  result[1] is the upper bits of the remainder
   2272      *  result[2] is the lower bits of the remainder
   2273      *
   2274      * @param x number to reduce
   2275      * @param result placeholder where to put the result
   2276      */
   2277     private static void reducePayneHanek(double x, double result[])
   2278     {
   2279         /* Convert input double to bits */
   2280         long inbits = Double.doubleToLongBits(x);
   2281         int exponent = (int) ((inbits >> 52) & 0x7ff) - 1023;
   2282 
   2283         /* Convert to fixed point representation */
   2284         inbits &= 0x000fffffffffffffL;
   2285         inbits |= 0x0010000000000000L;
   2286 
   2287         /* Normalize input to be between 0.5 and 1.0 */
   2288         exponent++;
   2289         inbits <<= 11;
   2290 
   2291         /* Based on the exponent, get a shifted copy of recip2pi */
   2292         long shpi0;
   2293         long shpiA;
   2294         long shpiB;
   2295         int idx = exponent >> 6;
   2296         int shift = exponent - (idx << 6);
   2297 
   2298         if (shift != 0) {
   2299             shpi0 = (idx == 0) ? 0 : (RECIP_2PI[idx-1] << shift);
   2300             shpi0 |= RECIP_2PI[idx] >>> (64-shift);
   2301             shpiA = (RECIP_2PI[idx] << shift) | (RECIP_2PI[idx+1] >>> (64-shift));
   2302             shpiB = (RECIP_2PI[idx+1] << shift) | (RECIP_2PI[idx+2] >>> (64-shift));
   2303         } else {
   2304             shpi0 = (idx == 0) ? 0 : RECIP_2PI[idx-1];
   2305             shpiA = RECIP_2PI[idx];
   2306             shpiB = RECIP_2PI[idx+1];
   2307         }
   2308 
   2309         /* Multiply input by shpiA */
   2310         long a = inbits >>> 32;
   2311         long b = inbits & 0xffffffffL;
   2312 
   2313         long c = shpiA >>> 32;
   2314         long d = shpiA & 0xffffffffL;
   2315 
   2316         long ac = a * c;
   2317         long bd = b * d;
   2318         long bc = b * c;
   2319         long ad = a * d;
   2320 
   2321         long prodB = bd + (ad << 32);
   2322         long prodA = ac + (ad >>> 32);
   2323 
   2324         boolean bita = (bd & 0x8000000000000000L) != 0;
   2325         boolean bitb = (ad & 0x80000000L ) != 0;
   2326         boolean bitsum = (prodB & 0x8000000000000000L) != 0;
   2327 
   2328         /* Carry */
   2329         if ( (bita && bitb) ||
   2330                 ((bita || bitb) && !bitsum) ) {
   2331             prodA++;
   2332         }
   2333 
   2334         bita = (prodB & 0x8000000000000000L) != 0;
   2335         bitb = (bc & 0x80000000L ) != 0;
   2336 
   2337         prodB = prodB + (bc << 32);
   2338         prodA = prodA + (bc >>> 32);
   2339 
   2340         bitsum = (prodB & 0x8000000000000000L) != 0;
   2341 
   2342         /* Carry */
   2343         if ( (bita && bitb) ||
   2344                 ((bita || bitb) && !bitsum) ) {
   2345             prodA++;
   2346         }
   2347 
   2348         /* Multiply input by shpiB */
   2349         c = shpiB >>> 32;
   2350         d = shpiB & 0xffffffffL;
   2351         ac = a * c;
   2352         bc = b * c;
   2353         ad = a * d;
   2354 
   2355         /* Collect terms */
   2356         ac = ac + ((bc + ad) >>> 32);
   2357 
   2358         bita = (prodB & 0x8000000000000000L) != 0;
   2359         bitb = (ac & 0x8000000000000000L ) != 0;
   2360         prodB += ac;
   2361         bitsum = (prodB & 0x8000000000000000L) != 0;
   2362         /* Carry */
   2363         if ( (bita && bitb) ||
   2364                 ((bita || bitb) && !bitsum) ) {
   2365             prodA++;
   2366         }
   2367 
   2368         /* Multiply by shpi0 */
   2369         c = shpi0 >>> 32;
   2370         d = shpi0 & 0xffffffffL;
   2371 
   2372         bd = b * d;
   2373         bc = b * c;
   2374         ad = a * d;
   2375 
   2376         prodA += bd + ((bc + ad) << 32);
   2377 
   2378         /*
   2379          * prodA, prodB now contain the remainder as a fraction of PI.  We want this as a fraction of
   2380          * PI/2, so use the following steps:
   2381          * 1.) multiply by 4.
   2382          * 2.) do a fixed point muliply by PI/4.
   2383          * 3.) Convert to floating point.
   2384          * 4.) Multiply by 2
   2385          */
   2386 
   2387         /* This identifies the quadrant */
   2388         int intPart = (int)(prodA >>> 62);
   2389 
   2390         /* Multiply by 4 */
   2391         prodA <<= 2;
   2392         prodA |= prodB >>> 62;
   2393         prodB <<= 2;
   2394 
   2395         /* Multiply by PI/4 */
   2396         a = prodA >>> 32;
   2397         b = prodA & 0xffffffffL;
   2398 
   2399         c = PI_O_4_BITS[0] >>> 32;
   2400         d = PI_O_4_BITS[0] & 0xffffffffL;
   2401 
   2402         ac = a * c;
   2403         bd = b * d;
   2404         bc = b * c;
   2405         ad = a * d;
   2406 
   2407         long prod2B = bd + (ad << 32);
   2408         long prod2A = ac + (ad >>> 32);
   2409 
   2410         bita = (bd & 0x8000000000000000L) != 0;
   2411         bitb = (ad & 0x80000000L ) != 0;
   2412         bitsum = (prod2B & 0x8000000000000000L) != 0;
   2413 
   2414         /* Carry */
   2415         if ( (bita && bitb) ||
   2416                 ((bita || bitb) && !bitsum) ) {
   2417             prod2A++;
   2418         }
   2419 
   2420         bita = (prod2B & 0x8000000000000000L) != 0;
   2421         bitb = (bc & 0x80000000L ) != 0;
   2422 
   2423         prod2B = prod2B + (bc << 32);
   2424         prod2A = prod2A + (bc >>> 32);
   2425 
   2426         bitsum = (prod2B & 0x8000000000000000L) != 0;
   2427 
   2428         /* Carry */
   2429         if ( (bita && bitb) ||
   2430                 ((bita || bitb) && !bitsum) ) {
   2431             prod2A++;
   2432         }
   2433 
   2434         /* Multiply input by pio4bits[1] */
   2435         c = PI_O_4_BITS[1] >>> 32;
   2436         d = PI_O_4_BITS[1] & 0xffffffffL;
   2437         ac = a * c;
   2438         bc = b * c;
   2439         ad = a * d;
   2440 
   2441         /* Collect terms */
   2442         ac = ac + ((bc + ad) >>> 32);
   2443 
   2444         bita = (prod2B & 0x8000000000000000L) != 0;
   2445         bitb = (ac & 0x8000000000000000L ) != 0;
   2446         prod2B += ac;
   2447         bitsum = (prod2B & 0x8000000000000000L) != 0;
   2448         /* Carry */
   2449         if ( (bita && bitb) ||
   2450                 ((bita || bitb) && !bitsum) ) {
   2451             prod2A++;
   2452         }
   2453 
   2454         /* Multiply inputB by pio4bits[0] */
   2455         a = prodB >>> 32;
   2456         b = prodB & 0xffffffffL;
   2457         c = PI_O_4_BITS[0] >>> 32;
   2458         d = PI_O_4_BITS[0] & 0xffffffffL;
   2459         ac = a * c;
   2460         bc = b * c;
   2461         ad = a * d;
   2462 
   2463         /* Collect terms */
   2464         ac = ac + ((bc + ad) >>> 32);
   2465 
   2466         bita = (prod2B & 0x8000000000000000L) != 0;
   2467         bitb = (ac & 0x8000000000000000L ) != 0;
   2468         prod2B += ac;
   2469         bitsum = (prod2B & 0x8000000000000000L) != 0;
   2470         /* Carry */
   2471         if ( (bita && bitb) ||
   2472                 ((bita || bitb) && !bitsum) ) {
   2473             prod2A++;
   2474         }
   2475 
   2476         /* Convert to double */
   2477         double tmpA = (prod2A >>> 12) / TWO_POWER_52;  // High order 52 bits
   2478         double tmpB = (((prod2A & 0xfffL) << 40) + (prod2B >>> 24)) / TWO_POWER_52 / TWO_POWER_52; // Low bits
   2479 
   2480         double sumA = tmpA + tmpB;
   2481         double sumB = -(sumA - tmpA - tmpB);
   2482 
   2483         /* Multiply by PI/2 and return */
   2484         result[0] = intPart;
   2485         result[1] = sumA * 2.0;
   2486         result[2] = sumB * 2.0;
   2487     }
   2488 
   2489     /**
   2490      *  Sine function.
   2491      *  @param x a number
   2492      *  @return sin(x)
   2493      */
   2494     public static double sin(double x) {
   2495         boolean negative = false;
   2496         int quadrant = 0;
   2497         double xa;
   2498         double xb = 0.0;
   2499 
   2500         /* Take absolute value of the input */
   2501         xa = x;
   2502         if (x < 0) {
   2503             negative = true;
   2504             xa = -xa;
   2505         }
   2506 
   2507         /* Check for zero and negative zero */
   2508         if (xa == 0.0) {
   2509             long bits = Double.doubleToLongBits(x);
   2510             if (bits < 0) {
   2511                 return -0.0;
   2512             }
   2513             return 0.0;
   2514         }
   2515 
   2516         if (xa != xa || xa == Double.POSITIVE_INFINITY) {
   2517             return Double.NaN;
   2518         }
   2519 
   2520         /* Perform any argument reduction */
   2521         if (xa > 3294198.0) {
   2522             // PI * (2**20)
   2523             // Argument too big for CodyWaite reduction.  Must use
   2524             // PayneHanek.
   2525             double reduceResults[] = new double[3];
   2526             reducePayneHanek(xa, reduceResults);
   2527             quadrant = ((int) reduceResults[0]) & 3;
   2528             xa = reduceResults[1];
   2529             xb = reduceResults[2];
   2530         } else if (xa > 1.5707963267948966) {
   2531             /* Inline the Cody/Waite reduction for performance */
   2532 
   2533             // Estimate k
   2534             //k = (int)(xa / 1.5707963267948966);
   2535             int k = (int)(xa * 0.6366197723675814);
   2536 
   2537             // Compute remainder
   2538             double remA;
   2539             double remB;
   2540             while (true) {
   2541                 double a = -k * 1.570796251296997;
   2542                 remA = xa + a;
   2543                 remB = -(remA - xa - a);
   2544 
   2545                 a = -k * 7.549789948768648E-8;
   2546                 double b = remA;
   2547                 remA = a + b;
   2548                 remB += -(remA - b - a);
   2549 
   2550                 a = -k * 6.123233995736766E-17;
   2551                 b = remA;
   2552                 remA = a + b;
   2553                 remB += -(remA - b - a);
   2554 
   2555                 if (remA > 0.0)
   2556                     break;
   2557 
   2558                 // Remainder is negative, so decrement k and try again.
   2559                 // This should only happen if the input is very close
   2560                 // to an even multiple of pi/2
   2561                 k--;
   2562             }
   2563             quadrant = k & 3;
   2564             xa = remA;
   2565             xb = remB;
   2566         }
   2567 
   2568         if (negative) {
   2569             quadrant ^= 2;  // Flip bit 1
   2570         }
   2571 
   2572         switch (quadrant) {
   2573             case 0:
   2574                 return sinQ(xa, xb);
   2575             case 1:
   2576                 return cosQ(xa, xb);
   2577             case 2:
   2578                 return -sinQ(xa, xb);
   2579             case 3:
   2580                 return -cosQ(xa, xb);
   2581             default:
   2582                 return Double.NaN;
   2583         }
   2584     }
   2585 
   2586     /**
   2587      *  Cosine function
   2588      *  @param x a number
   2589      *  @return cos(x)
   2590      */
   2591     public static double cos(double x) {
   2592         int quadrant = 0;
   2593 
   2594         /* Take absolute value of the input */
   2595         double xa = x;
   2596         if (x < 0) {
   2597             xa = -xa;
   2598         }
   2599 
   2600         if (xa != xa || xa == Double.POSITIVE_INFINITY) {
   2601             return Double.NaN;
   2602         }
   2603 
   2604         /* Perform any argument reduction */
   2605         double xb = 0;
   2606         if (xa > 3294198.0) {
   2607             // PI * (2**20)
   2608             // Argument too big for CodyWaite reduction.  Must use
   2609             // PayneHanek.
   2610             double reduceResults[] = new double[3];
   2611             reducePayneHanek(xa, reduceResults);
   2612             quadrant = ((int) reduceResults[0]) & 3;
   2613             xa = reduceResults[1];
   2614             xb = reduceResults[2];
   2615         } else if (xa > 1.5707963267948966) {
   2616             /* Inline the Cody/Waite reduction for performance */
   2617 
   2618             // Estimate k
   2619             //k = (int)(xa / 1.5707963267948966);
   2620             int k = (int)(xa * 0.6366197723675814);
   2621 
   2622             // Compute remainder
   2623             double remA;
   2624             double remB;
   2625             while (true) {
   2626                 double a = -k * 1.570796251296997;
   2627                 remA = xa + a;
   2628                 remB = -(remA - xa - a);
   2629 
   2630                 a = -k * 7.549789948768648E-8;
   2631                 double b = remA;
   2632                 remA = a + b;
   2633                 remB += -(remA - b - a);
   2634 
   2635                 a = -k * 6.123233995736766E-17;
   2636                 b = remA;
   2637                 remA = a + b;
   2638                 remB += -(remA - b - a);
   2639 
   2640                 if (remA > 0.0)
   2641                     break;
   2642 
   2643                 // Remainder is negative, so decrement k and try again.
   2644                 // This should only happen if the input is very close
   2645                 // to an even multiple of pi/2
   2646                 k--;
   2647             }
   2648             quadrant = k & 3;
   2649             xa = remA;
   2650             xb = remB;
   2651         }
   2652 
   2653         //if (negative)
   2654         //  quadrant = (quadrant + 2) % 4;
   2655 
   2656         switch (quadrant) {
   2657             case 0:
   2658                 return cosQ(xa, xb);
   2659             case 1:
   2660                 return -sinQ(xa, xb);
   2661             case 2:
   2662                 return -cosQ(xa, xb);
   2663             case 3:
   2664                 return sinQ(xa, xb);
   2665             default:
   2666                 return Double.NaN;
   2667         }
   2668     }
   2669 
   2670     /**
   2671      *   Tangent function
   2672      *  @param x a number
   2673      *  @return tan(x)
   2674      */
   2675     public static double tan(double x) {
   2676         boolean negative = false;
   2677         int quadrant = 0;
   2678 
   2679         /* Take absolute value of the input */
   2680         double xa = x;
   2681         if (x < 0) {
   2682             negative = true;
   2683             xa = -xa;
   2684         }
   2685 
   2686         /* Check for zero and negative zero */
   2687         if (xa == 0.0) {
   2688             long bits = Double.doubleToLongBits(x);
   2689             if (bits < 0) {
   2690                 return -0.0;
   2691             }
   2692             return 0.0;
   2693         }
   2694 
   2695         if (xa != xa || xa == Double.POSITIVE_INFINITY) {
   2696             return Double.NaN;
   2697         }
   2698 
   2699         /* Perform any argument reduction */
   2700         double xb = 0;
   2701         if (xa > 3294198.0) {
   2702             // PI * (2**20)
   2703             // Argument too big for CodyWaite reduction.  Must use
   2704             // PayneHanek.
   2705             double reduceResults[] = new double[3];
   2706             reducePayneHanek(xa, reduceResults);
   2707             quadrant = ((int) reduceResults[0]) & 3;
   2708             xa = reduceResults[1];
   2709             xb = reduceResults[2];
   2710         } else if (xa > 1.5707963267948966) {
   2711             /* Inline the Cody/Waite reduction for performance */
   2712 
   2713             // Estimate k
   2714             //k = (int)(xa / 1.5707963267948966);
   2715             int k = (int)(xa * 0.6366197723675814);
   2716 
   2717             // Compute remainder
   2718             double remA;
   2719             double remB;
   2720             while (true) {
   2721                 double a = -k * 1.570796251296997;
   2722                 remA = xa + a;
   2723                 remB = -(remA - xa - a);
   2724 
   2725                 a = -k * 7.549789948768648E-8;
   2726                 double b = remA;
   2727                 remA = a + b;
   2728                 remB += -(remA - b - a);
   2729 
   2730                 a = -k * 6.123233995736766E-17;
   2731                 b = remA;
   2732                 remA = a + b;
   2733                 remB += -(remA - b - a);
   2734 
   2735                 if (remA > 0.0)
   2736                     break;
   2737 
   2738                 // Remainder is negative, so decrement k and try again.
   2739                 // This should only happen if the input is very close
   2740                 // to an even multiple of pi/2
   2741                 k--;
   2742             }
   2743             quadrant = k & 3;
   2744             xa = remA;
   2745             xb = remB;
   2746         }
   2747 
   2748         if (xa > 1.5) {
   2749             // Accurracy suffers between 1.5 and PI/2
   2750             final double pi2a = 1.5707963267948966;
   2751             final double pi2b = 6.123233995736766E-17;
   2752 
   2753             final double a = pi2a - xa;
   2754             double b = -(a - pi2a + xa);
   2755             b += pi2b - xb;
   2756 
   2757             xa = a + b;
   2758             xb = -(xa - a - b);
   2759             quadrant ^= 1;
   2760             negative ^= true;
   2761         }
   2762 
   2763         double result;
   2764         if ((quadrant & 1) == 0) {
   2765             result = tanQ(xa, xb, false);
   2766         } else {
   2767             result = -tanQ(xa, xb, true);
   2768         }
   2769 
   2770         if (negative) {
   2771             result = -result;
   2772         }
   2773 
   2774         return result;
   2775     }
   2776 
   2777     /**
   2778      * Arctangent function
   2779      *  @param x a number
   2780      *  @return atan(x)
   2781      */
   2782     public static double atan(double x) {
   2783         return atan(x, 0.0, false);
   2784     }
   2785 
   2786     /** Internal helper function to compute arctangent.
   2787      * @param xa number from which arctangent is requested
   2788      * @param xb extra bits for x (may be 0.0)
   2789      * @param leftPlane if true, result angle must be put in the left half plane
   2790      * @return atan(xa + xb) (or angle shifted by {@code PI} if leftPlane is true)
   2791      */
   2792     private static double atan(double xa, double xb, boolean leftPlane) {
   2793         boolean negate = false;
   2794         int idx;
   2795 
   2796         if (xa == 0.0) { // Matches +/- 0.0; return correct sign
   2797             return leftPlane ? copySign(Math.PI, xa) : xa;
   2798         }
   2799 
   2800         if (xa < 0) {
   2801             // negative
   2802             xa = -xa;
   2803             xb = -xb;
   2804             negate = true;
   2805         }
   2806 
   2807         if (xa > 1.633123935319537E16) { // Very large input
   2808             return (negate ^ leftPlane) ? (-Math.PI/2.0) : (Math.PI/2.0);
   2809         }
   2810 
   2811         /* Estimate the closest tabulated arctan value, compute eps = xa-tangentTable */
   2812         if (xa < 1.0) {
   2813             idx = (int) (((-1.7168146928204136 * xa * xa + 8.0) * xa) + 0.5);
   2814         } else {
   2815             double temp = 1.0/xa;
   2816             idx = (int) (-((-1.7168146928204136 * temp * temp + 8.0) * temp) + 13.07);
   2817         }
   2818         double epsA = xa - TANGENT_TABLE_A[idx];
   2819         double epsB = -(epsA - xa + TANGENT_TABLE_A[idx]);
   2820         epsB += xb - TANGENT_TABLE_B[idx];
   2821 
   2822         double temp = epsA + epsB;
   2823         epsB = -(temp - epsA - epsB);
   2824         epsA = temp;
   2825 
   2826         /* Compute eps = eps / (1.0 + xa*tangent) */
   2827         temp = xa * HEX_40000000;
   2828         double ya = xa + temp - temp;
   2829         double yb = xb + xa - ya;
   2830         xa = ya;
   2831         xb += yb;
   2832 
   2833         //if (idx > 8 || idx == 0)
   2834         if (idx == 0) {
   2835             /* If the slope of the arctan is gentle enough (< 0.45), this approximation will suffice */
   2836             //double denom = 1.0 / (1.0 + xa*tangentTableA[idx] + xb*tangentTableA[idx] + xa*tangentTableB[idx] + xb*tangentTableB[idx]);
   2837             double denom = 1.0 / (1.0 + (xa + xb) * (TANGENT_TABLE_A[idx] + TANGENT_TABLE_B[idx]));
   2838             //double denom = 1.0 / (1.0 + xa*tangentTableA[idx]);
   2839             ya = epsA * denom;
   2840             yb = epsB * denom;
   2841         } else {
   2842             double temp2 = xa * TANGENT_TABLE_A[idx];
   2843             double za = 1.0 + temp2;
   2844             double zb = -(za - 1.0 - temp2);
   2845             temp2 = xb * TANGENT_TABLE_A[idx] + xa * TANGENT_TABLE_B[idx];
   2846             temp = za + temp2;
   2847             zb += -(temp - za - temp2);
   2848             za = temp;
   2849 
   2850             zb += xb * TANGENT_TABLE_B[idx];
   2851             ya = epsA / za;
   2852 
   2853             temp = ya * HEX_40000000;
   2854             final double yaa = (ya + temp) - temp;
   2855             final double yab = ya - yaa;
   2856 
   2857             temp = za * HEX_40000000;
   2858             final double zaa = (za + temp) - temp;
   2859             final double zab = za - zaa;
   2860 
   2861             /* Correct for rounding in division */
   2862             yb = (epsA - yaa * zaa - yaa * zab - yab * zaa - yab * zab) / za;
   2863 
   2864             yb += -epsA * zb / za / za;
   2865             yb += epsB / za;
   2866         }
   2867 
   2868 
   2869         epsA = ya;
   2870         epsB = yb;
   2871 
   2872         /* Evaluate polynomial */
   2873         double epsA2 = epsA*epsA;
   2874 
   2875         /*
   2876     yb = -0.09001346640161823;
   2877     yb = yb * epsA2 + 0.11110718400605211;
   2878     yb = yb * epsA2 + -0.1428571349122913;
   2879     yb = yb * epsA2 + 0.19999999999273194;
   2880     yb = yb * epsA2 + -0.33333333333333093;
   2881     yb = yb * epsA2 * epsA;
   2882          */
   2883 
   2884         yb = 0.07490822288864472;
   2885         yb = yb * epsA2 + -0.09088450866185192;
   2886         yb = yb * epsA2 + 0.11111095942313305;
   2887         yb = yb * epsA2 + -0.1428571423679182;
   2888         yb = yb * epsA2 + 0.19999999999923582;
   2889         yb = yb * epsA2 + -0.33333333333333287;
   2890         yb = yb * epsA2 * epsA;
   2891 
   2892 
   2893         ya = epsA;
   2894 
   2895         temp = ya + yb;
   2896         yb = -(temp - ya - yb);
   2897         ya = temp;
   2898 
   2899         /* Add in effect of epsB.   atan'(x) = 1/(1+x^2) */
   2900         yb += epsB / (1.0 + epsA * epsA);
   2901 
   2902         double result;
   2903         double resultb;
   2904 
   2905         //result = yb + eighths[idx] + ya;
   2906         double za = EIGHTHS[idx] + ya;
   2907         double zb = -(za - EIGHTHS[idx] - ya);
   2908         temp = za + yb;
   2909         zb += -(temp - za - yb);
   2910         za = temp;
   2911 
   2912         result = za + zb;
   2913         resultb = -(result - za - zb);
   2914 
   2915         if (leftPlane) {
   2916             // Result is in the left plane
   2917             final double pia = 1.5707963267948966*2.0;
   2918             final double pib = 6.123233995736766E-17*2.0;
   2919 
   2920             za = pia - result;
   2921             zb = -(za - pia + result);
   2922             zb += pib - resultb;
   2923 
   2924             result = za + zb;
   2925             resultb = -(result - za - zb);
   2926         }
   2927 
   2928 
   2929         if (negate ^ leftPlane) {
   2930             result = -result;
   2931         }
   2932 
   2933         return result;
   2934     }
   2935 
   2936     /**
   2937      * Two arguments arctangent function
   2938      * @param y ordinate
   2939      * @param x abscissa
   2940      * @return phase angle of point (x,y) between {@code -PI} and {@code PI}
   2941      */
   2942     public static double atan2(double y, double x) {
   2943         if (x !=x || y != y) {
   2944             return Double.NaN;
   2945         }
   2946 
   2947         if (y == 0.0) {
   2948             double result = x*y;
   2949             double invx = 1.0/x;
   2950             double invy = 1.0/y;
   2951 
   2952             if (invx == 0.0) { // X is infinite
   2953                 if (x > 0) {
   2954                     return y; // return +/- 0.0
   2955                 } else {
   2956                     return copySign(Math.PI, y);
   2957                 }
   2958             }
   2959 
   2960             if (x < 0.0 || invx < 0.0) {
   2961                 if (y < 0.0 || invy < 0.0) {
   2962                     return -Math.PI;
   2963                 } else {
   2964                     return Math.PI;
   2965                 }
   2966             } else {
   2967                 return result;
   2968             }
   2969         }
   2970 
   2971         // y cannot now be zero
   2972 
   2973         if (y == Double.POSITIVE_INFINITY) {
   2974             if (x == Double.POSITIVE_INFINITY) {
   2975                 return Math.PI/4.0;
   2976             }
   2977 
   2978             if (x == Double.NEGATIVE_INFINITY) {
   2979                 return Math.PI*3.0/4.0;
   2980             }
   2981 
   2982             return Math.PI/2.0;
   2983         }
   2984 
   2985         if (y == Double.NEGATIVE_INFINITY) {
   2986             if (x == Double.POSITIVE_INFINITY) {
   2987                 return -Math.PI/4.0;
   2988             }
   2989 
   2990             if (x == Double.NEGATIVE_INFINITY) {
   2991                 return -Math.PI*3.0/4.0;
   2992             }
   2993 
   2994             return -Math.PI/2.0;
   2995         }
   2996 
   2997         if (x == Double.POSITIVE_INFINITY) {
   2998             if (y > 0.0 || 1/y > 0.0) {
   2999                 return 0.0;
   3000             }
   3001 
   3002             if (y < 0.0 || 1/y < 0.0) {
   3003                 return -0.0;
   3004             }
   3005         }
   3006 
   3007         if (x == Double.NEGATIVE_INFINITY)
   3008         {
   3009             if (y > 0.0 || 1/y > 0.0) {
   3010                 return Math.PI;
   3011             }
   3012 
   3013             if (y < 0.0 || 1/y < 0.0) {
   3014                 return -Math.PI;
   3015             }
   3016         }
   3017 
   3018         // Neither y nor x can be infinite or NAN here
   3019 
   3020         if (x == 0) {
   3021             if (y > 0.0 || 1/y > 0.0) {
   3022                 return Math.PI/2.0;
   3023             }
   3024 
   3025             if (y < 0.0 || 1/y < 0.0) {
   3026                 return -Math.PI/2.0;
   3027             }
   3028         }
   3029 
   3030         // Compute ratio r = y/x
   3031         final double r = y/x;
   3032         if (Double.isInfinite(r)) { // bypass calculations that can create NaN
   3033             return atan(r, 0, x < 0);
   3034         }
   3035 
   3036         double ra = doubleHighPart(r);
   3037         double rb = r - ra;
   3038 
   3039         // Split x
   3040         final double xa = doubleHighPart(x);
   3041         final double xb = x - xa;
   3042 
   3043         rb += (y - ra * xa - ra * xb - rb * xa - rb * xb) / x;
   3044 
   3045         double temp = ra + rb;
   3046         rb = -(temp - ra - rb);
   3047         ra = temp;
   3048 
   3049         if (ra == 0) { // Fix up the sign so atan works correctly
   3050             ra = copySign(0.0, y);
   3051         }
   3052 
   3053         // Call atan
   3054         double result = atan(ra, rb, x < 0);
   3055 
   3056         return result;
   3057     }
   3058 
   3059     /** Compute the arc sine of a number.
   3060      * @param x number on which evaluation is done
   3061      * @return arc sine of x
   3062      */
   3063     public static double asin(double x) {
   3064       if (x != x) {
   3065           return Double.NaN;
   3066       }
   3067 
   3068       if (x > 1.0 || x < -1.0) {
   3069           return Double.NaN;
   3070       }
   3071 
   3072       if (x == 1.0) {
   3073           return Math.PI/2.0;
   3074       }
   3075 
   3076       if (x == -1.0) {
   3077           return -Math.PI/2.0;
   3078       }
   3079 
   3080       if (x == 0.0) { // Matches +/- 0.0; return correct sign
   3081           return x;
   3082       }
   3083 
   3084       /* Compute asin(x) = atan(x/sqrt(1-x*x)) */
   3085 
   3086       /* Split x */
   3087       double temp = x * HEX_40000000;
   3088       final double xa = x + temp - temp;
   3089       final double xb = x - xa;
   3090 
   3091       /* Square it */
   3092       double ya = xa*xa;
   3093       double yb = xa*xb*2.0 + xb*xb;
   3094 
   3095       /* Subtract from 1 */
   3096       ya = -ya;
   3097       yb = -yb;
   3098 
   3099       double za = 1.0 + ya;
   3100       double zb = -(za - 1.0 - ya);
   3101 
   3102       temp = za + yb;
   3103       zb += -(temp - za - yb);
   3104       za = temp;
   3105 
   3106       /* Square root */
   3107       double y;
   3108       y = sqrt(za);
   3109       temp = y * HEX_40000000;
   3110       ya = y + temp - temp;
   3111       yb = y - ya;
   3112 
   3113       /* Extend precision of sqrt */
   3114       yb += (za - ya*ya - 2*ya*yb - yb*yb) / (2.0*y);
   3115 
   3116       /* Contribution of zb to sqrt */
   3117       double dx = zb / (2.0*y);
   3118 
   3119       // Compute ratio r = x/y
   3120       double r = x/y;
   3121       temp = r * HEX_40000000;
   3122       double ra = r + temp - temp;
   3123       double rb = r - ra;
   3124 
   3125       rb += (x - ra*ya - ra*yb - rb*ya - rb*yb) / y;  // Correct for rounding in division
   3126       rb += -x * dx / y / y;  // Add in effect additional bits of sqrt.
   3127 
   3128       temp = ra + rb;
   3129       rb = -(temp - ra - rb);
   3130       ra = temp;
   3131 
   3132       return atan(ra, rb, false);
   3133     }
   3134 
   3135     /** Compute the arc cosine of a number.
   3136      * @param x number on which evaluation is done
   3137      * @return arc cosine of x
   3138      */
   3139     public static double acos(double x) {
   3140       if (x != x) {
   3141           return Double.NaN;
   3142       }
   3143 
   3144       if (x > 1.0 || x < -1.0) {
   3145           return Double.NaN;
   3146       }
   3147 
   3148       if (x == -1.0) {
   3149           return Math.PI;
   3150       }
   3151 
   3152       if (x == 1.0) {
   3153           return 0.0;
   3154       }
   3155 
   3156       if (x == 0) {
   3157           return Math.PI/2.0;
   3158       }
   3159 
   3160       /* Compute acos(x) = atan(sqrt(1-x*x)/x) */
   3161 
   3162       /* Split x */
   3163       double temp = x * HEX_40000000;
   3164       final double xa = x + temp - temp;
   3165       final double xb = x - xa;
   3166 
   3167       /* Square it */
   3168       double ya = xa*xa;
   3169       double yb = xa*xb*2.0 + xb*xb;
   3170 
   3171       /* Subtract from 1 */
   3172       ya = -ya;
   3173       yb = -yb;
   3174 
   3175       double za = 1.0 + ya;
   3176       double zb = -(za - 1.0 - ya);
   3177 
   3178       temp = za + yb;
   3179       zb += -(temp - za - yb);
   3180       za = temp;
   3181 
   3182       /* Square root */
   3183       double y = sqrt(za);
   3184       temp = y * HEX_40000000;
   3185       ya = y + temp - temp;
   3186       yb = y - ya;
   3187 
   3188       /* Extend precision of sqrt */
   3189       yb += (za - ya*ya - 2*ya*yb - yb*yb) / (2.0*y);
   3190 
   3191       /* Contribution of zb to sqrt */
   3192       yb += zb / (2.0*y);
   3193       y = ya+yb;
   3194       yb = -(y - ya - yb);
   3195 
   3196       // Compute ratio r = y/x
   3197       double r = y/x;
   3198 
   3199       // Did r overflow?
   3200       if (Double.isInfinite(r)) { // x is effectively zero
   3201           return Math.PI/2; // so return the appropriate value
   3202       }
   3203 
   3204       double ra = doubleHighPart(r);
   3205       double rb = r - ra;
   3206 
   3207       rb += (y - ra*xa - ra*xb - rb*xa - rb*xb) / x;  // Correct for rounding in division
   3208       rb += yb / x;  // Add in effect additional bits of sqrt.
   3209 
   3210       temp = ra + rb;
   3211       rb = -(temp - ra - rb);
   3212       ra = temp;
   3213 
   3214       return atan(ra, rb, x<0);
   3215     }
   3216 
   3217     /** Compute the cubic root of a number.
   3218      * @param x number on which evaluation is done
   3219      * @return cubic root of x
   3220      */
   3221     public static double cbrt(double x) {
   3222       /* Convert input double to bits */
   3223       long inbits = Double.doubleToLongBits(x);
   3224       int exponent = (int) ((inbits >> 52) & 0x7ff) - 1023;
   3225       boolean subnormal = false;
   3226 
   3227       if (exponent == -1023) {
   3228           if (x == 0) {
   3229               return x;
   3230           }
   3231 
   3232           /* Subnormal, so normalize */
   3233           subnormal = true;
   3234           x *= 1.8014398509481984E16;  // 2^54
   3235           inbits = Double.doubleToLongBits(x);
   3236           exponent = (int) ((inbits >> 52) & 0x7ff) - 1023;
   3237       }
   3238 
   3239       if (exponent == 1024) {
   3240           // Nan or infinity.  Don't care which.
   3241           return x;
   3242       }
   3243 
   3244       /* Divide the exponent by 3 */
   3245       int exp3 = exponent / 3;
   3246 
   3247       /* p2 will be the nearest power of 2 to x with its exponent divided by 3 */
   3248       double p2 = Double.longBitsToDouble((inbits & 0x8000000000000000L) |
   3249                                           (long)(((exp3 + 1023) & 0x7ff)) << 52);
   3250 
   3251       /* This will be a number between 1 and 2 */
   3252       final double mant = Double.longBitsToDouble((inbits & 0x000fffffffffffffL) | 0x3ff0000000000000L);
   3253 
   3254       /* Estimate the cube root of mant by polynomial */
   3255       double est = -0.010714690733195933;
   3256       est = est * mant + 0.0875862700108075;
   3257       est = est * mant + -0.3058015757857271;
   3258       est = est * mant + 0.7249995199969751;
   3259       est = est * mant + 0.5039018405998233;
   3260 
   3261       est *= CBRTTWO[exponent % 3 + 2];
   3262 
   3263       // est should now be good to about 15 bits of precision.   Do 2 rounds of
   3264       // Newton's method to get closer,  this should get us full double precision
   3265       // Scale down x for the purpose of doing newtons method.  This avoids over/under flows.
   3266       final double xs = x / (p2*p2*p2);
   3267       est += (xs - est*est*est) / (3*est*est);
   3268       est += (xs - est*est*est) / (3*est*est);
   3269 
   3270       // Do one round of Newton's method in extended precision to get the last bit right.
   3271       double temp = est * HEX_40000000;
   3272       double ya = est + temp - temp;
   3273       double yb = est - ya;
   3274 
   3275       double za = ya * ya;
   3276       double zb = ya * yb * 2.0 + yb * yb;
   3277       temp = za * HEX_40000000;
   3278       double temp2 = za + temp - temp;
   3279       zb += za - temp2;
   3280       za = temp2;
   3281 
   3282       zb = za * yb + ya * zb + zb * yb;
   3283       za = za * ya;
   3284 
   3285       double na = xs - za;
   3286       double nb = -(na - xs + za);
   3287       nb -= zb;
   3288 
   3289       est += (na+nb)/(3*est*est);
   3290 
   3291       /* Scale by a power of two, so this is exact. */
   3292       est *= p2;
   3293 
   3294       if (subnormal) {
   3295           est *= 3.814697265625E-6;  // 2^-18
   3296       }
   3297 
   3298       return est;
   3299     }
   3300 
   3301     /**
   3302      *  Convert degrees to radians, with error of less than 0.5 ULP
   3303      *  @param x angle in degrees
   3304      *  @return x converted into radians
   3305      */
   3306     public static double toRadians(double x)
   3307     {
   3308         if (Double.isInfinite(x) || x == 0.0) { // Matches +/- 0.0; return correct sign
   3309             return x;
   3310         }
   3311 
   3312         // These are PI/180 split into high and low order bits
   3313         final double facta = 0.01745329052209854;
   3314         final double factb = 1.997844754509471E-9;
   3315 
   3316         double xa = doubleHighPart(x);
   3317         double xb = x - xa;
   3318 
   3319         double result = xb * factb + xb * facta + xa * factb + xa * facta;
   3320         if (result == 0) {
   3321             result = result * x; // ensure correct sign if calculation underflows
   3322         }
   3323         return result;
   3324     }
   3325 
   3326     /**
   3327      *  Convert radians to degrees, with error of less than 0.5 ULP
   3328      *  @param x angle in radians
   3329      *  @return x converted into degrees
   3330      */
   3331     public static double toDegrees(double x)
   3332     {
   3333         if (Double.isInfinite(x) || x == 0.0) { // Matches +/- 0.0; return correct sign
   3334             return x;
   3335         }
   3336 
   3337         // These are 180/PI split into high and low order bits
   3338         final double facta = 57.2957763671875;
   3339         final double factb = 3.145894820876798E-6;
   3340 
   3341         double xa = doubleHighPart(x);
   3342         double xb = x - xa;
   3343 
   3344         return xb * factb + xb * facta + xa * factb + xa * facta;
   3345     }
   3346 
   3347     /**
   3348      * Absolute value.
   3349      * @param x number from which absolute value is requested
   3350      * @return abs(x)
   3351      */
   3352     public static int abs(final int x) {
   3353         return (x < 0) ? -x : x;
   3354     }
   3355 
   3356     /**
   3357      * Absolute value.
   3358      * @param x number from which absolute value is requested
   3359      * @return abs(x)
   3360      */
   3361     public static long abs(final long x) {
   3362         return (x < 0l) ? -x : x;
   3363     }
   3364 
   3365     /**
   3366      * Absolute value.
   3367      * @param x number from which absolute value is requested
   3368      * @return abs(x)
   3369      */
   3370     public static float abs(final float x) {
   3371         return (x < 0.0f) ? -x : (x == 0.0f) ? 0.0f : x; // -0.0 => +0.0
   3372     }
   3373 
   3374     /**
   3375      * Absolute value.
   3376      * @param x number from which absolute value is requested
   3377      * @return abs(x)
   3378      */
   3379     public static double abs(double x) {
   3380         return (x < 0.0) ? -x : (x == 0.0) ? 0.0 : x; // -0.0 => +0.0
   3381     }
   3382 
   3383     /**
   3384      * Compute least significant bit (Unit in Last Position) for a number.
   3385      * @param x number from which ulp is requested
   3386      * @return ulp(x)
   3387      */
   3388     public static double ulp(double x) {
   3389         if (Double.isInfinite(x)) {
   3390             return Double.POSITIVE_INFINITY;
   3391         }
   3392         return abs(x - Double.longBitsToDouble(Double.doubleToLongBits(x) ^ 1));
   3393     }
   3394 
   3395     /**
   3396      * Compute least significant bit (Unit in Last Position) for a number.
   3397      * @param x number from which ulp is requested
   3398      * @return ulp(x)
   3399      */
   3400     public static float ulp(float x) {
   3401         if (Float.isInfinite(x)) {
   3402             return Float.POSITIVE_INFINITY;
   3403         }
   3404         return abs(x - Float.intBitsToFloat(Float.floatToIntBits(x) ^ 1));
   3405     }
   3406 
   3407     /**
   3408      * Multiply a double number by a power of 2.
   3409      * @param d number to multiply
   3410      * @param n power of 2
   3411      * @return d &times; 2<sup>n</sup>
   3412      */
   3413     public static double scalb(final double d, final int n) {
   3414 
   3415         // first simple and fast handling when 2^n can be represented using normal numbers
   3416         if ((n > -1023) && (n < 1024)) {
   3417             return d * Double.longBitsToDouble(((long) (n + 1023)) << 52);
   3418         }
   3419 
   3420         // handle special cases
   3421         if (Double.isNaN(d) || Double.isInfinite(d) || (d == 0)) {
   3422             return d;
   3423         }
   3424         if (n < -2098) {
   3425             return (d > 0) ? 0.0 : -0.0;
   3426         }
   3427         if (n > 2097) {
   3428             return (d > 0) ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY;
   3429         }
   3430 
   3431         // decompose d
   3432         final long bits = Double.doubleToLongBits(d);
   3433         final long sign = bits & 0x8000000000000000L;
   3434         int  exponent   = ((int) (bits >>> 52)) & 0x7ff;
   3435         long mantissa   = bits & 0x000fffffffffffffL;
   3436 
   3437         // compute scaled exponent
   3438         int scaledExponent = exponent + n;
   3439 
   3440         if (n < 0) {
   3441             // we are really in the case n <= -1023
   3442             if (scaledExponent > 0) {
   3443                 // both the input and the result are normal numbers, we only adjust the exponent
   3444                 return Double.longBitsToDouble(sign | (((long) scaledExponent) << 52) | mantissa);
   3445             } else if (scaledExponent > -53) {
   3446                 // the input is a normal number and the result is a subnormal number
   3447 
   3448                 // recover the hidden mantissa bit
   3449                 mantissa = mantissa | (1L << 52);
   3450 
   3451                 // scales down complete mantissa, hence losing least significant bits
   3452                 final long mostSignificantLostBit = mantissa & (1L << (-scaledExponent));
   3453                 mantissa = mantissa >>> (1 - scaledExponent);
   3454                 if (mostSignificantLostBit != 0) {
   3455                     // we need to add 1 bit to round up the result
   3456                     mantissa++;
   3457                 }
   3458                 return Double.longBitsToDouble(sign | mantissa);
   3459 
   3460             } else {
   3461                 // no need to compute the mantissa, the number scales down to 0
   3462                 return (sign == 0L) ? 0.0 : -0.0;
   3463             }
   3464         } else {
   3465             // we are really in the case n >= 1024
   3466             if (exponent == 0) {
   3467 
   3468                 // the input number is subnormal, normalize it
   3469                 while ((mantissa >>> 52) != 1) {
   3470                     mantissa = mantissa << 1;
   3471                     --scaledExponent;
   3472                 }
   3473                 ++scaledExponent;
   3474                 mantissa = mantissa & 0x000fffffffffffffL;
   3475 
   3476                 if (scaledExponent < 2047) {
   3477                     return Double.longBitsToDouble(sign | (((long) scaledExponent) << 52) | mantissa);
   3478                 } else {
   3479                     return (sign == 0L) ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY;
   3480                 }
   3481 
   3482             } else if (scaledExponent < 2047) {
   3483                 return Double.longBitsToDouble(sign | (((long) scaledExponent) << 52) | mantissa);
   3484             } else {
   3485                 return (sign == 0L) ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY;
   3486             }
   3487         }
   3488 
   3489     }
   3490 
   3491     /**
   3492      * Multiply a float number by a power of 2.
   3493      * @param f number to multiply
   3494      * @param n power of 2
   3495      * @return f &times; 2<sup>n</sup>
   3496      */
   3497     public static float scalb(final float f, final int n) {
   3498 
   3499         // first simple and fast handling when 2^n can be represented using normal numbers
   3500         if ((n > -127) && (n < 128)) {
   3501             return f * Float.intBitsToFloat((n + 127) << 23);
   3502         }
   3503 
   3504         // handle special cases
   3505         if (Float.isNaN(f) || Float.isInfinite(f) || (f == 0f)) {
   3506             return f;
   3507         }
   3508         if (n < -277) {
   3509             return (f > 0) ? 0.0f : -0.0f;
   3510         }
   3511         if (n > 276) {
   3512             return (f > 0) ? Float.POSITIVE_INFINITY : Float.NEGATIVE_INFINITY;
   3513         }
   3514 
   3515         // decompose f
   3516         final int bits = Float.floatToIntBits(f);
   3517         final int sign = bits & 0x80000000;
   3518         int  exponent  = (bits >>> 23) & 0xff;
   3519         int mantissa   = bits & 0x007fffff;
   3520 
   3521         // compute scaled exponent
   3522         int scaledExponent = exponent + n;
   3523 
   3524         if (n < 0) {
   3525             // we are really in the case n <= -127
   3526             if (scaledExponent > 0) {
   3527                 // both the input and the result are normal numbers, we only adjust the exponent
   3528                 return Float.intBitsToFloat(sign | (scaledExponent << 23) | mantissa);
   3529             } else if (scaledExponent > -24) {
   3530                 // the input is a normal number and the result is a subnormal number
   3531 
   3532                 // recover the hidden mantissa bit
   3533                 mantissa = mantissa | (1 << 23);
   3534 
   3535                 // scales down complete mantissa, hence losing least significant bits
   3536                 final int mostSignificantLostBit = mantissa & (1 << (-scaledExponent));
   3537                 mantissa = mantissa >>> (1 - scaledExponent);
   3538                 if (mostSignificantLostBit != 0) {
   3539                     // we need to add 1 bit to round up the result
   3540                     mantissa++;
   3541                 }
   3542                 return Float.intBitsToFloat(sign | mantissa);
   3543 
   3544             } else {
   3545                 // no need to compute the mantissa, the number scales down to 0
   3546                 return (sign == 0) ? 0.0f : -0.0f;
   3547             }
   3548         } else {
   3549             // we are really in the case n >= 128
   3550             if (exponent == 0) {
   3551 
   3552                 // the input number is subnormal, normalize it
   3553                 while ((mantissa >>> 23) != 1) {
   3554                     mantissa = mantissa << 1;
   3555                     --scaledExponent;
   3556                 }
   3557                 ++scaledExponent;
   3558                 mantissa = mantissa & 0x007fffff;
   3559 
   3560                 if (scaledExponent < 255) {
   3561                     return Float.intBitsToFloat(sign | (scaledExponent << 23) | mantissa);
   3562                 } else {
   3563                     return (sign == 0) ? Float.POSITIVE_INFINITY : Float.NEGATIVE_INFINITY;
   3564                 }
   3565 
   3566             } else if (scaledExponent < 255) {
   3567                 return Float.intBitsToFloat(sign | (scaledExponent << 23) | mantissa);
   3568             } else {
   3569                 return (sign == 0) ? Float.POSITIVE_INFINITY : Float.NEGATIVE_INFINITY;
   3570             }
   3571         }
   3572 
   3573     }
   3574 
   3575     /**
   3576      * Get the next machine representable number after a number, moving
   3577      * in the direction of another number.
   3578      * <p>
   3579      * The ordering is as follows (increasing):
   3580      * <ul>
   3581      * <li>-INFINITY</li>
   3582      * <li>-MAX_VALUE</li>
   3583      * <li>-MIN_VALUE</li>
   3584      * <li>-0.0</li>
   3585      * <li>+0.0</li>
   3586      * <li>+MIN_VALUE</li>
   3587      * <li>+MAX_VALUE</li>
   3588      * <li>+INFINITY</li>
   3589      * <li></li>
   3590      * <p>
   3591      * If arguments compare equal, then the second argument is returned.
   3592      * <p>
   3593      * If {@code direction} is greater than {@code d},
   3594      * the smallest machine representable number strictly greater than
   3595      * {@code d} is returned; if less, then the largest representable number
   3596      * strictly less than {@code d} is returned.</p>
   3597      * <p>
   3598      * If {@code d} is infinite and direction does not
   3599      * bring it back to finite numbers, it is returned unchanged.</p>
   3600      *
   3601      * @param d base number
   3602      * @param direction (the only important thing is whether
   3603      * {@code direction} is greater or smaller than {@code d})
   3604      * @return the next machine representable number in the specified direction
   3605      */
   3606     public static double nextAfter(double d, double direction) {
   3607 
   3608         // handling of some important special cases
   3609         if (Double.isNaN(d) || Double.isNaN(direction)) {
   3610             return Double.NaN;
   3611         } else if (d == direction) {
   3612             return direction;
   3613         } else if (Double.isInfinite(d)) {
   3614             return (d < 0) ? -Double.MAX_VALUE : Double.MAX_VALUE;
   3615         } else if (d == 0) {
   3616             return (direction < 0) ? -Double.MIN_VALUE : Double.MIN_VALUE;
   3617         }
   3618         // special cases MAX_VALUE to infinity and  MIN_VALUE to 0
   3619         // are handled just as normal numbers
   3620 
   3621         final long bits = Double.doubleToLongBits(d);
   3622         final long sign = bits & 0x8000000000000000L;
   3623         if ((direction < d) ^ (sign == 0L)) {
   3624             return Double.longBitsToDouble(sign | ((bits & 0x7fffffffffffffffL) + 1));
   3625         } else {
   3626             return Double.longBitsToDouble(sign | ((bits & 0x7fffffffffffffffL) - 1));
   3627         }
   3628 
   3629     }
   3630 
   3631     /**
   3632      * Get the next machine representable number after a number, moving
   3633      * in the direction of another number.
   3634      * <p>
   3635      * The ordering is as follows (increasing):
   3636      * <ul>
   3637      * <li>-INFINITY</li>
   3638      * <li>-MAX_VALUE</li>
   3639      * <li>-MIN_VALUE</li>
   3640      * <li>-0.0</li>
   3641      * <li>+0.0</li>
   3642      * <li>+MIN_VALUE</li>
   3643      * <li>+MAX_VALUE</li>
   3644      * <li>+INFINITY</li>
   3645      * <li></li>
   3646      * <p>
   3647      * If arguments compare equal, then the second argument is returned.
   3648      * <p>
   3649      * If {@code direction} is greater than {@code f},
   3650      * the smallest machine representable number strictly greater than
   3651      * {@code f} is returned; if less, then the largest representable number
   3652      * strictly less than {@code f} is returned.</p>
   3653      * <p>
   3654      * If {@code f} is infinite and direction does not
   3655      * bring it back to finite numbers, it is returned unchanged.</p>
   3656      *
   3657      * @param f base number
   3658      * @param direction (the only important thing is whether
   3659      * {@code direction} is greater or smaller than {@code f})
   3660      * @return the next machine representable number in the specified direction
   3661      */
   3662     public static float nextAfter(final float f, final double direction) {
   3663 
   3664         // handling of some important special cases
   3665         if (Double.isNaN(f) || Double.isNaN(direction)) {
   3666             return Float.NaN;
   3667         } else if (f == direction) {
   3668             return (float) direction;
   3669         } else if (Float.isInfinite(f)) {
   3670             return (f < 0f) ? -Float.MAX_VALUE : Float.MAX_VALUE;
   3671         } else if (f == 0f) {
   3672             return (direction < 0) ? -Float.MIN_VALUE : Float.MIN_VALUE;
   3673         }
   3674         // special cases MAX_VALUE to infinity and  MIN_VALUE to 0
   3675         // are handled just as normal numbers
   3676 
   3677         final int bits = Float.floatToIntBits(f);
   3678         final int sign = bits & 0x80000000;
   3679         if ((direction < f) ^ (sign == 0)) {
   3680             return Float.intBitsToFloat(sign | ((bits & 0x7fffffff) + 1));
   3681         } else {
   3682             return Float.intBitsToFloat(sign | ((bits & 0x7fffffff) - 1));
   3683         }
   3684 
   3685     }
   3686 
   3687     /** Get the largest whole number smaller than x.
   3688      * @param x number from which floor is requested
   3689      * @return a double number f such that f is an integer f <= x < f + 1.0
   3690      */
   3691     public static double floor(double x) {
   3692         long y;
   3693 
   3694         if (x != x) { // NaN
   3695             return x;
   3696         }
   3697 
   3698         if (x >= TWO_POWER_52 || x <= -TWO_POWER_52) {
   3699             return x;
   3700         }
   3701 
   3702         y = (long) x;
   3703         if (x < 0 && y != x) {
   3704             y--;
   3705         }
   3706 
   3707         if (y == 0) {
   3708             return x*y;
   3709         }
   3710 
   3711         return y;
   3712     }
   3713 
   3714     /** Get the smallest whole number larger than x.
   3715      * @param x number from which ceil is requested
   3716      * @return a double number c such that c is an integer c - 1.0 < x <= c
   3717      */
   3718     public static double ceil(double x) {
   3719         double y;
   3720 
   3721         if (x != x) { // NaN
   3722             return x;
   3723         }
   3724 
   3725         y = floor(x);
   3726         if (y == x) {
   3727             return y;
   3728         }
   3729 
   3730         y += 1.0;
   3731 
   3732         if (y == 0) {
   3733             return x*y;
   3734         }
   3735 
   3736         return y;
   3737     }
   3738 
   3739     /** Get the whole number that is the nearest to x, or the even one if x is exactly half way between two integers.
   3740      * @param x number from which nearest whole number is requested
   3741      * @return a double number r such that r is an integer r - 0.5 <= x <= r + 0.5
   3742      */
   3743     public static double rint(double x) {
   3744         double y = floor(x);
   3745         double d = x - y;
   3746 
   3747         if (d > 0.5) {
   3748             if (y == -1.0) {
   3749                 return -0.0; // Preserve sign of operand
   3750             }
   3751             return y+1.0;
   3752         }
   3753         if (d < 0.5) {
   3754             return y;
   3755         }
   3756 
   3757         /* half way, round to even */
   3758         long z = (long) y;
   3759         return (z & 1) == 0 ? y : y + 1.0;
   3760     }
   3761 
   3762     /** Get the closest long to x.
   3763      * @param x number from which closest long is requested
   3764      * @return closest long to x
   3765      */
   3766     public static long round(double x) {
   3767         return (long) floor(x + 0.5);
   3768     }
   3769 
   3770     /** Get the closest int to x.
   3771      * @param x number from which closest int is requested
   3772      * @return closest int to x
   3773      */
   3774     public static int round(final float x) {
   3775         return (int) floor(x + 0.5f);
   3776     }
   3777 
   3778     /** Compute the minimum of two values
   3779      * @param a first value
   3780      * @param b second value
   3781      * @return a if a is lesser or equal to b, b otherwise
   3782      */
   3783     public static int min(final int a, final int b) {
   3784         return (a <= b) ? a : b;
   3785     }
   3786 
   3787     /** Compute the minimum of two values
   3788      * @param a first value
   3789      * @param b second value
   3790      * @return a if a is lesser or equal to b, b otherwise
   3791      */
   3792     public static long min(final long a, final long b) {
   3793         return (a <= b) ? a : b;
   3794     }
   3795 
   3796     /** Compute the minimum of two values
   3797      * @param a first value
   3798      * @param b second value
   3799      * @return a if a is lesser or equal to b, b otherwise
   3800      */
   3801     public static float min(final float a, final float b) {
   3802         if (a > b) {
   3803             return b;
   3804         }
   3805         if (a < b) {
   3806             return a;
   3807         }
   3808         /* if either arg is NaN, return NaN */
   3809         if (a != b) {
   3810             return Float.NaN;
   3811         }
   3812         /* min(+0.0,-0.0) == -0.0 */
   3813         /* 0x80000000 == Float.floatToRawIntBits(-0.0d) */
   3814         int bits = Float.floatToRawIntBits(a);
   3815         if (bits == 0x80000000) {
   3816             return a;
   3817         }
   3818         return b;
   3819     }
   3820 
   3821     /** Compute the minimum of two values
   3822      * @param a first value
   3823      * @param b second value
   3824      * @return a if a is lesser or equal to b, b otherwise
   3825      */
   3826     public static double min(final double a, final double b) {
   3827         if (a > b) {
   3828             return b;
   3829         }
   3830         if (a < b) {
   3831             return a;
   3832         }
   3833         /* if either arg is NaN, return NaN */
   3834         if (a != b) {
   3835             return Double.NaN;
   3836         }
   3837         /* min(+0.0,-0.0) == -0.0 */
   3838         /* 0x8000000000000000L == Double.doubleToRawLongBits(-0.0d) */
   3839         long bits = Double.doubleToRawLongBits(a);
   3840         if (bits == 0x8000000000000000L) {
   3841             return a;
   3842         }
   3843         return b;
   3844     }
   3845 
   3846     /** Compute the maximum of two values
   3847      * @param a first value
   3848      * @param b second value
   3849      * @return b if a is lesser or equal to b, a otherwise
   3850      */
   3851     public static int max(final int a, final int b) {
   3852         return (a <= b) ? b : a;
   3853     }
   3854 
   3855     /** Compute the maximum of two values
   3856      * @param a first value
   3857      * @param b second value
   3858      * @return b if a is lesser or equal to b, a otherwise
   3859      */
   3860     public static long max(final long a, final long b) {
   3861         return (a <= b) ? b : a;
   3862     }
   3863 
   3864     /** Compute the maximum of two values
   3865      * @param a first value
   3866      * @param b second value
   3867      * @return b if a is lesser or equal to b, a otherwise
   3868      */
   3869     public static float max(final float a, final float b) {
   3870         if (a > b) {
   3871             return a;
   3872         }
   3873         if (a < b) {
   3874             return b;
   3875         }
   3876         /* if either arg is NaN, return NaN */
   3877         if (a != b) {
   3878             return Float.NaN;
   3879         }
   3880         /* min(+0.0,-0.0) == -0.0 */
   3881         /* 0x80000000 == Float.floatToRawIntBits(-0.0d) */
   3882         int bits = Float.floatToRawIntBits(a);
   3883         if (bits == 0x80000000) {
   3884             return b;
   3885         }
   3886         return a;
   3887     }
   3888 
   3889     /** Compute the maximum of two values
   3890      * @param a first value
   3891      * @param b second value
   3892      * @return b if a is lesser or equal to b, a otherwise
   3893      */
   3894     public static double max(final double a, final double b) {
   3895         if (a > b) {
   3896             return a;
   3897         }
   3898         if (a < b) {
   3899             return b;
   3900         }
   3901         /* if either arg is NaN, return NaN */
   3902         if (a != b) {
   3903             return Double.NaN;
   3904         }
   3905         /* min(+0.0,-0.0) == -0.0 */
   3906         /* 0x8000000000000000L == Double.doubleToRawLongBits(-0.0d) */
   3907         long bits = Double.doubleToRawLongBits(a);
   3908         if (bits == 0x8000000000000000L) {
   3909             return b;
   3910         }
   3911         return a;
   3912     }
   3913 
   3914     /**
   3915      * Returns the hypotenuse of a triangle with sides {@code x} and {@code y}
   3916      * - sqrt(<i>x</i><sup>2</sup>&nbsp;+<i>y</i><sup>2</sup>)<br/>
   3917      * avoiding intermediate overflow or underflow.
   3918      *
   3919      * <ul>
   3920      * <li> If either argument is infinite, then the result is positive infinity.</li>
   3921      * <li> else, if either argument is NaN then the result is NaN.</li>
   3922      * </ul>
   3923      *
   3924      * @param x a value
   3925      * @param y a value
   3926      * @return sqrt(<i>x</i><sup>2</sup>&nbsp;+<i>y</i><sup>2</sup>)
   3927      */
   3928     public static double hypot(final double x, final double y) {
   3929         if (Double.isInfinite(x) || Double.isInfinite(y)) {
   3930             return Double.POSITIVE_INFINITY;
   3931         } else if (Double.isNaN(x) || Double.isNaN(y)) {
   3932             return Double.NaN;
   3933         } else {
   3934 
   3935             final int expX = getExponent(x);
   3936             final int expY = getExponent(y);
   3937             if (expX > expY + 27) {
   3938                 // y is neglectible with respect to x
   3939                 return abs(x);
   3940             } else if (expY > expX + 27) {
   3941                 // x is neglectible with respect to y
   3942                 return abs(y);
   3943             } else {
   3944 
   3945                 // find an intermediate scale to avoid both overflow and underflow
   3946                 final int middleExp = (expX + expY) / 2;
   3947 
   3948                 // scale parameters without losing precision
   3949                 final double scaledX = scalb(x, -middleExp);
   3950                 final double scaledY = scalb(y, -middleExp);
   3951 
   3952                 // compute scaled hypotenuse
   3953                 final double scaledH = sqrt(scaledX * scaledX + scaledY * scaledY);
   3954 
   3955                 // remove scaling
   3956                 return scalb(scaledH, middleExp);
   3957 
   3958             }
   3959 
   3960         }
   3961     }
   3962 
   3963     /**
   3964      * Computes the remainder as prescribed by the IEEE 754 standard.
   3965      * The remainder value is mathematically equal to {@code x - y*n}
   3966      * where {@code n} is the mathematical integer closest to the exact mathematical value
   3967      * of the quotient {@code x/y}.
   3968      * If two mathematical integers are equally close to {@code x/y} then
   3969      * {@code n} is the integer that is even.
   3970      * <p>
   3971      * <ul>
   3972      * <li>If either operand is NaN, the result is NaN.</li>
   3973      * <li>If the result is not NaN, the sign of the result equals the sign of the dividend.</li>
   3974      * <li>If the dividend is an infinity, or the divisor is a zero, or both, the result is NaN.</li>
   3975      * <li>If the dividend is finite and the divisor is an infinity, the result equals the dividend.</li>
   3976      * <li>If the dividend is a zero and the divisor is finite, the result equals the dividend.</li>
   3977      * </ul>
   3978      * <p><b>Note:</b> this implementation currently delegates to {@link StrictMath#IEEEremainder}
   3979      * @param dividend the number to be divided
   3980      * @param divisor the number by which to divide
   3981      * @return the remainder, rounded
   3982      */
   3983     public static double IEEEremainder(double dividend, double divisor) {
   3984         return StrictMath.IEEEremainder(dividend, divisor); // TODO provide our own implementation
   3985     }
   3986 
   3987     /**
   3988      * Returns the first argument with the sign of the second argument.
   3989      * A NaN {@code sign} argument is treated as positive.
   3990      *
   3991      * @param magnitude the value to return
   3992      * @param sign the sign for the returned value
   3993      * @return the magnitude with the same sign as the {@code sign} argument
   3994      */
   3995     public static double copySign(double magnitude, double sign){
   3996         long m = Double.doubleToLongBits(magnitude);
   3997         long s = Double.doubleToLongBits(sign);
   3998         if ((m >= 0 && s >= 0) || (m < 0 && s < 0)) { // Sign is currently OK
   3999             return magnitude;
   4000         }
   4001         return -magnitude; // flip sign
   4002     }
   4003 
   4004     /**
   4005      * Returns the first argument with the sign of the second argument.
   4006      * A NaN {@code sign} argument is treated as positive.
   4007      *
   4008      * @param magnitude the value to return
   4009      * @param sign the sign for the returned value
   4010      * @return the magnitude with the same sign as the {@code sign} argument
   4011      */
   4012     public static float copySign(float magnitude, float sign){
   4013         int m = Float.floatToIntBits(magnitude);
   4014         int s = Float.floatToIntBits(sign);
   4015         if ((m >= 0 && s >= 0) || (m < 0 && s < 0)) { // Sign is currently OK
   4016             return magnitude;
   4017         }
   4018         return -magnitude; // flip sign
   4019     }
   4020 
   4021     /**
   4022      * Return the exponent of a double number, removing the bias.
   4023      * <p>
   4024      * For double numbers of the form 2<sup>x</sup>, the unbiased
   4025      * exponent is exactly x.
   4026      * </p>
   4027      * @param d number from which exponent is requested
   4028      * @return exponent for d in IEEE754 representation, without bias
   4029      */
   4030     public static int getExponent(final double d) {
   4031         return (int) ((Double.doubleToLongBits(d) >>> 52) & 0x7ff) - 1023;
   4032     }
   4033 
   4034     /**
   4035      * Return the exponent of a float number, removing the bias.
   4036      * <p>
   4037      * For float numbers of the form 2<sup>x</sup>, the unbiased
   4038      * exponent is exactly x.
   4039      * </p>
   4040      * @param f number from which exponent is requested
   4041      * @return exponent for d in IEEE754 representation, without bias
   4042      */
   4043     public static int getExponent(final float f) {
   4044         return ((Float.floatToIntBits(f) >>> 23) & 0xff) - 127;
   4045     }
   4046 
   4047 }
   4048