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 */
17package 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 févr. 2011) $
42 * @since 2.2
43 */
44public 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