1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 package joeq.Support;
36
37 import java.util.Random;
38
39
40
41
42
43
44
45
46
47 public final class JMath
48 {
49 public static final double PI = Double.longBitsToDouble(0x400921fb54442d18L);
50 public static final double E = 2.7182818284590452354;
51
52 private static Random random;
53
54
55 /***
56 * Returns the absolute value of its argument.
57 * @param x The argument, an integer.
58 * @return Returns |x|.
59 */
60 public static strictfp int abs(int x)
61 {
62 return ((x < 0) ? -x : x);
63 }
64
65
66 /***
67 * Returns the absolute value of its argument.
68 * @param x The argument, a long.
69 * @return Returns |x|.
70 */
71 public static strictfp long abs(long x)
72 {
73 return ((x < 0L) ? -x : x);
74 }
75
76
77 /***
78 * Returns the absolute value of its argument.
79 * @param x The argument, a float.
80 * @return Returns |x|.
81 */
82 public static strictfp float abs(float x)
83 {
84 return ((x <= 0.0f) ? 0.0f-x : x);
85 }
86
87
88 /***
89 * Returns the absolute value of its argument.
90 * @param x The argument, a double.
91 * @return Returns |x|.
92 */
93 public static strictfp double abs(double x)
94 {
95 return ((x <= 0.0) ? 0.0-x : x);
96 }
97
98
99 /***
100 * Returns the smaller of its two arguments.
101 * @param x The first argument, an integer.
102 * @param y The second argument, an integer.
103 * @return Returns the smaller of x and y.
104 */
105 public static strictfp int min(int x, int y)
106 {
107 return ((x < y) ? x : y);
108 }
109
110
111 /***
112 * Returns the smaller of its two arguments.
113 * @param x The first argument, a long.
114 * @param y The second argument, a long.
115 * @return Returns the smaller of x and y.
116 */
117 public static strictfp long min(long x, long y)
118 {
119 return ((x < y) ? x : y);
120 }
121
122
123 /***
124 * Returns the smaller of its two arguments.
125 * @param x The first argument, a float.
126 * @param y The second argument, a float.
127 * @return Returns the smaller of x and y.
128 * This function considers -0.0f to
129 * be less than 0.0f.
130 */
131 public static strictfp float min(float x, float y)
132 {
133 if (Float.isNaN(x)) return x;
134 float ans = ((x <= y) ? x : y);
135 if (ans == 0.0f &&
136 Float.floatToIntBits(y) == 0x80000000)
137 ans = y;
138 return ans;
139 }
140
141
142 /***
143 * Returns the smaller of its two arguments.
144 * @param x The first argument, a double.
145 * @param y The second argument, a double.
146 * @return Returns the smaller of x and y.
147 * This function considers -0.0 to
148 * be less than 0.0.
149 */ public static strictfp double min(double x, double y)
150 {
151 if (Double.isNaN(x)) return x;
152 double ans = ((x <= y) ? x : y);
153 if (x == 0.0 && y == 0.0 &&
154 Double.doubleToLongBits(y) == 0x8000000000000000L)
155 ans = y;
156 return ans;
157 }
158
159
160 /***
161 * Returns the larger of its two arguments.
162 * @param x The first argument, an integer.
163 * @param y The second argument, an integer.
164 * @return Returns the larger of x and y.
165 */
166 public static strictfp int max(int x, int y)
167 {
168 return ((x > y) ? x : y);
169 }
170
171
172 /***
173 * Returns the larger of its two arguments.
174 * @param x The first argument, a long.
175 * @param y The second argument, a long.
176 * @return Returns the larger of x and y.
177 */
178 public static strictfp long max(long x, long y)
179 {
180 return ((x > y) ? x : y);
181 }
182
183
184 /***
185 * Returns the larger of its two arguments.
186 * @param x The first argument, a float.
187 * @param y The second argument, a float.
188 * @return Returns the larger of x and y.
189 * This function considers -0.0f to
190 * be less than 0.0f.
191 */
192 public static strictfp float max(float x, float y)
193 {
194 if (Float.isNaN(x)) return x;
195 float ans = ((x >= y) ? x : y);
196 if (ans == 0.0f && Float.floatToIntBits(x) == 0x80000000)
197 ans = y;
198 return ans;
199 }
200
201
202 /***
203 * Returns the larger of its two arguments.
204 * @param x The first argument, a double.
205 * @param y The second argument, a double.
206 * @return Returns the larger of x and y.
207 * This function considers -0.0 to
208 * be less than 0.0.
209 */
210 public static strictfp double max(double x, double y)
211 {
212 if (Double.isNaN(x)) return x;
213 double ans = ((x >= y) ? x : y);
214 if (x == 0.0 && y == 0.0 && Double.doubleToLongBits(x) == 0x8000000000000000L)
215 ans = y;
216 return ans;
217 }
218
219
220 /***
221 * Returns the integer closest to the arguments.
222 * @param x The argument, a float.
223 * @return Returns the integer closest to x.
224 */
225 public static strictfp int round(float x)
226 {
227 return (int)floor(x+0.5f);
228 }
229
230
231 /***
232 * Returns the long closest to the arguments.
233 * @param x The argument, a double.
234 * @return Returns the long closest to x.
235 */
236 public static strictfp long round(double x)
237 {
238 return (long)floor(x+0.5);
239 }
240
241
242 /***
243 * Returns the random number.
244 * @return Returns a random number from a uniform distribution.
245 */
246 public static synchronized strictfp double random()
247 {
248 if (random == null) random = new Random();
249 return random.nextDouble();
250 }
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272 private static final double huge = 1.0e+300;
273 private static final double tiny = 1.0e-300;
274
275
276 /***
277 * Returns the value of its argument rounded toward
278 * positive infinity to an integral value.
279 * @param x The argument, a double.
280 * @return Returns the smallest double, not less than x,
281 * that is an integral value.
282 */
283 public static double ceil(double x)
284 {
285 int exp;
286 long ix;
287
288 if (x == 0) return x;
289
290 ix = Double.doubleToLongBits(x);
291
292 exp = ((int)(ix>>52)&0x7ff) - 0x3ff;
293
294 if (exp < 0) {
295 if (x < 0.0)
296 return NEGATIVE_ZERO;
297 else if (x == 0.0)
298 return x;
299 else
300 return 1.0;
301 } else if (exp < 53) {
302 long mask = (0x000fffffffffffffL>>>exp);
303 if ((mask&ix) == 0) return x;
304 if (x > 0.0)
305 ix += 0x0010000000000000L>>exp;
306 ix = ix & (~mask);
307 } else if (exp == 1024) {
308 return x;
309 }
310
311 return Double.longBitsToDouble(ix);
312 }
313
314 /***
315 * Returns the value of its argument rounded toward
316 * negative infinity to an integral value.
317 * @param x The argument, a double.
318 * @return Returns the smallest double, not greater than x,
319 * that is an integral value.
320 */
321 public static double floor(double x)
322 {
323 int exp;
324 long ix;
325
326 if (x == 0) return x;
327
328 ix = Double.doubleToLongBits(x);
329
330 exp = ((int)(ix>>52)&0x7ff) - 0x3ff;
331
332 if (exp < 0) {
333 if (x < 0.0)
334 return -1.0;
335 else if (x == 0.0)
336 return x;
337 else
338 return 0.0;
339 } else if (exp < 53) {
340 long mask = (0x000fffffffffffffL>>>exp);
341 if ((mask&ix) == 0) return x;
342 if (x < 0.0)
343 ix += 0x0010000000000000L>>exp;
344 ix = ix & (~mask);
345 } else if (exp == 1024) {
346 return x;
347 }
348
349 return Double.longBitsToDouble(ix);
350 }
351
352
353
354 private static final double TWO52[] = {
355 Double.longBitsToDouble(0x4330000000000000L),
356 Double.longBitsToDouble(0xc330000000000000L)
357 };
358
359 private static final double NEGATIVE_ZERO = Double.longBitsToDouble(0x8000000000000000L);
360
361
362 /***
363 * Returns the value of its argument rounded toward
364 * the closest integral value.
365 * @param x The argument, a double.
366 * @return Returns the double closest to x
367 * that is an integral value.
368 */
369 public static double rint(double x)
370 {
371 int exp, sign;
372 long ix;
373 double w;
374
375 if (x == 0) return x;
376
377 ix = Double.doubleToLongBits(x);
378 sign = (int)((ix>>63)&1);
379 exp = ((int)(ix>>52)&0x7ff) - 0x3ff;
380
381 if (exp < 0) {
382 if (x < -0.5)
383 return -1.0;
384 else if (x > 0.5)
385 return 1.0;
386 else if (sign == 0)
387 return 0.0;
388 else
389 return NEGATIVE_ZERO;
390 } else if (exp < 53) {
391 long mask = (0x000fffffffffffffL>>>exp);
392 if ((mask&ix) == 0) return x;
393 } else if (exp == 1024) {
394 return x;
395 }
396
397 x = Double.longBitsToDouble(ix);
398 w = TWO52[sign] + x;
399 return w - TWO52[sign];
400 }
401
402
403 /***
404 * Returns x REM p = x - [x/p]*p as if in infinite
405 * precise arithmetic, where [x/p] is the (infinite bit)
406 * integer nearest x/p (in half way case choose the even one).
407 * @param x The dividend.
408 * @param p The divisor.
409 * @return The remainder computed according to the IEEE 754 standard.
410 */
411 public static double IEEEremainder(double x, double p)
412 {
413 int hx,hp;
414 int sx,lx,lp;
415 double p_half;
416
417 hx = __HI(x);
418 lx = __LO(x);
419 hp = __HI(p);
420 lp = __LO(p);
421 sx = hx&0x80000000;
422 hp &= 0x7fffffff;
423 hx &= 0x7fffffff;
424
425
426 if ((hp|lp) == 0) return (x*p)/(x*p);
427
428 if ((hx >= 0x7ff00000) ||
429 ((hp >= 0x7ff00000)&&
430 (((hp-0x7ff00000)|lp)!=0)))
431 return (x*p)/(x*p);
432
433 if (hp <= 0x7fdfffff) x = x%(p+p);
434
435 if (((hx-hp)|(lx-lp)) == 0) return zero*x;
436
437 x = abs(x);
438 p = abs(p);
439 if (hp < 0x00200000) {
440 if (x+x > p) {
441 x -= p;
442 if (x+x >= p) x -= p;
443 }
444 } else {
445 p_half = 0.5*p;
446 if (x > p_half) {
447 x -= p;
448 if (x >= p_half)
449 x -= p;
450 }
451 }
452 lx = __HI(x);
453 lx ^= sx;
454 return setHI(x, lx);
455 }
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527 /***
528 * Returns the square root of its argument.
529 * @param x The argument, a double.
530 * @return Returns the square root of x.
531 */
532 public static double sqrt(double x)
533 {
534 long ix = Double.doubleToLongBits(x);
535
536
537 if ((ix&0x7ff0000000000000L)==0x7ff0000000000000L) {
538
539 return x*x + x;
540 }
541
542
543 if (x < 0.0) {
544 return Double.NaN;
545 } else if (x == 0.0) {
546 return x;
547 }
548
549
550 long m = (ix>>52);
551 ix &= 0x000fffffffffffffL;
552
553
554 if (m != 0) ix |= 0x0010000000000000L;
555
556 m -= 1023L;
557 if ((m&1) != 0) {
558 ix += ix;
559 }
560 m >>= 1;
561 m += 1023L;
562
563
564 ix += ix;
565 long q = 0L;
566 long s = 0L;
567 long r = 0x0020000000000000L;
568
569 while (r != 0) {
570 long t = s + r;
571 if (t <= ix) {
572 s = t + r;
573 ix -= t;
574 q += r;
575 }
576 ix += ix;
577 r >>= 1;
578 }
579
580
581 if (ix != 0) q += (q&1L);
582
583
584 ix = (m << 52) | (0x000fffffffffffffL&(q>>1));
585 return Double.longBitsToDouble(ix);
586 }
587
588
589
590 private static final double halF[] = {0.5, -0.5};
591 private static final double twom1000 =
592 Double.longBitsToDouble(0x0170000000000000L);
593
594 private static final double o_threshold = Double.longBitsToDouble(0x40862e42fefa39efL);
595 private static final double u_threshold = Double.longBitsToDouble(0xc0874910d52d3051L);
596 private static final double ln2HI[] = {
597 Double.longBitsToDouble(0x3fe62e42fee00000L),
598 Double.longBitsToDouble(0xbfe62e42fee00000L)};
599 private static final double ln2LO[] = {
600 Double.longBitsToDouble(0x3dea39ef35793c76L),
601 Double.longBitsToDouble(0xbdea39ef35793c76L)};
602 private static final double invln2 = Double.longBitsToDouble(0x3ff71547652b82feL);
603 private static final double P1 = Double.longBitsToDouble(0x3fc555555555553eL);
604 private static final double P2 = Double.longBitsToDouble(0xbf66c16c16bebd93L);
605 private static final double P3 = Double.longBitsToDouble(0x3f11566aaf25de2cL);
606 private static final double P4 = Double.longBitsToDouble(0xbebbbd41c5d26bf1L);
607 private static final double P5 = Double.longBitsToDouble(0x3e66376972bea4d0L);
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666 /***
667 * Returns the exponential of its argument.
668 * @param x The argument, a double.
669 * @return Returns e to the power x.
670 */
671 public static double exp(double x)
672 {
673 double y, hi=0, lo=0, c, t;
674 int k=0, xsb;
675 int hx;
676
677 hx = __HI(x);
678 xsb = (hx>>>31)&1;
679 hx &= 0x7fffffff;
680
681
682 if (hx >= 0x40862E42) {
683 if (hx>=0x7ff00000) {
684 if (((hx&0xfffff)|__LO(x)) != 0) {
685 return x+x;
686 } else {
687 return ((xsb==0) ? x : 0.0);
688 }
689 }
690 if (x > o_threshold)
691 return huge*huge;
692 if (x < u_threshold)
693 return twom1000*twom1000;
694 }
695
696
697 if (hx > 0x3fd62e42) {
698 if(hx < 0x3FF0A2B2) {
699 hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb;
700 } else {
701 k = (int)(invln2*x+halF[xsb]);
702 t = k;
703 hi = x - t*ln2HI[0];
704 lo = t*ln2LO[0];
705 }
706 x = hi - lo;
707 } else if(hx < 0x3e300000) {
708 if (huge+x > one)
709 return one+x;
710 } else {
711 k = 0;
712 }
713
714
715 t = x*x;
716 c = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
717 if (k==0) {
718 return one-((x*c)/(c-2.0)-x);
719 } else {
720 y = one-((lo-(x*c)/(2.0-c))-hi);
721 }
722
723 long iy = Double.doubleToLongBits(y);
724 if (k >= -1021) {
725 iy += ((long)k<<52);
726 } else {
727 iy += ((k+1000L)<<52);
728 }
729 return Double.longBitsToDouble(iy);
730 }
731
732 private static final double ln2_hi = Double.longBitsToDouble(0x3fe62e42fee00000L);
733 private static final double ln2_lo = Double.longBitsToDouble(0x3dea39ef35793c76L);
734 private static final double Lg1 = Double.longBitsToDouble(0x3fe5555555555593L);
735 private static final double Lg2 = Double.longBitsToDouble(0x3fd999999997fa04L);
736 private static final double Lg3 = Double.longBitsToDouble(0x3fd2492494229359L);
737 private static final double Lg4 = Double.longBitsToDouble(0x3fcc71c51d8e78afL);
738 private static final double Lg5 = Double.longBitsToDouble(0x3fc7466496cb03deL);
739 private static final double Lg6 = Double.longBitsToDouble(0x3fc39a09d078c69fL);
740 private static final double Lg7 = Double.longBitsToDouble(0x3fc2f112df3e5244L);
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787 /***
788 * Returns the natural logarithm of its argument.
789 * @param x The argument, a double.
790 * @return Returns the natural (base e) logarithm of x.
791 */
792 public static double log(double x)
793 {
794 double hfsq,f,s,z,R,w,t1,t2,dk;
795 int k,hx,i,j;
796 int lx;
797
798 hx = __HI(x);
799 lx = __LO(x);
800
801 k=0;
802 if (hx < 0x00100000) {
803 if (((hx&0x7fffffff)|lx)==0)
804 return -two54/zero;
805 if (hx<0)
806 return (x-x)/zero;
807 k -= 54;
808 x *= two54;
809 hx = __HI(x);
810 }
811 if (hx >= 0x7ff00000)
812 return x+x;
813 k += (hx>>20)-1023;
814 hx &= 0x000fffff;
815 i = (hx+0x95f64)&0x100000;
816 x = setHI(x, hx|(i^0x3ff00000));
817 k += (i>>20);
818 f = x-1.0;
819 if ((0x000fffff&(2+hx))<3) {
820 if (f == zero) {
821 if (k == 0) {
822 return zero;
823 } else {
824 dk=(double)k;
825 }
826 return dk*ln2_hi+dk*ln2_lo;
827 }
828 R = f*f*(0.5-0.33333333333333333*f);
829 if (k==0) {
830 return f-R;
831 } else {
832 dk = (double)k;
833 return dk*ln2_hi-((R-dk*ln2_lo)-f);
834 }
835 }
836 s = f/(2.0+f);
837 dk = (double)k;
838 z = s*s;
839 i = hx-0x6147a;
840 w = z*z;
841 j = 0x6b851-hx;
842 t1= w*(Lg2+w*(Lg4+w*Lg6));
843 t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
844 i |= j;
845 R = t2+t1;
846 if (i > 0) {
847 hfsq = 0.5*f*f;
848 if (k == 0) {
849 return f-(hfsq-s*(hfsq+R));
850 } else {
851 return dk*ln2_hi-((hfsq-(s*(hfsq+R)+dk*ln2_lo))-f);
852 }
853 } else {
854 if (k==0) {
855 return f-s*(f-R);
856 } else {
857 return dk*ln2_hi-((s*(f-R)-dk*ln2_lo)-f);
858 }
859 }
860 }
861
862
863 /***
864 * Returns the sine of its argument.
865 * @param x The argument, a double, assumed to be in radians.
866 * @return Returns the sine of x.
867 */
868 public static double sin(double x)
869 {
870 double y[] = new double[2];
871 double z=0.0;
872 int n;
873 int ix = __HI(x);
874
875 ix &= 0x7fffffff;
876
877 if (ix <= 0x3fe921fb) {
878 return __kernel_sin(x,z,0);
879 } else if (ix >= 0x7ff00000) {
880
881 return x-x;
882 } else {
883
884 n = __ieee754_rem_pio2(x, y);
885 switch(n&3) {
886 case 0:
887 return __kernel_sin(y[0],y[1], 1);
888 case 1:
889 return __kernel_cos(y[0],y[1]);
890 case 2:
891 return -__kernel_sin(y[0],y[1], 1);
892 default:
893 return -__kernel_cos(y[0],y[1]);
894 }
895 }
896 }
897
898
899 private static double S1 = -1.66666666666666324348e-01;
900 private static double S2 = 8.33333333332248946124e-03;
901 private static double S3 = -1.98412698298579493134e-04;
902 private static double S4 = 2.75573137070700676789e-06;
903 private static double S5 = -2.50507602534068634195e-08;
904 private static double S6 = 1.58969099521155010221e-10;
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932 static double __kernel_sin(double x, double y, int iy)
933 {
934 double z,r,v;
935 int ix;
936 ix = __HI(x)&0x7fffffff;
937 if (ix<0x3e400000) {
938 if((int)x ==0 )
939 return x;
940 }
941 z = x*x;
942 v = z*x;
943 r = S2+z*(S3+z*(S4+z*(S5+z*S6)));
944 if (iy == 0)
945 return x+v*(S1+z*r);
946 else
947 return x-((z*(half*y-v*r)-y)-v*S1);
948 }
949
950 /***
951 * Returns the cosine of its argument.
952 * @param x The argument, a double, assumed to be in radians.
953 * @return Returns the cosine of x.
954 */
955 public static double cos(double x)
956 {
957 double z = 0.0;
958 double y[] = new double[2];
959 int n, ix;
960
961
962 ix = __HI(x);
963
964
965 ix &= 0x7fffffff;
966 if (ix <= 0x3fe921fb) {
967 return __kernel_cos(x,z);
968
969
970 } else if (ix >= 0x7ff00000) {
971 return x-x;
972
973
974 } else {
975 n = __ieee754_rem_pio2(x,y);
976 switch(n&3) {
977 case 0: return __kernel_cos(y[0],y[1]);
978 case 1: return -__kernel_sin(y[0],y[1],1);
979 case 2: return -__kernel_cos(y[0],y[1]);
980 default:
981 return __kernel_sin(y[0],y[1],1);
982 }
983 }
984 }
985
986 private static final double one = Double.longBitsToDouble(0x3ff0000000000000L);
987 private static final double C1 = Double.longBitsToDouble(0x3fa555555555554cL);
988 private static final double C2 = Double.longBitsToDouble(0xbf56c16c16c15177L);
989 private static final double C3 = Double.longBitsToDouble(0x3efa01a019cb1590L);
990 private static final double C4 = Double.longBitsToDouble(0xbe927e4f809c52adL);
991 private static final double C5 = Double.longBitsToDouble(0x3e21ee9ebdb4b1c4L);
992 private static final double C6 = Double.longBitsToDouble(0xbda8fae9be8838d4L);
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027 private static double __kernel_cos(double x, double y)
1028 {
1029 double a, hz, z, r, qx=zero;
1030 int ix;
1031 ix = __HI(x)&0x7fffffff;
1032 if (ix < 0x3e400000) {
1033
1034 if (((int)x) == 0) return one;
1035 }
1036 z = x*x;
1037 r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6)))));
1038 if (ix < 0x3FD33333) {
1039
1040 return one - (0.5*z - (z*r - x*y));
1041 } else {
1042 if(ix > 0x3fe90000) {
1043 qx = 0.28125;
1044 } else {
1045 qx = set(ix-0x00200000, 0);
1046 }
1047 hz = 0.5*z-qx;
1048 a = one-qx;
1049 return a - (hz - (z*r-x*y));
1050 }
1051 }
1052
1053 /***
1054 * Returns the tangent of its argument.
1055 * @param x The argument, a double, assumed to be in radians.
1056 * @return Returns the tangent of x.
1057 */
1058 public static double tan(double x)
1059 {
1060 double z = zero;
1061
1062 int n;
1063 int ix = __HI(x);
1064
1065
1066 ix &= 0x7fffffff;
1067 if (ix <= 0x3fe921fb) {
1068 return __kernel_tan(x, z, 1);
1069 } else if (ix >= 0x7ff00000) {
1070
1071 return x-x;
1072 } else {
1073
1074 double y[] = new double[2];
1075 n = __ieee754_rem_pio2(x, y);
1076
1077 return __kernel_tan(y[0], y[1], 1-((n&1)<<1));
1078 }
1079 }
1080
1081
1082 private static final double pio4 = Double.longBitsToDouble(0x3fe921fb54442d18L);
1083 private static final double pio4lo= Double.longBitsToDouble(0x3c81a62633145c07L);
1084 private static final double T[] = {
1085 Double.longBitsToDouble(0x3fd5555555555563L),
1086 Double.longBitsToDouble(0x3fc111111110fe7aL),
1087 Double.longBitsToDouble(0x3faba1ba1bb341feL),
1088 Double.longBitsToDouble(0x3f9664f48406d637L),
1089 Double.longBitsToDouble(0x3f8226e3e96e8493L),
1090 Double.longBitsToDouble(0x3f6d6d22c9560328L),
1091 Double.longBitsToDouble(0x3f57dbc8fee08315L),
1092 Double.longBitsToDouble(0x3f4344d8f2f26501L),
1093 Double.longBitsToDouble(0x3f3026f71a8d1068L),
1094 Double.longBitsToDouble(0x3f147e88a03792a6L),
1095 Double.longBitsToDouble(0x3f12b80f32f0a7e9L),
1096 Double.longBitsToDouble(0xbef375cbdb605373L),
1097 Double.longBitsToDouble(0x3efb2a7074bf7ad4L)
1098 };
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130 private static double __kernel_tan(double x, double y, int iy)
1131 {
1132 double z, r, v, w, s;
1133 int ix,hx;
1134
1135 hx = __HI(x);
1136 ix = hx&0x7fffffff;
1137 if (ix<0x3e300000) {
1138 if ((int)x==0) {
1139 if(((ix|__LO(x))|(iy+1))==0)
1140 return one/abs(x);
1141 else return (iy==1)? x: -one/x;
1142 }
1143 }
1144 if (ix>=0x3FE59428) {
1145
1146 if (hx<0) {
1147 x = -x;
1148 y = -y;
1149 }
1150 z = pio4-x;
1151 w = pio4lo-y;
1152 x = z+w;
1153 y = 0.0;
1154 }
1155 z = x*x;
1156 w = z*z;
1157
1158
1159
1160
1161
1162
1163 r = T[1]+w*(T[3]+w*(T[5]+w*(T[7]+w*(T[9]+w*T[11]))));
1164 v = z*(T[2]+w*(T[4]+w*(T[6]+w*(T[8]+w*(T[10]+w*T[12])))));
1165 s = z*x;
1166 r = y + z*(s*(r+v)+y);
1167 r += T[0]*s;
1168 w = x+r;
1169 if (ix >= 0x3FE59428) {
1170 v = (double)iy;
1171 return (double)(1-((hx>>30)&2))*(v-2.0*(x-(w*w/(w+v)-r)));
1172 }
1173 if (iy==1) {
1174 return w;
1175 } else {
1176
1177
1178 double a,t;
1179 z = w;
1180 z = setLO(z, 0);
1181 v = r-(z - x);
1182
1183 t = a = -1.0/w;
1184
1185 t = setLO(t, 0);
1186 s = 1.0+t*z;
1187 return t+a*(s+t*v);
1188 }
1189 }
1190
1191
1192 private static final double pio2_hi = Double.longBitsToDouble(0x3FF921FB54442D18L);
1193 private static final double pio2_lo = Double.longBitsToDouble(0x3C91A62633145C07L);
1194 private static final double pio4_hi = Double.longBitsToDouble(0x3FE921FB54442D18L);
1195
1196 private static final double pS0 = Double.longBitsToDouble(0x3fc5555555555555L);
1197 private static final double pS1 = Double.longBitsToDouble(0xbfd4d61203eb6f7dL);
1198 private static final double pS2 = Double.longBitsToDouble(0x3fc9c1550e884455L);
1199 private static final double pS3 = Double.longBitsToDouble(0xbfa48228b5688f3bL);
1200 private static final double pS4 = Double.longBitsToDouble(0x3f49efe07501b288L);
1201 private static final double pS5 = Double.longBitsToDouble(0x3f023de10dfdf709L);
1202 private static final double qS1 = Double.longBitsToDouble(0xc0033a271c8a2d4bL);
1203 private static final double qS2 = Double.longBitsToDouble(0x40002ae59c598ac8L);
1204 private static final double qS3 = Double.longBitsToDouble(0xbfe6066c1b8d0159L);
1205 private static final double qS4 = Double.longBitsToDouble(0x3fb3b8c5b12e9282L);
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238 /***
1239 * Returns the inverse (arc) sine of its argument.
1240 * @param x The argument, a double.
1241 * @return Returns the angle, in radians, whose sine is x.
1242 * It is in the range [-pi/2,pi/2].
1243 */
1244 public static double asin(double x)
1245 {
1246 double t=zero,w,p,q,c,r,s;
1247 int hx,ix;
1248 hx = __HI(x);
1249
1250 ix = hx&0x7fffffff;
1251 if (ix>= 0x3ff00000) {
1252 if(((ix-0x3ff00000)|__LO(x))==0)
1253
1254 return x*pio2_hi+x*pio2_lo;
1255 return (x-x)/(x-x);
1256 } else if (ix<0x3fe00000) {
1257 if (ix<0x3e400000) {
1258 if(huge+x>one) return x;
1259 } else
1260 t = x*x;
1261 p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5)))));
1262 q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4)));
1263 w = p/q;
1264 return x+x*w;
1265 }
1266
1267 w = one - abs(x);
1268 t = w*0.5;
1269 p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5)))));
1270 q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4)));
1271 s = sqrt(t);
1272 if(ix>=0x3FEF3333) {
1273 w = p/q;
1274 t = pio2_hi-(2.0*(s+s*w)-pio2_lo);
1275 } else {
1276 w = s;
1277 w = setLO(w, 0);
1278 c = (t-w*w)/(s+w);
1279 r = p/q;
1280 p = 2.0*s*r-(pio2_lo-2.0*c);
1281 q = pio4_hi-2.0*w;
1282 t = pio4_hi-(p-q);
1283 }
1284 return ((hx>0) ? t : -t);
1285 }
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311 /***
1312 * Returns the inverse (arc) cosine of its argument.
1313 * @param x The argument, a double.
1314 * @return Returns the angle, in radians, whose cosine is x.
1315 * It is in the range [0,pi].
1316 */
1317 public static double acos(double x)
1318 {
1319 double z,p,q,r,w,s,c,df;
1320 int hx,ix;
1321 hx = __HI(x);
1322 ix = hx&0x7fffffff;
1323 if (ix >= 0x3ff00000) {
1324 if (((ix-0x3ff00000)|__LO(x)) == 0) {
1325 if (hx>0)
1326 return 0.0;
1327 else
1328 return PI+2.0*pio2_lo;
1329 }
1330 return (x-x)/(x-x);
1331 }
1332 if (ix < 0x3fe00000) {
1333 if (ix <= 0x3c600000)
1334 return pio2_hi+pio2_lo;
1335 z = x*x;
1336 p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
1337 q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
1338 r = p/q;
1339 return pio2_hi - (x - (pio2_lo-x*r));
1340 } else if (hx<0) {
1341 z = (one+x)*0.5;
1342 p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
1343 q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
1344 s = sqrt(z);
1345 r = p/q;
1346 w = r*s-pio2_lo;
1347 return PI - 2.0*(s+w);
1348 } else {
1349 z = (one-x)*0.5;
1350 s = sqrt(z);
1351 df = s;
1352 df = setLO(df, 0);
1353 c = (z-df*df)/(s+df);
1354 p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
1355 q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
1356 r = p/q;
1357 w = r*s+c;
1358 return 2.0*(df+w);
1359 }
1360 }
1361
1362
1363 private static final double atanhi[] = {
1364 Double.longBitsToDouble(0x3fddac670561bb4fL),
1365 Double.longBitsToDouble(0x3fe921fb54442d18L),
1366 Double.longBitsToDouble(0x3fef730bd281f69bL),
1367 Double.longBitsToDouble(0x3ff921fb54442d18L)
1368 };
1369
1370 private static final double atanlo[] = {
1371 Double.longBitsToDouble(0x3c7a2b7f222f65e2L),
1372 Double.longBitsToDouble(0x3c81a62633145c07L),
1373 Double.longBitsToDouble(0x3c7007887af0cbbdL),
1374 Double.longBitsToDouble(0x3c91a62633145c07L)
1375 };
1376
1377 private static final double aT[] = {
1378 Double.longBitsToDouble(0x3fd555555555550dL),
1379 Double.longBitsToDouble(0xbfc999999998ebc4L),
1380 Double.longBitsToDouble(0x3fc24924920083ffL),
1381 Double.longBitsToDouble(0xbfbc71c6fe231671L),
1382 Double.longBitsToDouble(0x3fb745cdc54c206eL),
1383 Double.longBitsToDouble(0xbfb3b0f2af749a6dL),
1384 Double.longBitsToDouble(0x3fb10d66a0d03d51L),
1385 Double.longBitsToDouble(0xbfadde2d52defd9aL),
1386 Double.longBitsToDouble(0x3fa97b4b24760debL),
1387 Double.longBitsToDouble(0xbfa2b4442c6a6c2fL),
1388 Double.longBitsToDouble(0x3f90ad3ae322da11L)
1389 };
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411 /***
1412 * Returns the inverse (arc) tangent of its argument.
1413 * @param x The argument, a double.
1414 * @return Returns the angle, in radians, whose tangent is x.
1415 * It is in the range [-pi/2,pi/2].
1416 */
1417 public static double atan(double x)
1418 {
1419 double w,s1,s2,z;
1420 int ix,hx,id;
1421
1422 hx = __HI(x);
1423 ix = hx&0x7fffffff;
1424 if(ix>=0x44100000) {
1425 if(ix>0x7ff00000||
1426 (ix==0x7ff00000&&(__LO(x)!=0)))
1427 return x+x;
1428 if(hx>0) return atanhi[3]+atanlo[3];
1429 else return -atanhi[3]-atanlo[3];
1430 } if (ix < 0x3fdc0000) {
1431 if (ix < 0x3e200000) {
1432 if(huge+x>one) return x;
1433 }
1434 id = -1;
1435 } else {
1436 x = abs(x);
1437 if (ix < 0x3ff30000) {
1438 if (ix < 0x3fe60000) {
1439 id = 0; x = (2.0*x-one)/(2.0+x);
1440 } else {
1441 id = 1; x = (x-one)/(x+one);
1442 }
1443 } else {
1444 if (ix < 0x40038000) {
1445 id = 2; x = (x-1.5)/(one+1.5*x);
1446 } else {
1447 id = 3; x = -1.0/x;
1448 }
1449 }
1450 }
1451
1452 z = x*x;
1453 w = z*z;
1454
1455 s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10])))));
1456 s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9]))));
1457 if (id<0) return x - x*(s1+s2);
1458 else {
1459 z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
1460 return (hx<0)? -z:z;
1461 }
1462 }
1463
1464
1465 private static final double pi_o_4 = Double.longBitsToDouble(0x3fe921fb54442d18L);
1466 private static final double pi_o_2 = Double.longBitsToDouble(0x3ff921fb54442d18L);
1467 private static final double pi_lo = Double.longBitsToDouble(0x3ca1a62633145c07L);
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496 /***
1497 * Returns angle corresponding to a Cartesian point.
1498 * @param x The first argument, a double.
1499 * @param y The second argument, a double.
1500 * @return Returns the angle, in radians, the the line
1501 * from (0,0) to (x,y) makes with the x-axis.
1502 * It is in the range [-pi,pi].
1503 */
1504 public static double atan2(double y, double x)
1505 {
1506 double z;
1507 int k,m,hx,hy,ix,iy;
1508 int lx,ly;
1509
1510 hx = __HI(x);
1511 ix = hx&0x7fffffff;
1512 lx = __LO(x);
1513 hy = __HI(y);
1514 iy = hy&0x7fffffff;
1515 ly = __LO(y);
1516 if (((ix|((lx|-lx)>>>31))>0x7ff00000)||
1517 ((iy|((ly|-ly)>>>31))>0x7ff00000))
1518 return x+y;
1519 if ((hx-0x3ff00000|lx) == 0)
1520 return atan(y);
1521 m = ((hy>>31)&1)|((hx>>30)&2);
1522
1523
1524 if((iy|ly)==0) {
1525 switch(m) {
1526 case 0:
1527 case 1: return y;
1528 case 2: return PI+tiny;
1529 case 3: return -PI-tiny;
1530 }
1531 }
1532
1533 if((ix|lx) == 0)
1534 return ((hy<0) ? -pi_o_2-tiny: pi_o_2+tiny);
1535
1536
1537 if (ix == 0x7ff00000) {
1538 if (iy == 0x7ff00000) {
1539 switch(m) {
1540 case 0: return pi_o_4+tiny;
1541 case 1: return -pi_o_4-tiny;
1542 case 2: return 3.0*pi_o_4+tiny;
1543 case 3: return -3.0*pi_o_4-tiny;
1544 }
1545 } else {
1546 switch(m) {
1547 case 0: return zero ;
1548 case 1: return -zero ;
1549 case 2: return PI+tiny ;
1550 case 3: return -PI-tiny ;
1551 }
1552 }
1553 }
1554
1555 if(iy==0x7ff00000) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny;
1556
1557
1558 k = (iy-ix)>>20;
1559 if (k > 60) {
1560
1561 z=pi_o_2+0.5*pi_lo;
1562 } else if (hx<0&&k<-60) {
1563
1564 z=0.0;
1565 } else {
1566
1567 z=atan(abs(y/x));
1568 }
1569
1570 switch (m) {
1571 case 0:
1572 return z ;
1573 case 1:
1574 return setHI(z, __HI(z) ^ 0x80000000);
1575 case 2:
1576 return PI-(z-pi_lo);
1577 default:
1578 return (z-pi_lo)-PI;
1579 }
1580 }
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617 private static final int two_over_pi[] = {
1618 0xa2f983, 0x6e4e44, 0x1529fc, 0x2757d1, 0xf534dd, 0xc0db62,
1619 0x95993c, 0x439041, 0xfe5163, 0xabdebb, 0xc561b7, 0x246e3a,
1620 0x424dd2, 0xe00649, 0x2eea09, 0xd1921c, 0xfe1deb, 0x1cb129,
1621 0xa73ee8, 0x8235f5, 0x2ebb44, 0x84e99c, 0x7026b4, 0x5f7e41,
1622 0x3991d6, 0x398353, 0x39f49c, 0x845f8b, 0xbdf928, 0x3b1ff8,
1623 0x97ffde, 0x05980f, 0xef2f11, 0x8b5a0a, 0x6d1f6d, 0x367ecf,
1624 0x27cb09, 0xb74f46, 0x3f669e, 0x5fea2d, 0x7527ba, 0xc7ebe5,
1625 0xf17b3d, 0x0739f7, 0x8a5292, 0xea6bfb, 0x5fb11f, 0x8d5d08,
1626 0x560330, 0x46fc7b, 0x6babf0, 0xcfbc20, 0x9af436, 0x1da9e3,
1627 0x91615e, 0xe61b08, 0x659985, 0x5f14a0, 0x68408d, 0xffd880,
1628 0x4d7327, 0x310606, 0x1556ca, 0x73a8c9, 0x60e27b, 0xc08c6b};
1629
1630 private static final int npio2_hw[] = {
1631 0x3ff921fb, 0x400921fb, 0x4012d97c, 0x401921fb, 0x401f6a7a, 0x4022d97c,
1632 0x4025fdbb, 0x402921fb, 0x402c463a, 0x402f6a7a, 0x4031475c, 0x4032d97c,
1633 0x40346b9c, 0x4035fdbb, 0x40378fdb, 0x403921fb, 0x403ab41b, 0x403c463a,
1634 0x403dd85a, 0x403f6a7a, 0x40407e4c, 0x4041475c, 0x4042106c, 0x4042d97c,
1635 0x4043a28c, 0x40446b9c, 0x404534ac, 0x4045fdbb, 0x4046c6cb, 0x40478fdb,
1636 0x404858eb, 0x404921fb};
1637
1638 private static final double zero = 0.00000000000000000000e+00;
1639 private static final double half = Double.longBitsToDouble(0x3fe0000000000000L);
1640 private static final double two24 = Double.longBitsToDouble(0x4170000000000000L);
1641 private static final double invpio2 = Double.longBitsToDouble(0x3fe45f306dc9c883L);
1642 private static final double pio2_1 = Double.longBitsToDouble(0x3ff921fb54400000L);
1643 private static final double pio2_1t = Double.longBitsToDouble(0x3dd0b4611a626331L);
1644 private static final double pio2_2 = Double.longBitsToDouble(0x3dd0b4611a600000L);
1645 private static final double pio2_2t = Double.longBitsToDouble(0x3ba3198a2e037073L);
1646 private static final double pio2_3 = Double.longBitsToDouble(0x3ba3198a2e000000L);
1647 private static final double pio2_3t = Double.longBitsToDouble(0x397b839a252049c1L);
1648
1649
1650
1651
1652
1653 private static int __ieee754_rem_pio2(double x, double y[])
1654 {
1655 double z = zero, w, t, r, fn;
1656 double tx[] = new double[3];
1657 int i, j, nx, n, ix, hx;
1658
1659 hx = __HI(x);
1660 ix = hx&0x7fffffff;
1661 if (ix <= 0x3fe921fb) {
1662
1663 y[0] = x;
1664 y[1] = 0;
1665 return 0;
1666 }
1667
1668 if (ix < 0x4002d97c) {
1669
1670 if (hx > 0) {
1671 z = x - pio2_1;
1672 if (ix != 0x3ff921fb) {
1673 y[0] = z - pio2_1t;
1674 y[1] = (z-y[0])-pio2_1t;
1675 } else {
1676 z -= pio2_2;
1677 y[0] = z - pio2_2t;
1678 y[1] = (z-y[0])-pio2_2t;
1679 }
1680 return 1;
1681 } else {
1682 z = x + pio2_1;
1683 if (ix != 0x3ff921fb) {
1684 y[0] = z + pio2_1t;
1685 y[1] = (z-y[0])+pio2_1t;
1686 } else {
1687 z += pio2_2;
1688 y[0] = z + pio2_2t;
1689 y[1] = (z-y[0])+pio2_2t;
1690 }
1691 return -1;
1692 }
1693 }
1694
1695 if (ix <= 0x413921fb) {
1696 t = abs(x);
1697 n = (int) (t*invpio2+half);
1698 fn = (double)n;
1699 r = t-fn*pio2_1;
1700 w = fn*pio2_1t;
1701 if (n<32&&ix!=npio2_hw[n-1]) {
1702 y[0] = r-w;
1703 } else {
1704 j = ix>>20;
1705 y[0] = r-w;
1706 i = j-(((__HI(y[0]))>>20)&0x7ff);
1707 if (i>16) {
1708 t = r;
1709 w = fn*pio2_2;
1710 r = t-w;
1711 w = fn*pio2_2t-((t-r)-w);
1712 y[0] = r-w;
1713 i = j-(((__HI(y[0]))>>20)&0x7ff);
1714 if (i>49) {
1715 t = r;
1716 w = fn*pio2_3;
1717 r = t-w;
1718 w = fn*pio2_3t-((t-r)-w);
1719 y[0] = r-w;
1720 }
1721 }
1722 }
1723 y[1] = (r-y[0])-w;
1724 if (hx<0) {
1725 y[0] = -y[0];
1726 y[1] = -y[1];
1727 return -n;
1728 } else {
1729 return n;
1730 }
1731 }
1732
1733
1734
1735
1736 if (ix >= 0x7ff00000) {
1737
1738 y[0] = y[1] = x-x;
1739 return 0;
1740 }
1741
1742
1743 long lx = Double.doubleToLongBits(x);
1744 long exp = (0x7ff0000000000000L&lx) >> 52;
1745 exp -= 1046;
1746 lx -= (exp<<52);
1747 lx &= 0x7fffffffffffffffL;
1748 z = Double.longBitsToDouble(lx);
1749 for (i = 0; i < 2; i++) {
1750 tx[i] = (double)((int)(z));
1751 z = (z-tx[i])*two24;
1752 }
1753 tx[2] = z;
1754 nx = 3;
1755 while (tx[nx-1] == zero) nx--;
1756 n = __kernel_rem_pio2(tx, y, (int)exp, nx);
1757
1758
1759
1760
1761 if (hx < 0) {
1762 y[0] = -y[0];
1763 y[1] = -y[1];
1764 return -n;
1765 }
1766 return n;
1767 }
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
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
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885 private static final double PIo2[] = {
1886 Double.longBitsToDouble(0x3ff921fb40000000L),
1887 Double.longBitsToDouble(0x3e74442d00000000L),
1888 Double.longBitsToDouble(0x3cf8469880000000L),
1889 Double.longBitsToDouble(0x3b78cc5160000000L),
1890 Double.longBitsToDouble(0x39f01b8380000000L),
1891 Double.longBitsToDouble(0x387a252040000000L),
1892 Double.longBitsToDouble(0x36e3822280000000L),
1893 Double.longBitsToDouble(0x3569f31d00000000L)
1894 };
1895
1896 private static final double twon24 = Double.longBitsToDouble(0x3E70000000000000L);
1897
1898 private static int __kernel_rem_pio2(double x[], double y[], int e0, int nx)
1899 {
1900 int jz,jx,jv,jp,jk,carry,n,i,j,k,m,q0,ih;
1901 double z,fw;
1902 double f[] = new double[20];
1903 double q[] = new double[20];
1904 double fq[] = new double[20];
1905 int iq[] = new int[20];
1906
1907
1908 jk = 4;
1909 jp = jk;
1910
1911
1912 jx = nx - 1;
1913 jv = (e0-3)/24;
1914 if (jv < 0) jv = 0;
1915 q0 = e0-24*(jv+1);
1916
1917
1918 j = jv - jx;
1919 m = jx + jk;
1920 for (i = 0; i <= m; i++ ,j++)
1921 f[i] = ((j<0) ? zero : (double)two_over_pi[j]);
1922
1923
1924 for (i = 0; i <= jk; i++) {
1925 for (j = 0, fw = 0.0; j <= jx; j++)
1926 fw += x[j]*f[jx+i-j];
1927 q[i] = fw;
1928 }
1929
1930 jz = jk;
1931
1932 while (true) {
1933
1934 for (i = 0, j = jz, z = q[jz]; j > 0; i++, j--) {
1935 fw = (double)((int)(twon24* z));
1936 iq[i] = (int)(z-two24*fw);
1937 z = q[j-1]+fw;
1938 }
1939
1940
1941 z = scalbn(z, q0);
1942 z -= 8.0*floor(z*0.125);
1943 n = (int) z;
1944 z -= (double)n;
1945 ih = 0;
1946 if (q0 > 0) {
1947 i = (iq[jz-1]>>(24-q0));
1948 n += i;
1949 iq[jz-1] -= i<<(24-q0);
1950 ih = iq[jz-1]>>(23-q0);
1951 } else if (q0==0) {
1952 ih = iq[jz-1]>>23;
1953 } else if(z>=0.5) {
1954 ih=2;
1955 }
1956 if (ih>0) {
1957 n += 1;
1958 carry = 0;
1959 for(i=0;i<jz ;i++) {
1960 j = iq[i];
1961 if (carry == 0) {
1962 if (j != 0) {
1963 carry = 1;
1964 iq[i] = 0x1000000- j;
1965 }
1966 } else iq[i] = 0xffffff - j;
1967 }
1968 if (q0 > 0) {
1969 switch (q0) {
1970 case 1:
1971 iq[jz-1] &= 0x7fffff; break;
1972 case 2:
1973 iq[jz-1] &= 0x3fffff; break;
1974 }
1975 }
1976 if (ih == 2) {
1977 z = one - z;
1978 if (carry != 0) z -= scalbn(one,q0);
1979 }
1980 }
1981
1982
1983 if (z == zero) {
1984 j = 0;
1985 for (i = jz-1; i >= jk; i--)
1986 j |= iq[i];
1987 if (j == 0) {
1988 for (k = 1; iq[jk-k] == 0; k++);
1989 for (i = jz+1; i <= jz+k; i++) {
1990 f[jx+i] = (double) two_over_pi[jv+i];
1991 for (j = 0, fw = 0.0; j <= jx; j++)
1992 fw += x[j]*f[jx+i-j];
1993 q[i] = fw;
1994 }
1995 jz += k;
1996 continue;
1997 }
1998 }
1999 break;
2000 }
2001
2002
2003 if (z == 0.0) {
2004 jz--;
2005 q0 -= 24;
2006 while (iq[jz] == 0) {
2007 jz--;
2008 q0 -= 24;
2009 }
2010 } else {
2011 z = scalbn(z,-q0);
2012 if (z >= two24) {
2013 fw = (double)((int)(twon24*z));
2014 iq[jz] = (int)(z-two24*fw);
2015 jz++;
2016 q0 += 24;
2017 iq[jz] = (int)fw;
2018 } else iq[jz] = (int)z;
2019 }
2020
2021
2022 fw = scalbn(one, q0);
2023 for (i = jz; i >= 0; i--) {
2024 q[i] = fw*(double)iq[i]; fw*=twon24;
2025 }
2026
2027
2028 for (i = jz; i >= 0; i--) {
2029 for (fw = 0.0, k = 0; k <= jp && k <= jz-i; k++)
2030 fw += PIo2[k]*q[i+k];
2031 fq[jz-i] = fw;
2032 }
2033
2034
2035 fw = 0.0;
2036 for (i = jz; i >= 0; i--)
2037 fw += fq[i];
2038 y[0] = (ih==0)? fw: -fw;
2039 fw = fq[0]-fw;
2040 for (i = 1; i <= jz; i++)
2041 fw += fq[i];
2042 y[1] = ((ih==0) ? fw: -fw);
2043 return n&7;
2044 }
2045
2046
2047 private static final double bp[] = {1.0, 1.5,};
2048 private static final double dp_h[] = { 0.0, Double.longBitsToDouble(0x3fe2b80340000000L)};
2049 private static final double dp_l[] = { 0.0, Double.longBitsToDouble(0x3e4cfdeb43cfd006L)};
2050 private static final double two53 = Double.longBitsToDouble(0x4340000000000000L);
2051
2052 private static final double L1 = Double.longBitsToDouble(0x3fe3333333333303L);
2053 private static final double L2 = Double.longBitsToDouble(0x3fdb6db6db6fabffL);
2054 private static final double L3 = Double.longBitsToDouble(0x3fd55555518f264dL);
2055 private static final double L4 = Double.longBitsToDouble(0x3fd17460a91d4101L);
2056 private static final double L5 = Double.longBitsToDouble(0x3fcd864a93c9db65L);
2057 private static final double L6 = Double.longBitsToDouble(0x3fca7e284a454eefL);
2058 private static final double lg2 = Double.longBitsToDouble(0x3fe62e42fefa39efL);
2059 private static final double lg2_h = Double.longBitsToDouble(0x3fe62e4300000000L);
2060 private static final double lg2_l = -1.90465429995776804525e-09;
2061 private static final double ovt = 8.0085662595372944372e-17;
2062 private static final double cp = Double.longBitsToDouble(0x3feec709dc3a03fdL);
2063 private static final double cp_h = Double.longBitsToDouble(0x3feec709e0000000L);
2064 private static final double cp_l = Double.longBitsToDouble(0xbe3e2fe0145b01f5L);
2065 private static final double ivln2 = Double.longBitsToDouble(0x3ff71547652b82feL);
2066 private static final double ivln2_h = Double.longBitsToDouble(0x3ff7154760000000L);
2067 private static final double ivln2_l = Double.longBitsToDouble(0x3e54ae0bf85ddf44L);
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110 /***
2111 * Returns x to the power y.
2112 * @param x The base.
2113 * @param y The exponent.
2114 * @return x to the power y.
2115 */
2116 public static double pow(double x, double y)
2117 {
2118 double z, ax, z_h, z_l, p_h, p_l;
2119 double y1, t1, t2, r, s, t, u, v, w;
2120 int i, j, k, yisint, n;
2121 int hx, hy, ix, iy;
2122 int lx, ly;
2123
2124 hx = __HI(x);
2125 lx = __LO(x);
2126 hy = __HI(y);
2127 ly = __LO(y);
2128 ix = hx & 0x7fffffff;
2129 iy = hy & 0x7fffffff;
2130
2131
2132 if ((iy|ly) == 0) return one;
2133
2134
2135 if (ix > 0x7ff00000 || ((ix==0x7ff00000)&&(lx!=0)) ||
2136 iy > 0x7ff00000 || ((iy==0x7ff00000)&&(ly!=0)))
2137 return x+y;
2138
2139
2140
2141
2142
2143
2144 yisint = 0;
2145 if (hx < 0) {
2146 if (iy >= 0x43400000)
2147 yisint = 2;
2148 else if(iy >= 0x3ff00000) {
2149 k = (iy>>20)-0x3ff;
2150 if (k > 20) {
2151 j = ly>>>(52-k);
2152 if ((j<<(52-k)) == ly)
2153 yisint = 2-(j&1);
2154 } else if (ly == 0) {
2155 j = iy >> (20-k);
2156 if ((j<<(20-k)) == iy)
2157 yisint = 2-(j&1);
2158 }
2159 }
2160 }
2161
2162
2163 if (ly==0) {
2164 if (iy == 0x7ff00000) {
2165 if (((ix-0x3ff00000)|lx) == 0)
2166 return y - y;
2167 else if (ix >= 0x3ff00000)
2168 return (hy>=0)? y: zero;
2169 else
2170 return (hy<0)?-y: zero;
2171 }
2172 if (iy == 0x3ff00000) {
2173 if (hy < 0)
2174 return one/x;
2175 else
2176 return x;
2177 }
2178 if (hy == 0x40000000)
2179 return x*x;
2180 if (hy == 0x3fe00000) {
2181 if(hx>=0)
2182 return sqrt(x);
2183 }
2184 }
2185
2186 ax = abs(x);
2187
2188 if (lx == 0) {
2189 if (ix==0x7ff00000 || ix==0 || ix==0x3ff00000) {
2190 z = ax;
2191 if (hy < 0 )
2192 z = one/z;
2193 if (hx < 0) {
2194 if (((ix-0x3ff00000)|yisint) == 0) {
2195 z = (z-z)/(z-z);
2196 } else if (yisint==1)
2197 z = -z;
2198 }
2199 return z;
2200 }
2201 }
2202
2203
2204 if ((((hx>>31)+1)|yisint) == 0)
2205 return (x-x)/(x-x);
2206
2207
2208 if (iy > 0x41e00000) {
2209 if (iy > 0x43f00000){
2210 if (ix <= 0x3fefffff)
2211 return ((hy < 0) ? huge*huge : tiny*tiny);
2212 if (ix >= 0x3ff00000)
2213 return ((hy > 0) ? huge*huge : tiny*tiny);
2214 }
2215
2216
2217 if (ix < 0x3fefffff)
2218 return ((hy < 0) ? huge*huge : tiny*tiny);
2219 if (ix > 0x3ff00000)
2220 return ((hy > 0) ? huge*huge : tiny*tiny);
2221
2222
2223 t = x-1;
2224 w = (t*t)*(0.5-t*(0.3333333333333333333333-t*0.25));
2225 u = ivln2_h*t;
2226 v = t*ivln2_l-w*ivln2;
2227 t1 = u+v;
2228 t1 = setLO(t1, 0);
2229 t2 = v-(t1-u);
2230 } else {
2231 double s2,s_h,s_l,t_h,t_l;
2232 n = 0;
2233
2234 if (ix<0x00100000) {
2235 ax *= two53;
2236 n -= 53;
2237 ix = __HI(ax);
2238 }
2239 n += ((ix)>>20) - 0x3ff;
2240 j = ix & 0x000fffff;
2241
2242 ix = j|0x3ff00000;
2243 if (j <= 0x3988E)
2244 k=0;
2245 else if (j < 0xBB67A)
2246 k=1;
2247 else {
2248 k = 0;
2249 n+=1;
2250 ix -= 0x00100000;
2251 }
2252 ax = setHI(ax, ix);
2253
2254
2255 u = ax-bp[k];
2256 v = one/(ax+bp[k]);
2257 s = u*v;
2258 s_h = s;
2259 s_h = setLO(s_h, 0);
2260
2261 t_h = zero;
2262 t_h = setHI(t_h, ((ix>>1)|0x20000000)+0x00080000+(k<<18));
2263 t_l = ax - (t_h-bp[k]);
2264 s_l = v*((u-s_h*t_h)-s_h*t_l);
2265
2266 s2 = s*s;
2267 r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
2268 r += s_l*(s_h+s);
2269 s2 = s_h*s_h;
2270 t_h = 3.0+s2+r;
2271 t_h = setLO(t_h, 0);
2272 t_l = r-((t_h-3.0)-s2);
2273
2274 u = s_h*t_h;
2275 v = s_l*t_h+t_l*s;
2276
2277 p_h = u+v;
2278 p_h = setLO(p_h, 0);
2279 p_l = v-(p_h-u);
2280 z_h = cp_h*p_h;
2281 z_l = cp_l*p_h+p_l*cp+dp_l[k];
2282
2283 t = (double)n;
2284 t1 = (((z_h+z_l)+dp_h[k])+t);
2285 t1 = setLO(t1, 0);
2286 t2 = z_l-(((t1-t)-dp_h[k])-z_h);
2287 }
2288
2289 s = one;
2290 if((((hx>>31)+1)|(yisint-1))==0) s = -one;
2291
2292
2293 y1 = y;
2294 y1 = setLO(y1, 0);
2295 p_l = (y-y1)*t1+y*t2;
2296 p_h = y1*t1;
2297 z = p_l+p_h;
2298 j = __HI(z);
2299 i = __LO(z);
2300 if (j >= 0x40900000) {
2301 if (((j-0x40900000)|i) != 0)
2302 return s*huge*huge;
2303 else {
2304 if (p_l+ovt > z-p_h)
2305 return s*huge*huge;
2306 }
2307 } else if((j&0x7fffffff) >= 0x4090cc00) {
2308 if (((j-0xc090cc00)|i) != 0)
2309 return s*tiny*tiny;
2310 else {
2311 if (p_l <= z-p_h) return s*tiny*tiny;
2312 }
2313 }
2314
2315
2316
2317 i = j&0x7fffffff;
2318 k = (i>>20)-0x3ff;
2319 n = 0;
2320 if (i > 0x3fe00000) {
2321 n = j + (0x00100000>>(k+1));
2322 k = ((n&0x7fffffff)>>20) - 0x3ff;
2323 t = zero;
2324 t = setHI(t, (n&~(0x000fffff>>k)));
2325 n = ((n&0x000fffff)|0x00100000)>>(20-k);
2326 if (j < 0) n = -n;
2327 p_h -= t;
2328 }
2329 t = p_l + p_h;
2330 t = setLO(t,0);
2331 u = t*lg2_h;
2332 v = (p_l-(t-p_h))*lg2 + t*lg2_l;
2333 z = u + v;
2334 w = v - (z-u);
2335 t = z*z;
2336 t1= z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
2337 r = (z*t1)/(t1-2.0) - (w+z*w);
2338 z = one - (r-z);
2339 j = __HI(z);
2340 j += (n<<20);
2341 if ((j>>20) <= 0) {
2342 z = scalbn(z,n);
2343 } else {
2344 i = __HI(z);
2345 i += (n << 20);
2346 z = setHI(z, i);
2347 }
2348 return s*z;
2349 }
2350
2351
2352
2353
2354
2355
2356
2357
2358 private static double copysign(double x, double y)
2359 {
2360 long ix = Double.doubleToLongBits(x);
2361 long iy = Double.doubleToLongBits(y);
2362 ix = (0x7fffffffffffffffL*ix) | (0x8000000000000000L&iy);
2363 return Double.longBitsToDouble(ix);
2364 }
2365
2366 private static final double two54 = Double.longBitsToDouble(0x4350000000000000L);
2367 private static final double twom54 = Double.longBitsToDouble(0x3c90000000000000L);
2368
2369
2370
2371
2372
2373
2374
2375
2376 private static double scalbn (double x, int n)
2377 {
2378 int k, hx, lx;
2379 hx = __HI(x);
2380 lx = __LO(x);
2381 k = (hx&0x7ff00000)>>20;
2382 if (k == 0) {
2383 if ((lx|(hx&0x7fffffff))==0) return x;
2384 x *= two54;
2385 hx = __HI(x);
2386 k = ((hx&0x7ff00000)>>20) - 54;
2387 if (n < -50000) return tiny*x;
2388 }
2389 if (k == 0x7ff) return x+x;
2390 k = k+n;
2391 if (k > 0x7fe) return huge*copysign(huge,x);
2392 if (k > 0) {
2393
2394 return setHI(x, (hx&0x800fffff)|(k<<20));
2395 }
2396 if (k <= -54) {
2397 if (n > 50000)
2398 return huge*copysign(huge,x);
2399 } else {
2400 return tiny*copysign(tiny,x);
2401 }
2402 k += 54;
2403 return twom54 * setHI(x, (hx&0x800fffff)|(k<<20));
2404 }
2405
2406
2407 private static double set(int newHiPart, int newLowPart)
2408 {
2409 return Double.longBitsToDouble((((long)newHiPart)<<32) | newLowPart);
2410 }
2411
2412
2413 private static double setLO(double x, int newLowPart)
2414 {
2415 long lx = Double.doubleToLongBits(x);
2416 lx &= 0xFFFFFFFF00000000L;
2417 lx |= newLowPart;
2418 return Double.longBitsToDouble(lx);
2419 }
2420
2421
2422 private static double setHI(double x, int newHiPart)
2423 {
2424 long lx = Double.doubleToLongBits(x);
2425 lx &= 0x00000000FFFFFFFFL;
2426 lx |= (((long)newHiPart)<<32);
2427 return Double.longBitsToDouble(lx);
2428 }
2429
2430 private static int __HI(double x)
2431 {
2432 return (int)(0xFFFFFFFF&(Double.doubleToLongBits(x)>>32));
2433 }
2434
2435 private static int __LO(double x)
2436 {
2437 return (int)(0xFFFFFFFF&Double.doubleToLongBits(x));
2438 }
2439
2440 }