1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math3.util;
18
19 import java.io.PrintStream;
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 public class FastMath {
81
82 public static final double PI = 105414357.0 / 33554432.0 + 1.984187159361080883e-9;
83
84
85 public static final double E = 2850325.0 / 1048576.0 + 8.254840070411028747e-8;
86
87
88 static final int EXP_INT_TABLE_MAX_INDEX = 750;
89
90 static final int EXP_INT_TABLE_LEN = EXP_INT_TABLE_MAX_INDEX * 2;
91
92 static final int LN_MANT_LEN = 1024;
93
94 static final int EXP_FRAC_TABLE_LEN = 1025;
95
96
97 private static final double LOG_MAX_VALUE = StrictMath.log(Double.MAX_VALUE);
98
99
100
101
102
103
104
105
106 private static final boolean RECOMPUTE_TABLES_AT_RUNTIME = false;
107
108
109 private static final double LN_2_A = 0.693147063255310059;
110
111
112 private static final double LN_2_B = 1.17304635250823482e-7;
113
114
115 private static final double LN_QUICK_COEF[][] = {
116 {1.0, 5.669184079525E-24},
117 {-0.25, -0.25},
118 {0.3333333134651184, 1.986821492305628E-8},
119 {-0.25, -6.663542893624021E-14},
120 {0.19999998807907104, 1.1921056801463227E-8},
121 {-0.1666666567325592, -7.800414592973399E-9},
122 {0.1428571343421936, 5.650007086920087E-9},
123 {-0.12502530217170715, -7.44321345601866E-11},
124 {0.11113807559013367, 9.219544613762692E-9},
125 };
126
127
128 private static final double LN_HI_PREC_COEF[][] = {
129 {1.0, -6.032174644509064E-23},
130 {-0.25, -0.25},
131 {0.3333333134651184, 1.9868161777724352E-8},
132 {-0.2499999701976776, -2.957007209750105E-8},
133 {0.19999954104423523, 1.5830993332061267E-10},
134 {-0.16624879837036133, -2.6033824355191673E-8}
135 };
136
137
138 private static final int SINE_TABLE_LEN = 14;
139
140
141 private static final double SINE_TABLE_A[] =
142 {
143 +0.0d,
144 +0.1246747374534607d,
145 +0.24740394949913025d,
146 +0.366272509098053d,
147 +0.4794255495071411d,
148 +0.5850973129272461d,
149 +0.6816387176513672d,
150 +0.7675435543060303d,
151 +0.8414709568023682d,
152 +0.902267575263977d,
153 +0.9489846229553223d,
154 +0.9808930158615112d,
155 +0.9974949359893799d,
156 +0.9985313415527344d,
157 };
158
159
160 private static final double SINE_TABLE_B[] =
161 {
162 +0.0d,
163 -4.068233003401932E-9d,
164 +9.755392680573412E-9d,
165 +1.9987994582857286E-8d,
166 -1.0902938113007961E-8d,
167 -3.9986783938944604E-8d,
168 +4.23719669792332E-8d,
169 -5.207000323380292E-8d,
170 +2.800552834259E-8d,
171 +1.883511811213715E-8d,
172 -3.5997360512765566E-9d,
173 +4.116164446561962E-8d,
174 +5.0614674548127384E-8d,
175 -1.0129027912496858E-9d,
176 };
177
178
179 private static final double COSINE_TABLE_A[] =
180 {
181 +1.0d,
182 +0.9921976327896118d,
183 +0.9689123630523682d,
184 +0.9305076599121094d,
185 +0.8775825500488281d,
186 +0.8109631538391113d,
187 +0.7316888570785522d,
188 +0.6409968137741089d,
189 +0.5403022766113281d,
190 +0.4311765432357788d,
191 +0.3153223395347595d,
192 +0.19454771280288696d,
193 +0.07073719799518585d,
194 -0.05417713522911072d,
195 };
196
197
198 private static final double COSINE_TABLE_B[] =
199 {
200 +0.0d,
201 +3.4439717236742845E-8d,
202 +5.865827662008209E-8d,
203 -3.7999795083850525E-8d,
204 +1.184154459111628E-8d,
205 -3.43338934259355E-8d,
206 +1.1795268640216787E-8d,
207 +4.438921624363781E-8d,
208 +2.925681159240093E-8d,
209 -2.6437112632041807E-8d,
210 +2.2860509143963117E-8d,
211 -4.813899778443457E-9d,
212 +3.6725170580355583E-9d,
213 +2.0217439756338078E-10d,
214 };
215
216
217
218 private static final double TANGENT_TABLE_A[] =
219 {
220 +0.0d,
221 +0.1256551444530487d,
222 +0.25534194707870483d,
223 +0.3936265707015991d,
224 +0.5463024377822876d,
225 +0.7214844226837158d,
226 +0.9315965175628662d,
227 +1.1974215507507324d,
228 +1.5574076175689697d,
229 +2.092571258544922d,
230 +3.0095696449279785d,
231 +5.041914939880371d,
232 +14.101419448852539d,
233 -18.430862426757812d,
234 };
235
236
237 private static final double TANGENT_TABLE_B[] =
238 {
239 +0.0d,
240 -7.877917738262007E-9d,
241 -2.5857668567479893E-8d,
242 +5.2240336371356666E-9d,
243 +5.206150291559893E-8d,
244 +1.8307188599677033E-8d,
245 -5.7618793749770706E-8d,
246 +7.848361555046424E-8d,
247 +1.0708593250394448E-7d,
248 +1.7827257129423813E-8d,
249 +2.893485277253286E-8d,
250 +3.1660099222737955E-7d,
251 +4.983191803254889E-7d,
252 -3.356118100840571E-7d,
253 };
254
255
256 private static final long RECIP_2PI[] = new long[] {
257 (0x28be60dbL << 32) | 0x9391054aL,
258 (0x7f09d5f4L << 32) | 0x7d4d3770L,
259 (0x36d8a566L << 32) | 0x4f10e410L,
260 (0x7f9458eaL << 32) | 0xf7aef158L,
261 (0x6dc91b8eL << 32) | 0x909374b8L,
262 (0x01924bbaL << 32) | 0x82746487L,
263 (0x3f877ac7L << 32) | 0x2c4a69cfL,
264 (0xba208d7dL << 32) | 0x4baed121L,
265 (0x3a671c09L << 32) | 0xad17df90L,
266 (0x4e64758eL << 32) | 0x60d4ce7dL,
267 (0x272117e2L << 32) | 0xef7e4a0eL,
268 (0xc7fe25ffL << 32) | 0xf7816603L,
269 (0xfbcbc462L << 32) | 0xd6829b47L,
270 (0xdb4d9fb3L << 32) | 0xc9f2c26dL,
271 (0xd3d18fd9L << 32) | 0xa797fa8bL,
272 (0x5d49eeb1L << 32) | 0xfaf97c5eL,
273 (0xcf41ce7dL << 32) | 0xe294a4baL,
274 0x9afed7ecL << 32 };
275
276
277 private static final long PI_O_4_BITS[] = new long[] {
278 (0xc90fdaa2L << 32) | 0x2168c234L,
279 (0xc4c6628bL << 32) | 0x80dc1cd1L };
280
281
282
283
284
285 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};
286
287
288 private static final double CBRTTWO[] = { 0.6299605249474366,
289 0.7937005259840998,
290 1.0,
291 1.2599210498948732,
292 1.5874010519681994 };
293
294
295
296
297
298
299
300
301
302
303
304
305 private static final long HEX_40000000 = 0x40000000L;
306
307
308 private static final long MASK_30BITS = -1L - (HEX_40000000 -1);
309
310
311 private static final int MASK_NON_SIGN_INT = 0x7fffffff;
312
313
314 private static final long MASK_NON_SIGN_LONG = 0x7fffffffffffffffl;
315
316
317 private static final double TWO_POWER_52 = 4503599627370496.0;
318
319 private static final double TWO_POWER_53 = 2 * TWO_POWER_52;
320
321
322 private static final double F_1_3 = 1d / 3d;
323
324 private static final double F_1_5 = 1d / 5d;
325
326 private static final double F_1_7 = 1d / 7d;
327
328 private static final double F_1_9 = 1d / 9d;
329
330 private static final double F_1_11 = 1d / 11d;
331
332 private static final double F_1_13 = 1d / 13d;
333
334 private static final double F_1_15 = 1d / 15d;
335
336 private static final double F_1_17 = 1d / 17d;
337
338 private static final double F_3_4 = 3d / 4d;
339
340 private static final double F_15_16 = 15d / 16d;
341
342 private static final double F_13_14 = 13d / 14d;
343
344 private static final double F_11_12 = 11d / 12d;
345
346 private static final double F_9_10 = 9d / 10d;
347
348 private static final double F_7_8 = 7d / 8d;
349
350 private static final double F_5_6 = 5d / 6d;
351
352 private static final double F_1_2 = 1d / 2d;
353
354 private static final double F_1_4 = 1d / 4d;
355
356
357
358
359 private FastMath() {}
360
361
362
363
364
365
366
367
368
369
370 private static double doubleHighPart(double d) {
371 if (d > -Precision.SAFE_MIN && d < Precision.SAFE_MIN){
372 return d;
373 }
374 long xl = Double.doubleToRawLongBits(d);
375 xl = xl & MASK_30BITS;
376 return Double.longBitsToDouble(xl);
377 }
378
379
380
381
382
383
384 public static double sqrt(final double a) {
385 return Math.sqrt(a);
386 }
387
388
389
390
391
392 public static double cosh(double x) {
393 if (x != x) {
394 return x;
395 }
396
397
398
399
400
401
402 if (x > 20) {
403 if (x >= LOG_MAX_VALUE) {
404
405 final double t = exp(0.5 * x);
406 return (0.5 * t) * t;
407 } else {
408 return 0.5 * exp(x);
409 }
410 } else if (x < -20) {
411 if (x <= -LOG_MAX_VALUE) {
412
413 final double t = exp(-0.5 * x);
414 return (0.5 * t) * t;
415 } else {
416 return 0.5 * exp(-x);
417 }
418 }
419
420 final double hiPrec[] = new double[2];
421 if (x < 0.0) {
422 x = -x;
423 }
424 exp(x, 0.0, hiPrec);
425
426 double ya = hiPrec[0] + hiPrec[1];
427 double yb = -(ya - hiPrec[0] - hiPrec[1]);
428
429 double temp = ya * HEX_40000000;
430 double yaa = ya + temp - temp;
431 double yab = ya - yaa;
432
433
434 double recip = 1.0/ya;
435 temp = recip * HEX_40000000;
436 double recipa = recip + temp - temp;
437 double recipb = recip - recipa;
438
439
440 recipb += (1.0 - yaa*recipa - yaa*recipb - yab*recipa - yab*recipb) * recip;
441
442 recipb += -yb * recip * recip;
443
444
445 temp = ya + recipa;
446 yb += -(temp - ya - recipa);
447 ya = temp;
448 temp = ya + recipb;
449 yb += -(temp - ya - recipb);
450 ya = temp;
451
452 double result = ya + yb;
453 result *= 0.5;
454 return result;
455 }
456
457
458
459
460
461 public static double sinh(double x) {
462 boolean negate = false;
463 if (x != x) {
464 return x;
465 }
466
467
468
469
470
471
472 if (x > 20) {
473 if (x >= LOG_MAX_VALUE) {
474
475 final double t = exp(0.5 * x);
476 return (0.5 * t) * t;
477 } else {
478 return 0.5 * exp(x);
479 }
480 } else if (x < -20) {
481 if (x <= -LOG_MAX_VALUE) {
482
483 final double t = exp(-0.5 * x);
484 return (-0.5 * t) * t;
485 } else {
486 return -0.5 * exp(-x);
487 }
488 }
489
490 if (x == 0) {
491 return x;
492 }
493
494 if (x < 0.0) {
495 x = -x;
496 negate = true;
497 }
498
499 double result;
500
501 if (x > 0.25) {
502 double hiPrec[] = new double[2];
503 exp(x, 0.0, hiPrec);
504
505 double ya = hiPrec[0] + hiPrec[1];
506 double yb = -(ya - hiPrec[0] - hiPrec[1]);
507
508 double temp = ya * HEX_40000000;
509 double yaa = ya + temp - temp;
510 double yab = ya - yaa;
511
512
513 double recip = 1.0/ya;
514 temp = recip * HEX_40000000;
515 double recipa = recip + temp - temp;
516 double recipb = recip - recipa;
517
518
519 recipb += (1.0 - yaa*recipa - yaa*recipb - yab*recipa - yab*recipb) * recip;
520
521 recipb += -yb * recip * recip;
522
523 recipa = -recipa;
524 recipb = -recipb;
525
526
527 temp = ya + recipa;
528 yb += -(temp - ya - recipa);
529 ya = temp;
530 temp = ya + recipb;
531 yb += -(temp - ya - recipb);
532 ya = temp;
533
534 result = ya + yb;
535 result *= 0.5;
536 }
537 else {
538 double hiPrec[] = new double[2];
539 expm1(x, hiPrec);
540
541 double ya = hiPrec[0] + hiPrec[1];
542 double yb = -(ya - hiPrec[0] - hiPrec[1]);
543
544
545 double denom = 1.0 + ya;
546 double denomr = 1.0 / denom;
547 double denomb = -(denom - 1.0 - ya) + yb;
548 double ratio = ya * denomr;
549 double temp = ratio * HEX_40000000;
550 double ra = ratio + temp - temp;
551 double rb = ratio - ra;
552
553 temp = denom * HEX_40000000;
554 double za = denom + temp - temp;
555 double zb = denom - za;
556
557 rb += (ya - za*ra - za*rb - zb*ra - zb*rb) * denomr;
558
559
560 rb += yb*denomr;
561 rb += -ya * denomb * denomr * denomr;
562
563
564 temp = ya + ra;
565 yb += -(temp - ya - ra);
566 ya = temp;
567 temp = ya + rb;
568 yb += -(temp - ya - rb);
569 ya = temp;
570
571 result = ya + yb;
572 result *= 0.5;
573 }
574
575 if (negate) {
576 result = -result;
577 }
578
579 return result;
580 }
581
582
583
584
585
586 public static double tanh(double x) {
587 boolean negate = false;
588
589 if (x != x) {
590 return x;
591 }
592
593
594
595
596
597
598
599 if (x > 20.0) {
600 return 1.0;
601 }
602
603 if (x < -20) {
604 return -1.0;
605 }
606
607 if (x == 0) {
608 return x;
609 }
610
611 if (x < 0.0) {
612 x = -x;
613 negate = true;
614 }
615
616 double result;
617 if (x >= 0.5) {
618 double hiPrec[] = new double[2];
619
620 exp(x*2.0, 0.0, hiPrec);
621
622 double ya = hiPrec[0] + hiPrec[1];
623 double yb = -(ya - hiPrec[0] - hiPrec[1]);
624
625
626 double na = -1.0 + ya;
627 double nb = -(na + 1.0 - ya);
628 double temp = na + yb;
629 nb += -(temp - na - yb);
630 na = temp;
631
632
633 double da = 1.0 + ya;
634 double db = -(da - 1.0 - ya);
635 temp = da + yb;
636 db += -(temp - da - yb);
637 da = temp;
638
639 temp = da * HEX_40000000;
640 double daa = da + temp - temp;
641 double dab = da - daa;
642
643
644 double ratio = na/da;
645 temp = ratio * HEX_40000000;
646 double ratioa = ratio + temp - temp;
647 double ratiob = ratio - ratioa;
648
649
650 ratiob += (na - daa*ratioa - daa*ratiob - dab*ratioa - dab*ratiob) / da;
651
652
653 ratiob += nb / da;
654
655 ratiob += -db * na / da / da;
656
657 result = ratioa + ratiob;
658 }
659 else {
660 double hiPrec[] = new double[2];
661
662 expm1(x*2.0, hiPrec);
663
664 double ya = hiPrec[0] + hiPrec[1];
665 double yb = -(ya - hiPrec[0] - hiPrec[1]);
666
667
668 double na = ya;
669 double nb = yb;
670
671
672 double da = 2.0 + ya;
673 double db = -(da - 2.0 - ya);
674 double temp = da + yb;
675 db += -(temp - da - yb);
676 da = temp;
677
678 temp = da * HEX_40000000;
679 double daa = da + temp - temp;
680 double dab = da - daa;
681
682
683 double ratio = na/da;
684 temp = ratio * HEX_40000000;
685 double ratioa = ratio + temp - temp;
686 double ratiob = ratio - ratioa;
687
688
689 ratiob += (na - daa*ratioa - daa*ratiob - dab*ratioa - dab*ratiob) / da;
690
691
692 ratiob += nb / da;
693
694 ratiob += -db * na / da / da;
695
696 result = ratioa + ratiob;
697 }
698
699 if (negate) {
700 result = -result;
701 }
702
703 return result;
704 }
705
706
707
708
709
710 public static double acosh(final double a) {
711 return FastMath.log(a + FastMath.sqrt(a * a - 1));
712 }
713
714
715
716
717
718 public static double asinh(double a) {
719 boolean negative = false;
720 if (a < 0) {
721 negative = true;
722 a = -a;
723 }
724
725 double absAsinh;
726 if (a > 0.167) {
727 absAsinh = FastMath.log(FastMath.sqrt(a * a + 1) + a);
728 } else {
729 final double a2 = a * a;
730 if (a > 0.097) {
731 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);
732 } else if (a > 0.036) {
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 * F_11_12) * F_9_10) * F_7_8) * F_5_6) * F_3_4) * F_1_2);
734 } else if (a > 0.0036) {
735 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);
736 } else {
737 absAsinh = a * (1 - a2 * (F_1_3 - a2 * F_1_5 * F_3_4) * F_1_2);
738 }
739 }
740
741 return negative ? -absAsinh : absAsinh;
742 }
743
744
745
746
747
748 public static double atanh(double a) {
749 boolean negative = false;
750 if (a < 0) {
751 negative = true;
752 a = -a;
753 }
754
755 double absAtanh;
756 if (a > 0.15) {
757 absAtanh = 0.5 * FastMath.log((1 + a) / (1 - a));
758 } else {
759 final double a2 = a * a;
760 if (a > 0.087) {
761 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))))))));
762 } else if (a > 0.031) {
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))))));
764 } else if (a > 0.003) {
765 absAtanh = a * (1 + a2 * (F_1_3 + a2 * (F_1_5 + a2 * (F_1_7 + a2 * F_1_9))));
766 } else {
767 absAtanh = a * (1 + a2 * (F_1_3 + a2 * F_1_5));
768 }
769 }
770
771 return negative ? -absAtanh : absAtanh;
772 }
773
774
775
776
777
778
779 public static double signum(final double a) {
780 return (a < 0.0) ? -1.0 : ((a > 0.0) ? 1.0 : a);
781 }
782
783
784
785
786
787
788 public static float signum(final float a) {
789 return (a < 0.0f) ? -1.0f : ((a > 0.0f) ? 1.0f : a);
790 }
791
792
793
794
795
796 public static double nextUp(final double a) {
797 return nextAfter(a, Double.POSITIVE_INFINITY);
798 }
799
800
801
802
803
804 public static float nextUp(final float a) {
805 return nextAfter(a, Float.POSITIVE_INFINITY);
806 }
807
808
809
810
811
812 public static double random() {
813 return Math.random();
814 }
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836 public static double exp(double x) {
837 return exp(x, 0.0, null);
838 }
839
840
841
842
843
844
845
846
847 private static double exp(double x, double extra, double[] hiPrec) {
848 double intPartA;
849 double intPartB;
850 int intVal;
851
852
853
854
855
856 if (x < 0.0) {
857 intVal = (int) -x;
858
859 if (intVal > 746) {
860 if (hiPrec != null) {
861 hiPrec[0] = 0.0;
862 hiPrec[1] = 0.0;
863 }
864 return 0.0;
865 }
866
867 if (intVal > 709) {
868
869 final double result = exp(x+40.19140625, extra, hiPrec) / 285040095144011776.0;
870 if (hiPrec != null) {
871 hiPrec[0] /= 285040095144011776.0;
872 hiPrec[1] /= 285040095144011776.0;
873 }
874 return result;
875 }
876
877 if (intVal == 709) {
878
879 final double result = exp(x+1.494140625, extra, hiPrec) / 4.455505956692756620;
880 if (hiPrec != null) {
881 hiPrec[0] /= 4.455505956692756620;
882 hiPrec[1] /= 4.455505956692756620;
883 }
884 return result;
885 }
886
887 intVal++;
888
889 intPartA = ExpIntTable.EXP_INT_TABLE_A[EXP_INT_TABLE_MAX_INDEX-intVal];
890 intPartB = ExpIntTable.EXP_INT_TABLE_B[EXP_INT_TABLE_MAX_INDEX-intVal];
891
892 intVal = -intVal;
893 } else {
894 intVal = (int) x;
895
896 if (intVal > 709) {
897 if (hiPrec != null) {
898 hiPrec[0] = Double.POSITIVE_INFINITY;
899 hiPrec[1] = 0.0;
900 }
901 return Double.POSITIVE_INFINITY;
902 }
903
904 intPartA = ExpIntTable.EXP_INT_TABLE_A[EXP_INT_TABLE_MAX_INDEX+intVal];
905 intPartB = ExpIntTable.EXP_INT_TABLE_B[EXP_INT_TABLE_MAX_INDEX+intVal];
906 }
907
908
909
910
911
912 final int intFrac = (int) ((x - intVal) * 1024.0);
913 final double fracPartA = ExpFracTable.EXP_FRAC_TABLE_A[intFrac];
914 final double fracPartB = ExpFracTable.EXP_FRAC_TABLE_B[intFrac];
915
916
917
918
919
920 final double epsilon = x - (intVal + intFrac / 1024.0);
921
922
923
924
925
926
927
928
929 double z = 0.04168701738764507;
930 z = z * epsilon + 0.1666666505023083;
931 z = z * epsilon + 0.5000000000042687;
932 z = z * epsilon + 1.0;
933 z = z * epsilon + -3.940510424527919E-20;
934
935
936
937
938
939
940 double tempA = intPartA * fracPartA;
941 double tempB = intPartA * fracPartB + intPartB * fracPartA + intPartB * fracPartB;
942
943
944
945
946
947 final double tempC = tempB + tempA;
948 final double result;
949 if (extra != 0.0) {
950 result = tempC*extra*z + tempC*extra + tempC*z + tempB + tempA;
951 } else {
952 result = tempC*z + tempB + tempA;
953 }
954
955 if (hiPrec != null) {
956
957 hiPrec[0] = tempA;
958 hiPrec[1] = tempC*extra*z + tempC*extra + tempC*z + tempB;
959 }
960
961 return result;
962 }
963
964
965
966
967
968 public static double expm1(double x) {
969 return expm1(x, null);
970 }
971
972
973
974
975
976
977 private static double expm1(double x, double hiPrecOut[]) {
978 if (x != x || x == 0.0) {
979 return x;
980 }
981
982 if (x <= -1.0 || x >= 1.0) {
983
984
985 double hiPrec[] = new double[2];
986 exp(x, 0.0, hiPrec);
987 if (x > 0.0) {
988 return -1.0 + hiPrec[0] + hiPrec[1];
989 } else {
990 final double ra = -1.0 + hiPrec[0];
991 double rb = -(ra + 1.0 - hiPrec[0]);
992 rb += hiPrec[1];
993 return ra + rb;
994 }
995 }
996
997 double baseA;
998 double baseB;
999 double epsilon;
1000 boolean negative = false;
1001
1002 if (x < 0.0) {
1003 x = -x;
1004 negative = true;
1005 }
1006
1007 {
1008 int intFrac = (int) (x * 1024.0);
1009 double tempA = ExpFracTable.EXP_FRAC_TABLE_A[intFrac] - 1.0;
1010 double tempB = ExpFracTable.EXP_FRAC_TABLE_B[intFrac];
1011
1012 double temp = tempA + tempB;
1013 tempB = -(temp - tempA - tempB);
1014 tempA = temp;
1015
1016 temp = tempA * HEX_40000000;
1017 baseA = tempA + temp - temp;
1018 baseB = tempB + (tempA - baseA);
1019
1020 epsilon = x - intFrac/1024.0;
1021 }
1022
1023
1024
1025 double zb = 0.008336750013465571;
1026 zb = zb * epsilon + 0.041666663879186654;
1027 zb = zb * epsilon + 0.16666666666745392;
1028 zb = zb * epsilon + 0.49999999999999994;
1029 zb = zb * epsilon;
1030 zb = zb * epsilon;
1031
1032 double za = epsilon;
1033 double temp = za + zb;
1034 zb = -(temp - za - zb);
1035 za = temp;
1036
1037 temp = za * HEX_40000000;
1038 temp = za + temp - temp;
1039 zb += za - temp;
1040 za = temp;
1041
1042
1043 double ya = za * baseA;
1044
1045 temp = ya + za * baseB;
1046 double yb = -(temp - ya - za * baseB);
1047 ya = temp;
1048
1049 temp = ya + zb * baseA;
1050 yb += -(temp - ya - zb * baseA);
1051 ya = temp;
1052
1053 temp = ya + zb * baseB;
1054 yb += -(temp - ya - zb*baseB);
1055 ya = temp;
1056
1057
1058
1059 temp = ya + baseA;
1060 yb += -(temp - baseA - ya);
1061 ya = temp;
1062
1063 temp = ya + za;
1064
1065 yb += -(temp - ya - za);
1066 ya = temp;
1067
1068 temp = ya + baseB;
1069
1070 yb += -(temp - ya - baseB);
1071 ya = temp;
1072
1073 temp = ya + zb;
1074
1075 yb += -(temp - ya - zb);
1076 ya = temp;
1077
1078 if (negative) {
1079
1080 double denom = 1.0 + ya;
1081 double denomr = 1.0 / denom;
1082 double denomb = -(denom - 1.0 - ya) + yb;
1083 double ratio = ya * denomr;
1084 temp = ratio * HEX_40000000;
1085 final double ra = ratio + temp - temp;
1086 double rb = ratio - ra;
1087
1088 temp = denom * HEX_40000000;
1089 za = denom + temp - temp;
1090 zb = denom - za;
1091
1092 rb += (ya - za * ra - za * rb - zb * ra - zb * rb) * denomr;
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103 rb += yb * denomr;
1104 rb += -ya * denomb * denomr * denomr;
1105
1106
1107 ya = -ra;
1108 yb = -rb;
1109 }
1110
1111 if (hiPrecOut != null) {
1112 hiPrecOut[0] = ya;
1113 hiPrecOut[1] = yb;
1114 }
1115
1116 return ya + yb;
1117 }
1118
1119
1120
1121
1122
1123
1124
1125 public static double log(final double x) {
1126 return log(x, null);
1127 }
1128
1129
1130
1131
1132
1133
1134
1135 private static double log(final double x, final double[] hiPrec) {
1136 if (x==0) {
1137 return Double.NEGATIVE_INFINITY;
1138 }
1139 long bits = Double.doubleToRawLongBits(x);
1140
1141
1142 if (((bits & 0x8000000000000000L) != 0 || x != x) && x != 0.0) {
1143 if (hiPrec != null) {
1144 hiPrec[0] = Double.NaN;
1145 }
1146
1147 return Double.NaN;
1148 }
1149
1150
1151 if (x == Double.POSITIVE_INFINITY) {
1152 if (hiPrec != null) {
1153 hiPrec[0] = Double.POSITIVE_INFINITY;
1154 }
1155
1156 return Double.POSITIVE_INFINITY;
1157 }
1158
1159
1160 int exp = (int)(bits >> 52)-1023;
1161
1162 if ((bits & 0x7ff0000000000000L) == 0) {
1163
1164 if (x == 0) {
1165
1166 if (hiPrec != null) {
1167 hiPrec[0] = Double.NEGATIVE_INFINITY;
1168 }
1169
1170 return Double.NEGATIVE_INFINITY;
1171 }
1172
1173
1174 bits <<= 1;
1175 while ( (bits & 0x0010000000000000L) == 0) {
1176 --exp;
1177 bits <<= 1;
1178 }
1179 }
1180
1181
1182 if ((exp == -1 || exp == 0) && x < 1.01 && x > 0.99 && hiPrec == null) {
1183
1184
1185
1186
1187 double xa = x - 1.0;
1188 double xb = xa - x + 1.0;
1189 double tmp = xa * HEX_40000000;
1190 double aa = xa + tmp - tmp;
1191 double ab = xa - aa;
1192 xa = aa;
1193 xb = ab;
1194
1195 final double[] lnCoef_last = LN_QUICK_COEF[LN_QUICK_COEF.length - 1];
1196 double ya = lnCoef_last[0];
1197 double yb = lnCoef_last[1];
1198
1199 for (int i = LN_QUICK_COEF.length - 2; i >= 0; i--) {
1200
1201 aa = ya * xa;
1202 ab = ya * xb + yb * xa + yb * xb;
1203
1204 tmp = aa * HEX_40000000;
1205 ya = aa + tmp - tmp;
1206 yb = aa - ya + ab;
1207
1208
1209 final double[] lnCoef_i = LN_QUICK_COEF[i];
1210 aa = ya + lnCoef_i[0];
1211 ab = yb + lnCoef_i[1];
1212
1213 tmp = aa * HEX_40000000;
1214 ya = aa + tmp - tmp;
1215 yb = aa - ya + ab;
1216 }
1217
1218
1219 aa = ya * xa;
1220 ab = ya * xb + yb * xa + yb * xb;
1221
1222 tmp = aa * HEX_40000000;
1223 ya = aa + tmp - tmp;
1224 yb = aa - ya + ab;
1225
1226 return ya + yb;
1227 }
1228
1229
1230 final double[] lnm = lnMant.LN_MANT[(int)((bits & 0x000ffc0000000000L) >> 42)];
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241 final double epsilon = (bits & 0x3ffffffffffL) / (TWO_POWER_52 + (bits & 0x000ffc0000000000L));
1242
1243 double lnza = 0.0;
1244 double lnzb = 0.0;
1245
1246 if (hiPrec != null) {
1247
1248 double tmp = epsilon * HEX_40000000;
1249 double aa = epsilon + tmp - tmp;
1250 double ab = epsilon - aa;
1251 double xa = aa;
1252 double xb = ab;
1253
1254
1255 final double numer = bits & 0x3ffffffffffL;
1256 final double denom = TWO_POWER_52 + (bits & 0x000ffc0000000000L);
1257 aa = numer - xa*denom - xb * denom;
1258 xb += aa / denom;
1259
1260
1261 final double[] lnCoef_last = LN_HI_PREC_COEF[LN_HI_PREC_COEF.length-1];
1262 double ya = lnCoef_last[0];
1263 double yb = lnCoef_last[1];
1264
1265 for (int i = LN_HI_PREC_COEF.length - 2; i >= 0; i--) {
1266
1267 aa = ya * xa;
1268 ab = ya * xb + yb * xa + yb * xb;
1269
1270 tmp = aa * HEX_40000000;
1271 ya = aa + tmp - tmp;
1272 yb = aa - ya + ab;
1273
1274
1275 final double[] lnCoef_i = LN_HI_PREC_COEF[i];
1276 aa = ya + lnCoef_i[0];
1277 ab = yb + lnCoef_i[1];
1278
1279 tmp = aa * HEX_40000000;
1280 ya = aa + tmp - tmp;
1281 yb = aa - ya + ab;
1282 }
1283
1284
1285 aa = ya * xa;
1286 ab = ya * xb + yb * xa + yb * xb;
1287
1288
1289
1290
1291
1292
1293
1294 lnza = aa + ab;
1295 lnzb = -(lnza - aa - ab);
1296 } else {
1297
1298
1299 lnza = -0.16624882440418567;
1300 lnza = lnza * epsilon + 0.19999954120254515;
1301 lnza = lnza * epsilon + -0.2499999997677497;
1302 lnza = lnza * epsilon + 0.3333333333332802;
1303 lnza = lnza * epsilon + -0.5;
1304 lnza = lnza * epsilon + 1.0;
1305 lnza = lnza * epsilon;
1306 }
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322 double a = LN_2_A*exp;
1323 double b = 0.0;
1324 double c = a+lnm[0];
1325 double d = -(c-a-lnm[0]);
1326 a = c;
1327 b = b + d;
1328
1329 c = a + lnza;
1330 d = -(c - a - lnza);
1331 a = c;
1332 b = b + d;
1333
1334 c = a + LN_2_B*exp;
1335 d = -(c - a - LN_2_B*exp);
1336 a = c;
1337 b = b + d;
1338
1339 c = a + lnm[1];
1340 d = -(c - a - lnm[1]);
1341 a = c;
1342 b = b + d;
1343
1344 c = a + lnzb;
1345 d = -(c - a - lnzb);
1346 a = c;
1347 b = b + d;
1348
1349 if (hiPrec != null) {
1350 hiPrec[0] = a;
1351 hiPrec[1] = b;
1352 }
1353
1354 return a + b;
1355 }
1356
1357
1358
1359
1360
1361
1362
1363 public static double log1p(final double x) {
1364 if (x == -1) {
1365 return Double.NEGATIVE_INFINITY;
1366 }
1367
1368 if (x == Double.POSITIVE_INFINITY) {
1369 return Double.POSITIVE_INFINITY;
1370 }
1371
1372 if (x > 1e-6 ||
1373 x < -1e-6) {
1374 final double xpa = 1 + x;
1375 final double xpb = -(xpa - 1 - x);
1376
1377 final double[] hiPrec = new double[2];
1378 final double lores = log(xpa, hiPrec);
1379 if (Double.isInfinite(lores)) {
1380 return lores;
1381 }
1382
1383
1384
1385 final double fx1 = xpb / xpa;
1386 final double epsilon = 0.5 * fx1 + 1;
1387 return epsilon * fx1 + hiPrec[1] + hiPrec[0];
1388 } else {
1389
1390 final double y = (x * F_1_3 - F_1_2) * x + 1;
1391 return y * x;
1392 }
1393 }
1394
1395
1396
1397
1398
1399 public static double log10(final double x) {
1400 final double hiPrec[] = new double[2];
1401
1402 final double lores = log(x, hiPrec);
1403 if (Double.isInfinite(lores)){
1404 return lores;
1405 }
1406
1407 final double tmp = hiPrec[0] * HEX_40000000;
1408 final double lna = hiPrec[0] + tmp - tmp;
1409 final double lnb = hiPrec[0] - lna + hiPrec[1];
1410
1411 final double rln10a = 0.4342944622039795;
1412 final double rln10b = 1.9699272335463627E-8;
1413
1414 return rln10b * lnb + rln10b * lna + rln10a * lnb + rln10a * lna;
1415 }
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433 public static double log(double base, double x) {
1434 return log(x) / log(base);
1435 }
1436
1437
1438
1439
1440
1441
1442
1443
1444 public static double pow(double x, double y) {
1445 final double lns[] = new double[2];
1446
1447 if (y == 0.0) {
1448 return 1.0;
1449 }
1450
1451 if (x != x) {
1452 return x;
1453 }
1454
1455
1456 if (x == 0) {
1457 long bits = Double.doubleToRawLongBits(x);
1458 if ((bits & 0x8000000000000000L) != 0) {
1459
1460 long yi = (long) y;
1461
1462 if (y < 0 && y == yi && (yi & 1) == 1) {
1463 return Double.NEGATIVE_INFINITY;
1464 }
1465
1466 if (y > 0 && y == yi && (yi & 1) == 1) {
1467 return -0.0;
1468 }
1469 }
1470
1471 if (y < 0) {
1472 return Double.POSITIVE_INFINITY;
1473 }
1474 if (y > 0) {
1475 return 0.0;
1476 }
1477
1478 return Double.NaN;
1479 }
1480
1481 if (x == Double.POSITIVE_INFINITY) {
1482 if (y != y) {
1483 return y;
1484 }
1485 if (y < 0.0) {
1486 return 0.0;
1487 } else {
1488 return Double.POSITIVE_INFINITY;
1489 }
1490 }
1491
1492 if (y == Double.POSITIVE_INFINITY) {
1493 if (x * x == 1.0) {
1494 return Double.NaN;
1495 }
1496
1497 if (x * x > 1.0) {
1498 return Double.POSITIVE_INFINITY;
1499 } else {
1500 return 0.0;
1501 }
1502 }
1503
1504 if (x == Double.NEGATIVE_INFINITY) {
1505 if (y != y) {
1506 return y;
1507 }
1508
1509 if (y < 0) {
1510 long yi = (long) y;
1511 if (y == yi && (yi & 1) == 1) {
1512 return -0.0;
1513 }
1514
1515 return 0.0;
1516 }
1517
1518 if (y > 0) {
1519 long yi = (long) y;
1520 if (y == yi && (yi & 1) == 1) {
1521 return Double.NEGATIVE_INFINITY;
1522 }
1523
1524 return Double.POSITIVE_INFINITY;
1525 }
1526 }
1527
1528 if (y == Double.NEGATIVE_INFINITY) {
1529
1530 if (x * x == 1.0) {
1531 return Double.NaN;
1532 }
1533
1534 if (x * x < 1.0) {
1535 return Double.POSITIVE_INFINITY;
1536 } else {
1537 return 0.0;
1538 }
1539 }
1540
1541
1542 if (x < 0) {
1543
1544 if (y >= TWO_POWER_53 || y <= -TWO_POWER_53) {
1545 return pow(-x, y);
1546 }
1547
1548 if (y == (long) y) {
1549
1550 return ((long)y & 1) == 0 ? pow(-x, y) : -pow(-x, y);
1551 } else {
1552 return Double.NaN;
1553 }
1554 }
1555
1556
1557 double ya;
1558 double yb;
1559 if (y < 8e298 && y > -8e298) {
1560 double tmp1 = y * HEX_40000000;
1561 ya = y + tmp1 - tmp1;
1562 yb = y - ya;
1563 } else {
1564 double tmp1 = y * 9.31322574615478515625E-10;
1565 double tmp2 = tmp1 * 9.31322574615478515625E-10;
1566 ya = (tmp1 + tmp2 - tmp1) * HEX_40000000 * HEX_40000000;
1567 yb = y - ya;
1568 }
1569
1570
1571 final double lores = log(x, lns);
1572 if (Double.isInfinite(lores)){
1573 return lores;
1574 }
1575
1576 double lna = lns[0];
1577 double lnb = lns[1];
1578
1579
1580 double tmp1 = lna * HEX_40000000;
1581 double tmp2 = lna + tmp1 - tmp1;
1582 lnb += lna - tmp2;
1583 lna = tmp2;
1584
1585
1586 final double aa = lna * ya;
1587 final double ab = lna * yb + lnb * ya + lnb * yb;
1588
1589 lna = aa+ab;
1590 lnb = -(lna - aa - ab);
1591
1592 double z = 1.0 / 120.0;
1593 z = z * lnb + (1.0 / 24.0);
1594 z = z * lnb + (1.0 / 6.0);
1595 z = z * lnb + 0.5;
1596 z = z * lnb + 1.0;
1597 z = z * lnb;
1598
1599 final double result = exp(lna, z, null);
1600
1601 return result;
1602 }
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613 public static double pow(double d, int e) {
1614
1615 if (e == 0) {
1616 return 1.0;
1617 } else if (e < 0) {
1618 e = -e;
1619 d = 1.0 / d;
1620 }
1621
1622
1623
1624 final int splitFactor = 0x8000001;
1625 final double cd = splitFactor * d;
1626 final double d1High = cd - (cd - d);
1627 final double d1Low = d - d1High;
1628
1629
1630 double resultHigh = 1;
1631 double resultLow = 0;
1632
1633
1634 double d2p = d;
1635 double d2pHigh = d1High;
1636 double d2pLow = d1Low;
1637
1638 while (e != 0) {
1639
1640 if ((e & 0x1) != 0) {
1641
1642
1643 final double tmpHigh = resultHigh * d2p;
1644 final double cRH = splitFactor * resultHigh;
1645 final double rHH = cRH - (cRH - resultHigh);
1646 final double rHL = resultHigh - rHH;
1647 final double tmpLow = rHL * d2pLow - (((tmpHigh - rHH * d2pHigh) - rHL * d2pHigh) - rHH * d2pLow);
1648 resultHigh = tmpHigh;
1649 resultLow = resultLow * d2p + tmpLow;
1650 }
1651
1652
1653
1654 final double tmpHigh = d2pHigh * d2p;
1655 final double cD2pH = splitFactor * d2pHigh;
1656 final double d2pHH = cD2pH - (cD2pH - d2pHigh);
1657 final double d2pHL = d2pHigh - d2pHH;
1658 final double tmpLow = d2pHL * d2pLow - (((tmpHigh - d2pHH * d2pHigh) - d2pHL * d2pHigh) - d2pHH * d2pLow);
1659 final double cTmpH = splitFactor * tmpHigh;
1660 d2pHigh = cTmpH - (cTmpH - tmpHigh);
1661 d2pLow = d2pLow * d2p + tmpLow + (tmpHigh - d2pHigh);
1662 d2p = d2pHigh + d2pLow;
1663
1664 e = e >> 1;
1665
1666 }
1667
1668 return resultHigh + resultLow;
1669
1670 }
1671
1672
1673
1674
1675
1676
1677
1678 private static double polySine(final double x)
1679 {
1680 double x2 = x*x;
1681
1682 double p = 2.7553817452272217E-6;
1683 p = p * x2 + -1.9841269659586505E-4;
1684 p = p * x2 + 0.008333333333329196;
1685 p = p * x2 + -0.16666666666666666;
1686
1687
1688 p = p * x2 * x;
1689
1690 return p;
1691 }
1692
1693
1694
1695
1696
1697
1698
1699 private static double polyCosine(double x) {
1700 double x2 = x*x;
1701
1702 double p = 2.479773539153719E-5;
1703 p = p * x2 + -0.0013888888689039883;
1704 p = p * x2 + 0.041666666666621166;
1705 p = p * x2 + -0.49999999999999994;
1706 p *= x2;
1707
1708 return p;
1709 }
1710
1711
1712
1713
1714
1715
1716
1717
1718 private static double sinQ(double xa, double xb) {
1719 int idx = (int) ((xa * 8.0) + 0.5);
1720 final double epsilon = xa - EIGHTHS[idx];
1721
1722
1723 final double sintA = SINE_TABLE_A[idx];
1724 final double sintB = SINE_TABLE_B[idx];
1725 final double costA = COSINE_TABLE_A[idx];
1726 final double costB = COSINE_TABLE_B[idx];
1727
1728
1729 double sinEpsA = epsilon;
1730 double sinEpsB = polySine(epsilon);
1731 final double cosEpsA = 1.0;
1732 final double cosEpsB = polyCosine(epsilon);
1733
1734
1735 final double temp = sinEpsA * HEX_40000000;
1736 double temp2 = (sinEpsA + temp) - temp;
1737 sinEpsB += sinEpsA - temp2;
1738 sinEpsA = temp2;
1739
1740
1741 double result;
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764 double a = 0;
1765 double b = 0;
1766
1767 double t = sintA;
1768 double c = a + t;
1769 double d = -(c - a - t);
1770 a = c;
1771 b = b + d;
1772
1773 t = costA * sinEpsA;
1774 c = a + t;
1775 d = -(c - a - t);
1776 a = c;
1777 b = b + d;
1778
1779 b = b + sintA * cosEpsB + costA * sinEpsB;
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794 b = b + sintB + costB * sinEpsA + sintB * cosEpsB + costB * sinEpsB;
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821 if (xb != 0.0) {
1822 t = ((costA + costB) * (cosEpsA + cosEpsB) -
1823 (sintA + sintB) * (sinEpsA + sinEpsB)) * xb;
1824 c = a + t;
1825 d = -(c - a - t);
1826 a = c;
1827 b = b + d;
1828 }
1829
1830 result = a + b;
1831
1832 return result;
1833 }
1834
1835
1836
1837
1838
1839
1840
1841
1842 private static double cosQ(double xa, double xb) {
1843 final double pi2a = 1.5707963267948966;
1844 final double pi2b = 6.123233995736766E-17;
1845
1846 final double a = pi2a - xa;
1847 double b = -(a - pi2a + xa);
1848 b += pi2b - xb;
1849
1850 return sinQ(a, b);
1851 }
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861 private static double tanQ(double xa, double xb, boolean cotanFlag) {
1862
1863 int idx = (int) ((xa * 8.0) + 0.5);
1864 final double epsilon = xa - EIGHTHS[idx];
1865
1866
1867 final double sintA = SINE_TABLE_A[idx];
1868 final double sintB = SINE_TABLE_B[idx];
1869 final double costA = COSINE_TABLE_A[idx];
1870 final double costB = COSINE_TABLE_B[idx];
1871
1872
1873 double sinEpsA = epsilon;
1874 double sinEpsB = polySine(epsilon);
1875 final double cosEpsA = 1.0;
1876 final double cosEpsB = polyCosine(epsilon);
1877
1878
1879 double temp = sinEpsA * HEX_40000000;
1880 double temp2 = (sinEpsA + temp) - temp;
1881 sinEpsB += sinEpsA - temp2;
1882 sinEpsA = temp2;
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907 double a = 0;
1908 double b = 0;
1909
1910
1911 double t = sintA;
1912 double c = a + t;
1913 double d = -(c - a - t);
1914 a = c;
1915 b = b + d;
1916
1917 t = costA*sinEpsA;
1918 c = a + t;
1919 d = -(c - a - t);
1920 a = c;
1921 b = b + d;
1922
1923 b = b + sintA*cosEpsB + costA*sinEpsB;
1924 b = b + sintB + costB*sinEpsA + sintB*cosEpsB + costB*sinEpsB;
1925
1926 double sina = a + b;
1927 double sinb = -(sina - a - b);
1928
1929
1930
1931 a = b = c = d = 0.0;
1932
1933 t = costA*cosEpsA;
1934 c = a + t;
1935 d = -(c - a - t);
1936 a = c;
1937 b = b + d;
1938
1939 t = -sintA*sinEpsA;
1940 c = a + t;
1941 d = -(c - a - t);
1942 a = c;
1943 b = b + d;
1944
1945 b = b + costB*cosEpsA + costA*cosEpsB + costB*cosEpsB;
1946 b = b - (sintB*sinEpsA + sintA*sinEpsB + sintB*sinEpsB);
1947
1948 double cosa = a + b;
1949 double cosb = -(cosa - a - b);
1950
1951 if (cotanFlag) {
1952 double tmp;
1953 tmp = cosa; cosa = sina; sina = tmp;
1954 tmp = cosb; cosb = sinb; sinb = tmp;
1955 }
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968 double est = sina/cosa;
1969
1970
1971 temp = est * HEX_40000000;
1972 double esta = (est + temp) - temp;
1973 double estb = est - esta;
1974
1975 temp = cosa * HEX_40000000;
1976 double cosaa = (cosa + temp) - temp;
1977 double cosab = cosa - cosaa;
1978
1979
1980 double err = (sina - esta*cosaa - esta*cosab - estb*cosaa - estb*cosab)/cosa;
1981 err += sinb/cosa;
1982 err += -sina * cosb / cosa / cosa;
1983
1984 if (xb != 0.0) {
1985
1986
1987 double xbadj = xb + est*est*xb;
1988 if (cotanFlag) {
1989 xbadj = -xbadj;
1990 }
1991
1992 err += xbadj;
1993 }
1994
1995 return est+err;
1996 }
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009 private static void reducePayneHanek(double x, double result[])
2010 {
2011
2012 long inbits = Double.doubleToRawLongBits(x);
2013 int exponent = (int) ((inbits >> 52) & 0x7ff) - 1023;
2014
2015
2016 inbits &= 0x000fffffffffffffL;
2017 inbits |= 0x0010000000000000L;
2018
2019
2020 exponent++;
2021 inbits <<= 11;
2022
2023
2024 long shpi0;
2025 long shpiA;
2026 long shpiB;
2027 int idx = exponent >> 6;
2028 int shift = exponent - (idx << 6);
2029
2030 if (shift != 0) {
2031 shpi0 = (idx == 0) ? 0 : (RECIP_2PI[idx-1] << shift);
2032 shpi0 |= RECIP_2PI[idx] >>> (64-shift);
2033 shpiA = (RECIP_2PI[idx] << shift) | (RECIP_2PI[idx+1] >>> (64-shift));
2034 shpiB = (RECIP_2PI[idx+1] << shift) | (RECIP_2PI[idx+2] >>> (64-shift));
2035 } else {
2036 shpi0 = (idx == 0) ? 0 : RECIP_2PI[idx-1];
2037 shpiA = RECIP_2PI[idx];
2038 shpiB = RECIP_2PI[idx+1];
2039 }
2040
2041
2042 long a = inbits >>> 32;
2043 long b = inbits & 0xffffffffL;
2044
2045 long c = shpiA >>> 32;
2046 long d = shpiA & 0xffffffffL;
2047
2048 long ac = a * c;
2049 long bd = b * d;
2050 long bc = b * c;
2051 long ad = a * d;
2052
2053 long prodB = bd + (ad << 32);
2054 long prodA = ac + (ad >>> 32);
2055
2056 boolean bita = (bd & 0x8000000000000000L) != 0;
2057 boolean bitb = (ad & 0x80000000L ) != 0;
2058 boolean bitsum = (prodB & 0x8000000000000000L) != 0;
2059
2060
2061 if ( (bita && bitb) ||
2062 ((bita || bitb) && !bitsum) ) {
2063 prodA++;
2064 }
2065
2066 bita = (prodB & 0x8000000000000000L) != 0;
2067 bitb = (bc & 0x80000000L ) != 0;
2068
2069 prodB = prodB + (bc << 32);
2070 prodA = prodA + (bc >>> 32);
2071
2072 bitsum = (prodB & 0x8000000000000000L) != 0;
2073
2074
2075 if ( (bita && bitb) ||
2076 ((bita || bitb) && !bitsum) ) {
2077 prodA++;
2078 }
2079
2080
2081 c = shpiB >>> 32;
2082 d = shpiB & 0xffffffffL;
2083 ac = a * c;
2084 bc = b * c;
2085 ad = a * d;
2086
2087
2088 ac = ac + ((bc + ad) >>> 32);
2089
2090 bita = (prodB & 0x8000000000000000L) != 0;
2091 bitb = (ac & 0x8000000000000000L ) != 0;
2092 prodB += ac;
2093 bitsum = (prodB & 0x8000000000000000L) != 0;
2094
2095 if ( (bita && bitb) ||
2096 ((bita || bitb) && !bitsum) ) {
2097 prodA++;
2098 }
2099
2100
2101 c = shpi0 >>> 32;
2102 d = shpi0 & 0xffffffffL;
2103
2104 bd = b * d;
2105 bc = b * c;
2106 ad = a * d;
2107
2108 prodA += bd + ((bc + ad) << 32);
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120 int intPart = (int)(prodA >>> 62);
2121
2122
2123 prodA <<= 2;
2124 prodA |= prodB >>> 62;
2125 prodB <<= 2;
2126
2127
2128 a = prodA >>> 32;
2129 b = prodA & 0xffffffffL;
2130
2131 c = PI_O_4_BITS[0] >>> 32;
2132 d = PI_O_4_BITS[0] & 0xffffffffL;
2133
2134 ac = a * c;
2135 bd = b * d;
2136 bc = b * c;
2137 ad = a * d;
2138
2139 long prod2B = bd + (ad << 32);
2140 long prod2A = ac + (ad >>> 32);
2141
2142 bita = (bd & 0x8000000000000000L) != 0;
2143 bitb = (ad & 0x80000000L ) != 0;
2144 bitsum = (prod2B & 0x8000000000000000L) != 0;
2145
2146
2147 if ( (bita && bitb) ||
2148 ((bita || bitb) && !bitsum) ) {
2149 prod2A++;
2150 }
2151
2152 bita = (prod2B & 0x8000000000000000L) != 0;
2153 bitb = (bc & 0x80000000L ) != 0;
2154
2155 prod2B = prod2B + (bc << 32);
2156 prod2A = prod2A + (bc >>> 32);
2157
2158 bitsum = (prod2B & 0x8000000000000000L) != 0;
2159
2160
2161 if ( (bita && bitb) ||
2162 ((bita || bitb) && !bitsum) ) {
2163 prod2A++;
2164 }
2165
2166
2167 c = PI_O_4_BITS[1] >>> 32;
2168 d = PI_O_4_BITS[1] & 0xffffffffL;
2169 ac = a * c;
2170 bc = b * c;
2171 ad = a * d;
2172
2173
2174 ac = ac + ((bc + ad) >>> 32);
2175
2176 bita = (prod2B & 0x8000000000000000L) != 0;
2177 bitb = (ac & 0x8000000000000000L ) != 0;
2178 prod2B += ac;
2179 bitsum = (prod2B & 0x8000000000000000L) != 0;
2180
2181 if ( (bita && bitb) ||
2182 ((bita || bitb) && !bitsum) ) {
2183 prod2A++;
2184 }
2185
2186
2187 a = prodB >>> 32;
2188 b = prodB & 0xffffffffL;
2189 c = PI_O_4_BITS[0] >>> 32;
2190 d = PI_O_4_BITS[0] & 0xffffffffL;
2191 ac = a * c;
2192 bc = b * c;
2193 ad = a * d;
2194
2195
2196 ac = ac + ((bc + ad) >>> 32);
2197
2198 bita = (prod2B & 0x8000000000000000L) != 0;
2199 bitb = (ac & 0x8000000000000000L ) != 0;
2200 prod2B += ac;
2201 bitsum = (prod2B & 0x8000000000000000L) != 0;
2202
2203 if ( (bita && bitb) ||
2204 ((bita || bitb) && !bitsum) ) {
2205 prod2A++;
2206 }
2207
2208
2209 double tmpA = (prod2A >>> 12) / TWO_POWER_52;
2210 double tmpB = (((prod2A & 0xfffL) << 40) + (prod2B >>> 24)) / TWO_POWER_52 / TWO_POWER_52;
2211
2212 double sumA = tmpA + tmpB;
2213 double sumB = -(sumA - tmpA - tmpB);
2214
2215
2216 result[0] = intPart;
2217 result[1] = sumA * 2.0;
2218 result[2] = sumB * 2.0;
2219 }
2220
2221
2222
2223
2224
2225
2226
2227 public static double sin(double x) {
2228 boolean negative = false;
2229 int quadrant = 0;
2230 double xa;
2231 double xb = 0.0;
2232
2233
2234 xa = x;
2235 if (x < 0) {
2236 negative = true;
2237 xa = -xa;
2238 }
2239
2240
2241 if (xa == 0.0) {
2242 long bits = Double.doubleToRawLongBits(x);
2243 if (bits < 0) {
2244 return -0.0;
2245 }
2246 return 0.0;
2247 }
2248
2249 if (xa != xa || xa == Double.POSITIVE_INFINITY) {
2250 return Double.NaN;
2251 }
2252
2253
2254 if (xa > 3294198.0) {
2255
2256
2257
2258 double reduceResults[] = new double[3];
2259 reducePayneHanek(xa, reduceResults);
2260 quadrant = ((int) reduceResults[0]) & 3;
2261 xa = reduceResults[1];
2262 xb = reduceResults[2];
2263 } else if (xa > 1.5707963267948966) {
2264 final CodyWaite cw = new CodyWaite(xa);
2265 quadrant = cw.getK() & 3;
2266 xa = cw.getRemA();
2267 xb = cw.getRemB();
2268 }
2269
2270 if (negative) {
2271 quadrant ^= 2;
2272 }
2273
2274 switch (quadrant) {
2275 case 0:
2276 return sinQ(xa, xb);
2277 case 1:
2278 return cosQ(xa, xb);
2279 case 2:
2280 return -sinQ(xa, xb);
2281 case 3:
2282 return -cosQ(xa, xb);
2283 default:
2284 return Double.NaN;
2285 }
2286 }
2287
2288
2289
2290
2291
2292
2293
2294 public static double cos(double x) {
2295 int quadrant = 0;
2296
2297
2298 double xa = x;
2299 if (x < 0) {
2300 xa = -xa;
2301 }
2302
2303 if (xa != xa || xa == Double.POSITIVE_INFINITY) {
2304 return Double.NaN;
2305 }
2306
2307
2308 double xb = 0;
2309 if (xa > 3294198.0) {
2310
2311
2312
2313 double reduceResults[] = new double[3];
2314 reducePayneHanek(xa, reduceResults);
2315 quadrant = ((int) reduceResults[0]) & 3;
2316 xa = reduceResults[1];
2317 xb = reduceResults[2];
2318 } else if (xa > 1.5707963267948966) {
2319 final CodyWaite cw = new CodyWaite(xa);
2320 quadrant = cw.getK() & 3;
2321 xa = cw.getRemA();
2322 xb = cw.getRemB();
2323 }
2324
2325
2326
2327
2328 switch (quadrant) {
2329 case 0:
2330 return cosQ(xa, xb);
2331 case 1:
2332 return -sinQ(xa, xb);
2333 case 2:
2334 return -cosQ(xa, xb);
2335 case 3:
2336 return sinQ(xa, xb);
2337 default:
2338 return Double.NaN;
2339 }
2340 }
2341
2342
2343
2344
2345
2346
2347
2348 public static double tan(double x) {
2349 boolean negative = false;
2350 int quadrant = 0;
2351
2352
2353 double xa = x;
2354 if (x < 0) {
2355 negative = true;
2356 xa = -xa;
2357 }
2358
2359
2360 if (xa == 0.0) {
2361 long bits = Double.doubleToRawLongBits(x);
2362 if (bits < 0) {
2363 return -0.0;
2364 }
2365 return 0.0;
2366 }
2367
2368 if (xa != xa || xa == Double.POSITIVE_INFINITY) {
2369 return Double.NaN;
2370 }
2371
2372
2373 double xb = 0;
2374 if (xa > 3294198.0) {
2375
2376
2377
2378 double reduceResults[] = new double[3];
2379 reducePayneHanek(xa, reduceResults);
2380 quadrant = ((int) reduceResults[0]) & 3;
2381 xa = reduceResults[1];
2382 xb = reduceResults[2];
2383 } else if (xa > 1.5707963267948966) {
2384 final CodyWaite cw = new CodyWaite(xa);
2385 quadrant = cw.getK() & 3;
2386 xa = cw.getRemA();
2387 xb = cw.getRemB();
2388 }
2389
2390 if (xa > 1.5) {
2391
2392 final double pi2a = 1.5707963267948966;
2393 final double pi2b = 6.123233995736766E-17;
2394
2395 final double a = pi2a - xa;
2396 double b = -(a - pi2a + xa);
2397 b += pi2b - xb;
2398
2399 xa = a + b;
2400 xb = -(xa - a - b);
2401 quadrant ^= 1;
2402 negative ^= true;
2403 }
2404
2405 double result;
2406 if ((quadrant & 1) == 0) {
2407 result = tanQ(xa, xb, false);
2408 } else {
2409 result = -tanQ(xa, xb, true);
2410 }
2411
2412 if (negative) {
2413 result = -result;
2414 }
2415
2416 return result;
2417 }
2418
2419
2420
2421
2422
2423
2424 public static double atan(double x) {
2425 return atan(x, 0.0, false);
2426 }
2427
2428
2429
2430
2431
2432
2433
2434 private static double atan(double xa, double xb, boolean leftPlane) {
2435 boolean negate = false;
2436 int idx;
2437
2438 if (xa == 0.0) {
2439 return leftPlane ? copySign(Math.PI, xa) : xa;
2440 }
2441
2442 if (xa < 0) {
2443
2444 xa = -xa;
2445 xb = -xb;
2446 negate = true;
2447 }
2448
2449 if (xa > 1.633123935319537E16) {
2450 return (negate ^ leftPlane) ? (-Math.PI * F_1_2) : (Math.PI * F_1_2);
2451 }
2452
2453
2454 if (xa < 1) {
2455 idx = (int) (((-1.7168146928204136 * xa * xa + 8.0) * xa) + 0.5);
2456 } else {
2457 final double oneOverXa = 1 / xa;
2458 idx = (int) (-((-1.7168146928204136 * oneOverXa * oneOverXa + 8.0) * oneOverXa) + 13.07);
2459 }
2460 double epsA = xa - TANGENT_TABLE_A[idx];
2461 double epsB = -(epsA - xa + TANGENT_TABLE_A[idx]);
2462 epsB += xb - TANGENT_TABLE_B[idx];
2463
2464 double temp = epsA + epsB;
2465 epsB = -(temp - epsA - epsB);
2466 epsA = temp;
2467
2468
2469 temp = xa * HEX_40000000;
2470 double ya = xa + temp - temp;
2471 double yb = xb + xa - ya;
2472 xa = ya;
2473 xb += yb;
2474
2475
2476 if (idx == 0) {
2477
2478
2479 final double denom = 1d / (1d + (xa + xb) * (TANGENT_TABLE_A[idx] + TANGENT_TABLE_B[idx]));
2480
2481 ya = epsA * denom;
2482 yb = epsB * denom;
2483 } else {
2484 double temp2 = xa * TANGENT_TABLE_A[idx];
2485 double za = 1d + temp2;
2486 double zb = -(za - 1d - temp2);
2487 temp2 = xb * TANGENT_TABLE_A[idx] + xa * TANGENT_TABLE_B[idx];
2488 temp = za + temp2;
2489 zb += -(temp - za - temp2);
2490 za = temp;
2491
2492 zb += xb * TANGENT_TABLE_B[idx];
2493 ya = epsA / za;
2494
2495 temp = ya * HEX_40000000;
2496 final double yaa = (ya + temp) - temp;
2497 final double yab = ya - yaa;
2498
2499 temp = za * HEX_40000000;
2500 final double zaa = (za + temp) - temp;
2501 final double zab = za - zaa;
2502
2503
2504 yb = (epsA - yaa * zaa - yaa * zab - yab * zaa - yab * zab) / za;
2505
2506 yb += -epsA * zb / za / za;
2507 yb += epsB / za;
2508 }
2509
2510
2511 epsA = ya;
2512 epsB = yb;
2513
2514
2515 final double epsA2 = epsA * epsA;
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526 yb = 0.07490822288864472;
2527 yb = yb * epsA2 + -0.09088450866185192;
2528 yb = yb * epsA2 + 0.11111095942313305;
2529 yb = yb * epsA2 + -0.1428571423679182;
2530 yb = yb * epsA2 + 0.19999999999923582;
2531 yb = yb * epsA2 + -0.33333333333333287;
2532 yb = yb * epsA2 * epsA;
2533
2534
2535 ya = epsA;
2536
2537 temp = ya + yb;
2538 yb = -(temp - ya - yb);
2539 ya = temp;
2540
2541
2542 yb += epsB / (1d + epsA * epsA);
2543
2544
2545 double za = EIGHTHS[idx] + ya;
2546 double zb = -(za - EIGHTHS[idx] - ya);
2547 temp = za + yb;
2548 zb += -(temp - za - yb);
2549 za = temp;
2550
2551 double result = za + zb;
2552 double resultb = -(result - za - zb);
2553
2554 if (leftPlane) {
2555
2556 final double pia = 1.5707963267948966 * 2;
2557 final double pib = 6.123233995736766E-17 * 2;
2558
2559 za = pia - result;
2560 zb = -(za - pia + result);
2561 zb += pib - resultb;
2562
2563 result = za + zb;
2564 resultb = -(result - za - zb);
2565 }
2566
2567
2568 if (negate ^ leftPlane) {
2569 result = -result;
2570 }
2571
2572 return result;
2573 }
2574
2575
2576
2577
2578
2579
2580
2581 public static double atan2(double y, double x) {
2582 if (x != x || y != y) {
2583 return Double.NaN;
2584 }
2585
2586 if (y == 0) {
2587 final double result = x * y;
2588 final double invx = 1d / x;
2589 final double invy = 1d / y;
2590
2591 if (invx == 0) {
2592 if (x > 0) {
2593 return y;
2594 } else {
2595 return copySign(Math.PI, y);
2596 }
2597 }
2598
2599 if (x < 0 || invx < 0) {
2600 if (y < 0 || invy < 0) {
2601 return -Math.PI;
2602 } else {
2603 return Math.PI;
2604 }
2605 } else {
2606 return result;
2607 }
2608 }
2609
2610
2611
2612 if (y == Double.POSITIVE_INFINITY) {
2613 if (x == Double.POSITIVE_INFINITY) {
2614 return Math.PI * F_1_4;
2615 }
2616
2617 if (x == Double.NEGATIVE_INFINITY) {
2618 return Math.PI * F_3_4;
2619 }
2620
2621 return Math.PI * F_1_2;
2622 }
2623
2624 if (y == Double.NEGATIVE_INFINITY) {
2625 if (x == Double.POSITIVE_INFINITY) {
2626 return -Math.PI * F_1_4;
2627 }
2628
2629 if (x == Double.NEGATIVE_INFINITY) {
2630 return -Math.PI * F_3_4;
2631 }
2632
2633 return -Math.PI * F_1_2;
2634 }
2635
2636 if (x == Double.POSITIVE_INFINITY) {
2637 if (y > 0 || 1 / y > 0) {
2638 return 0d;
2639 }
2640
2641 if (y < 0 || 1 / y < 0) {
2642 return -0d;
2643 }
2644 }
2645
2646 if (x == Double.NEGATIVE_INFINITY)
2647 {
2648 if (y > 0.0 || 1 / y > 0.0) {
2649 return Math.PI;
2650 }
2651
2652 if (y < 0 || 1 / y < 0) {
2653 return -Math.PI;
2654 }
2655 }
2656
2657
2658
2659 if (x == 0) {
2660 if (y > 0 || 1 / y > 0) {
2661 return Math.PI * F_1_2;
2662 }
2663
2664 if (y < 0 || 1 / y < 0) {
2665 return -Math.PI * F_1_2;
2666 }
2667 }
2668
2669
2670 final double r = y / x;
2671 if (Double.isInfinite(r)) {
2672 return atan(r, 0, x < 0);
2673 }
2674
2675 double ra = doubleHighPart(r);
2676 double rb = r - ra;
2677
2678
2679 final double xa = doubleHighPart(x);
2680 final double xb = x - xa;
2681
2682 rb += (y - ra * xa - ra * xb - rb * xa - rb * xb) / x;
2683
2684 final double temp = ra + rb;
2685 rb = -(temp - ra - rb);
2686 ra = temp;
2687
2688 if (ra == 0) {
2689 ra = copySign(0d, y);
2690 }
2691
2692
2693 final double result = atan(ra, rb, x < 0);
2694
2695 return result;
2696 }
2697
2698
2699
2700
2701
2702 public static double asin(double x) {
2703 if (x != x) {
2704 return Double.NaN;
2705 }
2706
2707 if (x > 1.0 || x < -1.0) {
2708 return Double.NaN;
2709 }
2710
2711 if (x == 1.0) {
2712 return Math.PI/2.0;
2713 }
2714
2715 if (x == -1.0) {
2716 return -Math.PI/2.0;
2717 }
2718
2719 if (x == 0.0) {
2720 return x;
2721 }
2722
2723
2724
2725
2726 double temp = x * HEX_40000000;
2727 final double xa = x + temp - temp;
2728 final double xb = x - xa;
2729
2730
2731 double ya = xa*xa;
2732 double yb = xa*xb*2.0 + xb*xb;
2733
2734
2735 ya = -ya;
2736 yb = -yb;
2737
2738 double za = 1.0 + ya;
2739 double zb = -(za - 1.0 - ya);
2740
2741 temp = za + yb;
2742 zb += -(temp - za - yb);
2743 za = temp;
2744
2745
2746 double y;
2747 y = sqrt(za);
2748 temp = y * HEX_40000000;
2749 ya = y + temp - temp;
2750 yb = y - ya;
2751
2752
2753 yb += (za - ya*ya - 2*ya*yb - yb*yb) / (2.0*y);
2754
2755
2756 double dx = zb / (2.0*y);
2757
2758
2759 double r = x/y;
2760 temp = r * HEX_40000000;
2761 double ra = r + temp - temp;
2762 double rb = r - ra;
2763
2764 rb += (x - ra*ya - ra*yb - rb*ya - rb*yb) / y;
2765 rb += -x * dx / y / y;
2766
2767 temp = ra + rb;
2768 rb = -(temp - ra - rb);
2769 ra = temp;
2770
2771 return atan(ra, rb, false);
2772 }
2773
2774
2775
2776
2777
2778 public static double acos(double x) {
2779 if (x != x) {
2780 return Double.NaN;
2781 }
2782
2783 if (x > 1.0 || x < -1.0) {
2784 return Double.NaN;
2785 }
2786
2787 if (x == -1.0) {
2788 return Math.PI;
2789 }
2790
2791 if (x == 1.0) {
2792 return 0.0;
2793 }
2794
2795 if (x == 0) {
2796 return Math.PI/2.0;
2797 }
2798
2799
2800
2801
2802 double temp = x * HEX_40000000;
2803 final double xa = x + temp - temp;
2804 final double xb = x - xa;
2805
2806
2807 double ya = xa*xa;
2808 double yb = xa*xb*2.0 + xb*xb;
2809
2810
2811 ya = -ya;
2812 yb = -yb;
2813
2814 double za = 1.0 + ya;
2815 double zb = -(za - 1.0 - ya);
2816
2817 temp = za + yb;
2818 zb += -(temp - za - yb);
2819 za = temp;
2820
2821
2822 double y = sqrt(za);
2823 temp = y * HEX_40000000;
2824 ya = y + temp - temp;
2825 yb = y - ya;
2826
2827
2828 yb += (za - ya*ya - 2*ya*yb - yb*yb) / (2.0*y);
2829
2830
2831 yb += zb / (2.0*y);
2832 y = ya+yb;
2833 yb = -(y - ya - yb);
2834
2835
2836 double r = y/x;
2837
2838
2839 if (Double.isInfinite(r)) {
2840 return Math.PI/2;
2841 }
2842
2843 double ra = doubleHighPart(r);
2844 double rb = r - ra;
2845
2846 rb += (y - ra*xa - ra*xb - rb*xa - rb*xb) / x;
2847 rb += yb / x;
2848
2849 temp = ra + rb;
2850 rb = -(temp - ra - rb);
2851 ra = temp;
2852
2853 return atan(ra, rb, x<0);
2854 }
2855
2856
2857
2858
2859
2860 public static double cbrt(double x) {
2861
2862 long inbits = Double.doubleToRawLongBits(x);
2863 int exponent = (int) ((inbits >> 52) & 0x7ff) - 1023;
2864 boolean subnormal = false;
2865
2866 if (exponent == -1023) {
2867 if (x == 0) {
2868 return x;
2869 }
2870
2871
2872 subnormal = true;
2873 x *= 1.8014398509481984E16;
2874 inbits = Double.doubleToRawLongBits(x);
2875 exponent = (int) ((inbits >> 52) & 0x7ff) - 1023;
2876 }
2877
2878 if (exponent == 1024) {
2879
2880 return x;
2881 }
2882
2883
2884 int exp3 = exponent / 3;
2885
2886
2887 double p2 = Double.longBitsToDouble((inbits & 0x8000000000000000L) |
2888 (long)(((exp3 + 1023) & 0x7ff)) << 52);
2889
2890
2891 final double mant = Double.longBitsToDouble((inbits & 0x000fffffffffffffL) | 0x3ff0000000000000L);
2892
2893
2894 double est = -0.010714690733195933;
2895 est = est * mant + 0.0875862700108075;
2896 est = est * mant + -0.3058015757857271;
2897 est = est * mant + 0.7249995199969751;
2898 est = est * mant + 0.5039018405998233;
2899
2900 est *= CBRTTWO[exponent % 3 + 2];
2901
2902
2903
2904
2905 final double xs = x / (p2*p2*p2);
2906 est += (xs - est*est*est) / (3*est*est);
2907 est += (xs - est*est*est) / (3*est*est);
2908
2909
2910 double temp = est * HEX_40000000;
2911 double ya = est + temp - temp;
2912 double yb = est - ya;
2913
2914 double za = ya * ya;
2915 double zb = ya * yb * 2.0 + yb * yb;
2916 temp = za * HEX_40000000;
2917 double temp2 = za + temp - temp;
2918 zb += za - temp2;
2919 za = temp2;
2920
2921 zb = za * yb + ya * zb + zb * yb;
2922 za = za * ya;
2923
2924 double na = xs - za;
2925 double nb = -(na - xs + za);
2926 nb -= zb;
2927
2928 est += (na+nb)/(3*est*est);
2929
2930
2931 est *= p2;
2932
2933 if (subnormal) {
2934 est *= 3.814697265625E-6;
2935 }
2936
2937 return est;
2938 }
2939
2940
2941
2942
2943
2944
2945 public static double toRadians(double x)
2946 {
2947 if (Double.isInfinite(x) || x == 0.0) {
2948 return x;
2949 }
2950
2951
2952 final double facta = 0.01745329052209854;
2953 final double factb = 1.997844754509471E-9;
2954
2955 double xa = doubleHighPart(x);
2956 double xb = x - xa;
2957
2958 double result = xb * factb + xb * facta + xa * factb + xa * facta;
2959 if (result == 0) {
2960 result = result * x;
2961 }
2962 return result;
2963 }
2964
2965
2966
2967
2968
2969
2970 public static double toDegrees(double x)
2971 {
2972 if (Double.isInfinite(x) || x == 0.0) {
2973 return x;
2974 }
2975
2976
2977 final double facta = 57.2957763671875;
2978 final double factb = 3.145894820876798E-6;
2979
2980 double xa = doubleHighPart(x);
2981 double xb = x - xa;
2982
2983 return xb * factb + xb * facta + xa * factb + xa * facta;
2984 }
2985
2986
2987
2988
2989
2990
2991 public static int abs(final int x) {
2992 final int i = x >>> 31;
2993 return (x ^ (~i + 1)) + i;
2994 }
2995
2996
2997
2998
2999
3000
3001 public static long abs(final long x) {
3002 final long l = x >>> 63;
3003
3004
3005
3006
3007 return (x ^ (~l + 1)) + l;
3008 }
3009
3010
3011
3012
3013
3014
3015 public static float abs(final float x) {
3016 return Float.intBitsToFloat(MASK_NON_SIGN_INT & Float.floatToRawIntBits(x));
3017 }
3018
3019
3020
3021
3022
3023
3024 public static double abs(double x) {
3025 return Double.longBitsToDouble(MASK_NON_SIGN_LONG & Double.doubleToRawLongBits(x));
3026 }
3027
3028
3029
3030
3031
3032
3033 public static double ulp(double x) {
3034 if (Double.isInfinite(x)) {
3035 return Double.POSITIVE_INFINITY;
3036 }
3037 return abs(x - Double.longBitsToDouble(Double.doubleToRawLongBits(x) ^ 1));
3038 }
3039
3040
3041
3042
3043
3044
3045 public static float ulp(float x) {
3046 if (Float.isInfinite(x)) {
3047 return Float.POSITIVE_INFINITY;
3048 }
3049 return abs(x - Float.intBitsToFloat(Float.floatToIntBits(x) ^ 1));
3050 }
3051
3052
3053
3054
3055
3056
3057
3058 public static double scalb(final double d, final int n) {
3059
3060
3061 if ((n > -1023) && (n < 1024)) {
3062 return d * Double.longBitsToDouble(((long) (n + 1023)) << 52);
3063 }
3064
3065
3066 if (Double.isNaN(d) || Double.isInfinite(d) || (d == 0)) {
3067 return d;
3068 }
3069 if (n < -2098) {
3070 return (d > 0) ? 0.0 : -0.0;
3071 }
3072 if (n > 2097) {
3073 return (d > 0) ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY;
3074 }
3075
3076
3077 final long bits = Double.doubleToRawLongBits(d);
3078 final long sign = bits & 0x8000000000000000L;
3079 int exponent = ((int) (bits >>> 52)) & 0x7ff;
3080 long mantissa = bits & 0x000fffffffffffffL;
3081
3082
3083 int scaledExponent = exponent + n;
3084
3085 if (n < 0) {
3086
3087 if (scaledExponent > 0) {
3088
3089 return Double.longBitsToDouble(sign | (((long) scaledExponent) << 52) | mantissa);
3090 } else if (scaledExponent > -53) {
3091
3092
3093
3094 mantissa = mantissa | (1L << 52);
3095
3096
3097 final long mostSignificantLostBit = mantissa & (1L << (-scaledExponent));
3098 mantissa = mantissa >>> (1 - scaledExponent);
3099 if (mostSignificantLostBit != 0) {
3100
3101 mantissa++;
3102 }
3103 return Double.longBitsToDouble(sign | mantissa);
3104
3105 } else {
3106
3107 return (sign == 0L) ? 0.0 : -0.0;
3108 }
3109 } else {
3110
3111 if (exponent == 0) {
3112
3113
3114 while ((mantissa >>> 52) != 1) {
3115 mantissa = mantissa << 1;
3116 --scaledExponent;
3117 }
3118 ++scaledExponent;
3119 mantissa = mantissa & 0x000fffffffffffffL;
3120
3121 if (scaledExponent < 2047) {
3122 return Double.longBitsToDouble(sign | (((long) scaledExponent) << 52) | mantissa);
3123 } else {
3124 return (sign == 0L) ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY;
3125 }
3126
3127 } else if (scaledExponent < 2047) {
3128 return Double.longBitsToDouble(sign | (((long) scaledExponent) << 52) | mantissa);
3129 } else {
3130 return (sign == 0L) ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY;
3131 }
3132 }
3133
3134 }
3135
3136
3137
3138
3139
3140
3141
3142 public static float scalb(final float f, final int n) {
3143
3144
3145 if ((n > -127) && (n < 128)) {
3146 return f * Float.intBitsToFloat((n + 127) << 23);
3147 }
3148
3149
3150 if (Float.isNaN(f) || Float.isInfinite(f) || (f == 0f)) {
3151 return f;
3152 }
3153 if (n < -277) {
3154 return (f > 0) ? 0.0f : -0.0f;
3155 }
3156 if (n > 276) {
3157 return (f > 0) ? Float.POSITIVE_INFINITY : Float.NEGATIVE_INFINITY;
3158 }
3159
3160
3161 final int bits = Float.floatToIntBits(f);
3162 final int sign = bits & 0x80000000;
3163 int exponent = (bits >>> 23) & 0xff;
3164 int mantissa = bits & 0x007fffff;
3165
3166
3167 int scaledExponent = exponent + n;
3168
3169 if (n < 0) {
3170
3171 if (scaledExponent > 0) {
3172
3173 return Float.intBitsToFloat(sign | (scaledExponent << 23) | mantissa);
3174 } else if (scaledExponent > -24) {
3175
3176
3177
3178 mantissa = mantissa | (1 << 23);
3179
3180
3181 final int mostSignificantLostBit = mantissa & (1 << (-scaledExponent));
3182 mantissa = mantissa >>> (1 - scaledExponent);
3183 if (mostSignificantLostBit != 0) {
3184
3185 mantissa++;
3186 }
3187 return Float.intBitsToFloat(sign | mantissa);
3188
3189 } else {
3190
3191 return (sign == 0) ? 0.0f : -0.0f;
3192 }
3193 } else {
3194
3195 if (exponent == 0) {
3196
3197
3198 while ((mantissa >>> 23) != 1) {
3199 mantissa = mantissa << 1;
3200 --scaledExponent;
3201 }
3202 ++scaledExponent;
3203 mantissa = mantissa & 0x007fffff;
3204
3205 if (scaledExponent < 255) {
3206 return Float.intBitsToFloat(sign | (scaledExponent << 23) | mantissa);
3207 } else {
3208 return (sign == 0) ? Float.POSITIVE_INFINITY : Float.NEGATIVE_INFINITY;
3209 }
3210
3211 } else if (scaledExponent < 255) {
3212 return Float.intBitsToFloat(sign | (scaledExponent << 23) | mantissa);
3213 } else {
3214 return (sign == 0) ? Float.POSITIVE_INFINITY : Float.NEGATIVE_INFINITY;
3215 }
3216 }
3217
3218 }
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251 public static double nextAfter(double d, double direction) {
3252
3253
3254 if (Double.isNaN(d) || Double.isNaN(direction)) {
3255 return Double.NaN;
3256 } else if (d == direction) {
3257 return direction;
3258 } else if (Double.isInfinite(d)) {
3259 return (d < 0) ? -Double.MAX_VALUE : Double.MAX_VALUE;
3260 } else if (d == 0) {
3261 return (direction < 0) ? -Double.MIN_VALUE : Double.MIN_VALUE;
3262 }
3263
3264
3265
3266 final long bits = Double.doubleToRawLongBits(d);
3267 final long sign = bits & 0x8000000000000000L;
3268 if ((direction < d) ^ (sign == 0L)) {
3269 return Double.longBitsToDouble(sign | ((bits & 0x7fffffffffffffffL) + 1));
3270 } else {
3271 return Double.longBitsToDouble(sign | ((bits & 0x7fffffffffffffffL) - 1));
3272 }
3273
3274 }
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307 public static float nextAfter(final float f, final double direction) {
3308
3309
3310 if (Double.isNaN(f) || Double.isNaN(direction)) {
3311 return Float.NaN;
3312 } else if (f == direction) {
3313 return (float) direction;
3314 } else if (Float.isInfinite(f)) {
3315 return (f < 0f) ? -Float.MAX_VALUE : Float.MAX_VALUE;
3316 } else if (f == 0f) {
3317 return (direction < 0) ? -Float.MIN_VALUE : Float.MIN_VALUE;
3318 }
3319
3320
3321
3322 final int bits = Float.floatToIntBits(f);
3323 final int sign = bits & 0x80000000;
3324 if ((direction < f) ^ (sign == 0)) {
3325 return Float.intBitsToFloat(sign | ((bits & 0x7fffffff) + 1));
3326 } else {
3327 return Float.intBitsToFloat(sign | ((bits & 0x7fffffff) - 1));
3328 }
3329
3330 }
3331
3332
3333
3334
3335
3336 public static double floor(double x) {
3337 long y;
3338
3339 if (x != x) {
3340 return x;
3341 }
3342
3343 if (x >= TWO_POWER_52 || x <= -TWO_POWER_52) {
3344 return x;
3345 }
3346
3347 y = (long) x;
3348 if (x < 0 && y != x) {
3349 y--;
3350 }
3351
3352 if (y == 0) {
3353 return x*y;
3354 }
3355
3356 return y;
3357 }
3358
3359
3360
3361
3362
3363 public static double ceil(double x) {
3364 double y;
3365
3366 if (x != x) {
3367 return x;
3368 }
3369
3370 y = floor(x);
3371 if (y == x) {
3372 return y;
3373 }
3374
3375 y += 1.0;
3376
3377 if (y == 0) {
3378 return x*y;
3379 }
3380
3381 return y;
3382 }
3383
3384
3385
3386
3387
3388 public static double rint(double x) {
3389 double y = floor(x);
3390 double d = x - y;
3391
3392 if (d > 0.5) {
3393 if (y == -1.0) {
3394 return -0.0;
3395 }
3396 return y+1.0;
3397 }
3398 if (d < 0.5) {
3399 return y;
3400 }
3401
3402
3403 long z = (long) y;
3404 return (z & 1) == 0 ? y : y + 1.0;
3405 }
3406
3407
3408
3409
3410
3411 public static long round(double x) {
3412 return (long) floor(x + 0.5);
3413 }
3414
3415
3416
3417
3418
3419 public static int round(final float x) {
3420 return (int) floor(x + 0.5f);
3421 }
3422
3423
3424
3425
3426
3427
3428 public static int min(final int a, final int b) {
3429 return (a <= b) ? a : b;
3430 }
3431
3432
3433
3434
3435
3436
3437 public static long min(final long a, final long b) {
3438 return (a <= b) ? a : b;
3439 }
3440
3441
3442
3443
3444
3445
3446 public static float min(final float a, final float b) {
3447 if (a > b) {
3448 return b;
3449 }
3450 if (a < b) {
3451 return a;
3452 }
3453
3454 if (a != b) {
3455 return Float.NaN;
3456 }
3457
3458
3459 int bits = Float.floatToRawIntBits(a);
3460 if (bits == 0x80000000) {
3461 return a;
3462 }
3463 return b;
3464 }
3465
3466
3467
3468
3469
3470
3471 public static double min(final double a, final double b) {
3472 if (a > b) {
3473 return b;
3474 }
3475 if (a < b) {
3476 return a;
3477 }
3478
3479 if (a != b) {
3480 return Double.NaN;
3481 }
3482
3483
3484 long bits = Double.doubleToRawLongBits(a);
3485 if (bits == 0x8000000000000000L) {
3486 return a;
3487 }
3488 return b;
3489 }
3490
3491
3492
3493
3494
3495
3496 public static int max(final int a, final int b) {
3497 return (a <= b) ? b : a;
3498 }
3499
3500
3501
3502
3503
3504
3505 public static long max(final long a, final long b) {
3506 return (a <= b) ? b : a;
3507 }
3508
3509
3510
3511
3512
3513
3514 public static float max(final float a, final float b) {
3515 if (a > b) {
3516 return a;
3517 }
3518 if (a < b) {
3519 return b;
3520 }
3521
3522 if (a != b) {
3523 return Float.NaN;
3524 }
3525
3526
3527 int bits = Float.floatToRawIntBits(a);
3528 if (bits == 0x80000000) {
3529 return b;
3530 }
3531 return a;
3532 }
3533
3534
3535
3536
3537
3538
3539 public static double max(final double a, final double b) {
3540 if (a > b) {
3541 return a;
3542 }
3543 if (a < b) {
3544 return b;
3545 }
3546
3547 if (a != b) {
3548 return Double.NaN;
3549 }
3550
3551
3552 long bits = Double.doubleToRawLongBits(a);
3553 if (bits == 0x8000000000000000L) {
3554 return b;
3555 }
3556 return a;
3557 }
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573 public static double hypot(final double x, final double y) {
3574 if (Double.isInfinite(x) || Double.isInfinite(y)) {
3575 return Double.POSITIVE_INFINITY;
3576 } else if (Double.isNaN(x) || Double.isNaN(y)) {
3577 return Double.NaN;
3578 } else {
3579
3580 final int expX = getExponent(x);
3581 final int expY = getExponent(y);
3582 if (expX > expY + 27) {
3583
3584 return abs(x);
3585 } else if (expY > expX + 27) {
3586
3587 return abs(y);
3588 } else {
3589
3590
3591 final int middleExp = (expX + expY) / 2;
3592
3593
3594 final double scaledX = scalb(x, -middleExp);
3595 final double scaledY = scalb(y, -middleExp);
3596
3597
3598 final double scaledH = sqrt(scaledX * scaledX + scaledY * scaledY);
3599
3600
3601 return scalb(scaledH, middleExp);
3602
3603 }
3604
3605 }
3606 }
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628 public static double IEEEremainder(double dividend, double divisor) {
3629 return StrictMath.IEEEremainder(dividend, divisor);
3630 }
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640 public static double copySign(double magnitude, double sign){
3641
3642
3643
3644
3645 final long m = Double.doubleToRawLongBits(magnitude);
3646 final long s = Double.doubleToRawLongBits(sign);
3647 if ((m^s) >= 0) {
3648 return magnitude;
3649 }
3650 return -magnitude;
3651 }
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661 public static float copySign(float magnitude, float sign){
3662
3663
3664
3665
3666 final int m = Float.floatToRawIntBits(magnitude);
3667 final int s = Float.floatToRawIntBits(sign);
3668 if ((m^s) >= 0) {
3669 return magnitude;
3670 }
3671 return -magnitude;
3672 }
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683 public static int getExponent(final double d) {
3684
3685 return (int) ((Double.doubleToRawLongBits(d) >>> 52) & 0x7ff) - 1023;
3686 }
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697 public static int getExponent(final float f) {
3698
3699 return ((Float.floatToRawIntBits(f) >>> 23) & 0xff) - 127;
3700 }
3701
3702
3703
3704
3705
3706
3707 public static void main(String[] a) {
3708 PrintStream out = System.out;
3709 FastMathCalc.printarray(out, "EXP_INT_TABLE_A", EXP_INT_TABLE_LEN, ExpIntTable.EXP_INT_TABLE_A);
3710 FastMathCalc.printarray(out, "EXP_INT_TABLE_B", EXP_INT_TABLE_LEN, ExpIntTable.EXP_INT_TABLE_B);
3711 FastMathCalc.printarray(out, "EXP_FRAC_TABLE_A", EXP_FRAC_TABLE_LEN, ExpFracTable.EXP_FRAC_TABLE_A);
3712 FastMathCalc.printarray(out, "EXP_FRAC_TABLE_B", EXP_FRAC_TABLE_LEN, ExpFracTable.EXP_FRAC_TABLE_B);
3713 FastMathCalc.printarray(out, "LN_MANT",LN_MANT_LEN, lnMant.LN_MANT);
3714 FastMathCalc.printarray(out, "SINE_TABLE_A", SINE_TABLE_LEN, SINE_TABLE_A);
3715 FastMathCalc.printarray(out, "SINE_TABLE_B", SINE_TABLE_LEN, SINE_TABLE_B);
3716 FastMathCalc.printarray(out, "COSINE_TABLE_A", SINE_TABLE_LEN, COSINE_TABLE_A);
3717 FastMathCalc.printarray(out, "COSINE_TABLE_B", SINE_TABLE_LEN, COSINE_TABLE_B);
3718 FastMathCalc.printarray(out, "TANGENT_TABLE_A", SINE_TABLE_LEN, TANGENT_TABLE_A);
3719 FastMathCalc.printarray(out, "TANGENT_TABLE_B", SINE_TABLE_LEN, TANGENT_TABLE_B);
3720 }
3721
3722
3723 private static class ExpIntTable {
3724
3725
3726
3727 private static final double[] EXP_INT_TABLE_A;
3728
3729
3730
3731 private static final double[] EXP_INT_TABLE_B;
3732
3733 static {
3734 if (RECOMPUTE_TABLES_AT_RUNTIME) {
3735 EXP_INT_TABLE_A = new double[FastMath.EXP_INT_TABLE_LEN];
3736 EXP_INT_TABLE_B = new double[FastMath.EXP_INT_TABLE_LEN];
3737
3738 final double tmp[] = new double[2];
3739 final double recip[] = new double[2];
3740
3741
3742 for (int i = 0; i < FastMath.EXP_INT_TABLE_MAX_INDEX; i++) {
3743 FastMathCalc.expint(i, tmp);
3744 EXP_INT_TABLE_A[i + FastMath.EXP_INT_TABLE_MAX_INDEX] = tmp[0];
3745 EXP_INT_TABLE_B[i + FastMath.EXP_INT_TABLE_MAX_INDEX] = tmp[1];
3746
3747 if (i != 0) {
3748
3749 FastMathCalc.splitReciprocal(tmp, recip);
3750 EXP_INT_TABLE_A[FastMath.EXP_INT_TABLE_MAX_INDEX - i] = recip[0];
3751 EXP_INT_TABLE_B[FastMath.EXP_INT_TABLE_MAX_INDEX - i] = recip[1];
3752 }
3753 }
3754 } else {
3755 EXP_INT_TABLE_A = FastMathLiteralArrays.loadExpIntA();
3756 EXP_INT_TABLE_B = FastMathLiteralArrays.loadExpIntB();
3757 }
3758 }
3759 }
3760
3761
3762 private static class ExpFracTable {
3763
3764
3765
3766
3767 private static final double[] EXP_FRAC_TABLE_A;
3768
3769
3770
3771 private static final double[] EXP_FRAC_TABLE_B;
3772
3773 static {
3774 if (RECOMPUTE_TABLES_AT_RUNTIME) {
3775 EXP_FRAC_TABLE_A = new double[FastMath.EXP_FRAC_TABLE_LEN];
3776 EXP_FRAC_TABLE_B = new double[FastMath.EXP_FRAC_TABLE_LEN];
3777
3778 final double tmp[] = new double[2];
3779
3780
3781 final double factor = 1d / (EXP_FRAC_TABLE_LEN - 1);
3782 for (int i = 0; i < EXP_FRAC_TABLE_A.length; i++) {
3783 FastMathCalc.slowexp(i * factor, tmp);
3784 EXP_FRAC_TABLE_A[i] = tmp[0];
3785 EXP_FRAC_TABLE_B[i] = tmp[1];
3786 }
3787 } else {
3788 EXP_FRAC_TABLE_A = FastMathLiteralArrays.loadExpFracA();
3789 EXP_FRAC_TABLE_B = FastMathLiteralArrays.loadExpFracB();
3790 }
3791 }
3792 }
3793
3794
3795 private static class lnMant {
3796
3797 private static final double[][] LN_MANT;
3798
3799 static {
3800 if (RECOMPUTE_TABLES_AT_RUNTIME) {
3801 LN_MANT = new double[FastMath.LN_MANT_LEN][];
3802
3803
3804 for (int i = 0; i < LN_MANT.length; i++) {
3805 final double d = Double.longBitsToDouble( (((long) i) << 42) | 0x3ff0000000000000L );
3806 LN_MANT[i] = FastMathCalc.slowLog(d);
3807 }
3808 } else {
3809 LN_MANT = FastMathLiteralArrays.loadLnMant();
3810 }
3811 }
3812 }
3813
3814
3815 private static class CodyWaite {
3816
3817 private final int finalK;
3818
3819 private final double finalRemA;
3820
3821 private final double finalRemB;
3822
3823
3824
3825
3826 CodyWaite(double xa) {
3827
3828
3829 int k = (int)(xa * 0.6366197723675814);
3830
3831
3832 double remA;
3833 double remB;
3834 while (true) {
3835 double a = -k * 1.570796251296997;
3836 remA = xa + a;
3837 remB = -(remA - xa - a);
3838
3839 a = -k * 7.549789948768648E-8;
3840 double b = remA;
3841 remA = a + b;
3842 remB += -(remA - b - a);
3843
3844 a = -k * 6.123233995736766E-17;
3845 b = remA;
3846 remA = a + b;
3847 remB += -(remA - b - a);
3848
3849 if (remA > 0) {
3850 break;
3851 }
3852
3853
3854
3855
3856 --k;
3857 }
3858
3859 this.finalK = k;
3860 this.finalRemA = remA;
3861 this.finalRemB = remB;
3862 }
3863
3864
3865
3866
3867 int getK() {
3868 return finalK;
3869 }
3870
3871
3872
3873 double getRemA() {
3874 return finalRemA;
3875 }
3876
3877
3878
3879 double getRemB() {
3880 return finalRemB;
3881 }
3882 }
3883 }