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