comparison libquadmath/math/j1q.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 04ced10e8804
children
comparison
equal deleted inserted replaced
131:84e7813d76e9 145:1830386684a0
4 * 4 *
5 * 5 *
6 * 6 *
7 * SYNOPSIS: 7 * SYNOPSIS:
8 * 8 *
9 * __float128 x, y, j1q(); 9 * long double x, y, j1l();
10 * 10 *
11 * y = j1q( x ); 11 * y = j1l( x );
12 * 12 *
13 * 13 *
14 * 14 *
15 * DESCRIPTION: 15 * DESCRIPTION:
16 * 16 *
50 * 50 *
51 * 51 *
52 * 52 *
53 * SYNOPSIS: 53 * SYNOPSIS:
54 * 54 *
55 * __float128, y, y1q(); 55 * double x, y, y1l();
56 * 56 *
57 * y = y1q( x ); 57 * y = y1l( x );
58 * 58 *
59 * 59 *
60 * 60 *
61 * DESCRIPTION: 61 * DESCRIPTION:
62 * 62 *
90 but WITHOUT ANY WARRANTY; without even the implied warranty of 90 but WITHOUT ANY WARRANTY; without even the implied warranty of
91 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 91 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
92 Lesser General Public License for more details. 92 Lesser General Public License for more details.
93 93
94 You should have received a copy of the GNU Lesser General Public 94 You should have received a copy of the GNU Lesser General Public
95 License along with this library; if not, write to the Free Software 95 License along with this library; if not, see
96 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ 96 <http://www.gnu.org/licenses/>. */
97 97
98 #include <errno.h>
99 #include "quadmath-imp.h" 98 #include "quadmath-imp.h"
100 99
101 /* 1 / sqrt(pi) */ 100 /* 1 / sqrt(pi) */
102 static const __float128 ONEOSQPI = 5.6418958354775628694807945156077258584405E-1Q; 101 static const __float128 ONEOSQPI = 5.6418958354775628694807945156077258584405E-1Q;
103 /* 2 / pi */ 102 /* 2 / pi */
104 static const __float128 TWOOPI = 6.3661977236758134307553505349005744813784E-1Q; 103 static const __float128 TWOOPI = 6.3661977236758134307553505349005744813784E-1Q;
105 static const __float128 zero = 0.0Q; 104 static const __float128 zero = 0;
106 105
107 /* J1(x) = .5x + x x^2 R(x^2) 106 /* J1(x) = .5x + x x^2 R(x^2)
108 Peak relative error 1.9e-35 107 Peak relative error 1.9e-35
109 0 <= x <= 2 */ 108 0 <= x <= 2 */
110 #define NJ0_2N 6 109 #define NJ0_2N 6
124 5.934143516050192600795972192791775226920E13Q, 123 5.934143516050192600795972192791775226920E13Q,
125 2.168000911950620999091479265214368352883E11Q, 124 2.168000911950620999091479265214368352883E11Q,
126 5.673775894803172808323058205986256928794E8Q, 125 5.673775894803172808323058205986256928794E8Q,
127 1.080329960080981204840966206372671147224E6Q, 126 1.080329960080981204840966206372671147224E6Q,
128 1.411951256636576283942477881535283304912E3Q, 127 1.411951256636576283942477881535283304912E3Q,
129 /* 1.000000000000000000000000000000000000000E0Q */ 128 /* 1.000000000000000000000000000000000000000E0L */
130 }; 129 };
131 130
132 /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2), 131 /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2),
133 0 <= 1/x <= .0625 132 0 <= 1/x <= .0625
134 Peak relative error 3.6e-36 */ 133 Peak relative error 3.6e-36 */
688 if (! finiteq (x)) 687 if (! finiteq (x))
689 { 688 {
690 if (x != x) 689 if (x != x)
691 return x + x; 690 return x + x;
692 else 691 else
693 return 0.0Q; 692 return 0;
694 } 693 }
695 if (x == 0.0Q) 694 if (x == 0)
696 return x; 695 return x;
697 xx = fabsq (x); 696 xx = fabsq (x);
698 if (xx <= 0x1p-58Q) 697 if (xx <= 0x1p-58Q)
699 { 698 {
700 __float128 ret = x * 0.5Q; 699 __float128 ret = x * 0.5Q;
701 math_check_force_underflow (ret); 700 math_check_force_underflow (ret);
702 if (ret == 0) 701 if (ret == 0)
703 errno = ERANGE; 702 errno = ERANGE;
704 return ret; 703 return ret;
705 } 704 }
706 if (xx <= 2.0Q) 705 if (xx <= 2)
707 { 706 {
708 /* 0 <= x <= 2 */ 707 /* 0 <= x <= 2 */
709 z = xx * xx; 708 z = xx * xx;
710 p = xx * z * neval (z, J0_2N, NJ0_2N) / deval (z, J0_2D, NJ0_2D); 709 p = xx * z * neval (z, J0_2N, NJ0_2N) / deval (z, J0_2D, NJ0_2D);
711 p += 0.5Q * xx; 710 p += 0.5Q * xx;
721 = -1/sqrt(2) * (sin(x) + cos(x)) 720 = -1/sqrt(2) * (sin(x) + cos(x))
722 cf. Fdlibm. */ 721 cf. Fdlibm. */
723 sincosq (xx, &s, &c); 722 sincosq (xx, &s, &c);
724 ss = -s - c; 723 ss = -s - c;
725 cc = s - c; 724 cc = s - c;
726 if (xx <= FLT128_MAX / 2.0Q) 725 if (xx <= FLT128_MAX / 2)
727 { 726 {
728 z = cosq (xx + xx); 727 z = cosq (xx + xx);
729 if ((s * c) > 0) 728 if ((s * c) > 0)
730 cc = z / ss; 729 cc = z / ss;
731 else 730 else
738 if (x < 0) 737 if (x < 0)
739 z = -z; 738 z = -z;
740 return z; 739 return z;
741 } 740 }
742 741
743 xinv = 1.0Q / xx; 742 xinv = 1 / xx;
744 z = xinv * xinv; 743 z = xinv * xinv;
745 if (xinv <= 0.25) 744 if (xinv <= 0.25)
746 { 745 {
747 if (xinv <= 0.125) 746 if (xinv <= 0.125)
748 { 747 {
796 { 795 {
797 p = neval (z, P2_2r3N, NP2_2r3N) / deval (z, P2_2r3D, NP2_2r3D); 796 p = neval (z, P2_2r3N, NP2_2r3N) / deval (z, P2_2r3D, NP2_2r3D);
798 q = neval (z, Q2_2r3N, NQ2_2r3N) / deval (z, Q2_2r3D, NQ2_2r3D); 797 q = neval (z, Q2_2r3N, NQ2_2r3N) / deval (z, Q2_2r3D, NQ2_2r3D);
799 } 798 }
800 } 799 }
801 p = 1.0Q + z * p; 800 p = 1 + z * p;
802 q = z * q; 801 q = z * q;
803 q = q * xinv + 0.375Q * xinv; 802 q = q * xinv + 0.375Q * xinv;
804 z = ONEOSQPI * (p * cc - q * ss) / sqrtq (xx); 803 z = ONEOSQPI * (p * cc - q * ss) / sqrtq (xx);
805 if (x < 0) 804 if (x < 0)
806 z = -z; 805 z = -z;
807 return z; 806 return z;
808 } 807 }
809 808
810 809
810
811 /* Y1(x) = 2/pi * (log(x) * J1(x) - 1/x) + x R(x^2) 811 /* Y1(x) = 2/pi * (log(x) * J1(x) - 1/x) + x R(x^2)
812 Peak relative error 6.2e-38 812 Peak relative error 6.2e-38
813 0 <= x <= 2 */ 813 0 <= x <= 2 */
814 #define NY0_2N 7 814 #define NY0_2N 7
815 static __float128 Y0_2N[NY0_2N + 1] = { 815 static const __float128 Y0_2N[NY0_2N + 1] = {
816 -6.804415404830253804408698161694720833249E19Q, 816 -6.804415404830253804408698161694720833249E19Q,
817 1.805450517967019908027153056150465849237E19Q, 817 1.805450517967019908027153056150465849237E19Q,
818 -8.065747497063694098810419456383006737312E17Q, 818 -8.065747497063694098810419456383006737312E17Q,
819 1.401336667383028259295830955439028236299E16Q, 819 1.401336667383028259295830955439028236299E16Q,
820 -1.171654432898137585000399489686629680230E14Q, 820 -1.171654432898137585000399489686629680230E14Q,
821 5.061267920943853732895341125243428129150E11Q, 821 5.061267920943853732895341125243428129150E11Q,
822 -1.096677850566094204586208610960870217970E9Q, 822 -1.096677850566094204586208610960870217970E9Q,
823 9.541172044989995856117187515882879304461E5Q, 823 9.541172044989995856117187515882879304461E5Q,
824 }; 824 };
825 #define NY0_2D 7 825 #define NY0_2D 7
826 static __float128 Y0_2D[NY0_2D + 1] = { 826 static const __float128 Y0_2D[NY0_2D + 1] = {
827 3.470629591820267059538637461549677594549E20Q, 827 3.470629591820267059538637461549677594549E20Q,
828 4.120796439009916326855848107545425217219E18Q, 828 4.120796439009916326855848107545425217219E18Q,
829 2.477653371652018249749350657387030814542E16Q, 829 2.477653371652018249749350657387030814542E16Q,
830 9.954678543353888958177169349272167762797E13Q, 830 9.954678543353888958177169349272167762797E13Q,
831 2.957927997613630118216218290262851197754E11Q, 831 2.957927997613630118216218290262851197754E11Q,
843 { 843 {
844 __float128 xx, xinv, z, p, q, c, s, cc, ss; 844 __float128 xx, xinv, z, p, q, c, s, cc, ss;
845 845
846 if (! finiteq (x)) 846 if (! finiteq (x))
847 return 1 / (x + x * x); 847 return 1 / (x + x * x);
848 if (x <= 0.0Q) 848 if (x <= 0)
849 { 849 {
850 if (x < 0.0Q) 850 if (x < 0)
851 return (zero / (zero * x)); 851 return (zero / (zero * x));
852 return -1 / zero; /* -inf and divide by zero exception. */ 852 return -1 / zero; /* -inf and divide by zero exception. */
853 } 853 }
854 xx = fabsq (x); 854 xx = fabsq (x);
855 if (xx <= 0x1p-114) 855 if (xx <= 0x1p-114)
857 z = -TWOOPI / x; 857 z = -TWOOPI / x;
858 if (isinfq (z)) 858 if (isinfq (z))
859 errno = ERANGE; 859 errno = ERANGE;
860 return z; 860 return z;
861 } 861 }
862 if (xx <= 2.0Q) 862 if (xx <= 2)
863 { 863 {
864 /* 0 <= x <= 2 */ 864 /* 0 <= x <= 2 */
865 /* FIXME: SET_RESTORE_ROUNDL (FE_TONEAREST); */ 865 SET_RESTORE_ROUNDF128 (FE_TONEAREST);
866 z = xx * xx; 866 z = xx * xx;
867 p = xx * neval (z, Y0_2N, NY0_2N) / deval (z, Y0_2D, NY0_2D); 867 p = xx * neval (z, Y0_2N, NY0_2N) / deval (z, Y0_2D, NY0_2D);
868 p = -TWOOPI / xx + p; 868 p = -TWOOPI / xx + p;
869 p = TWOOPI * logq (x) * j1q (x) + p; 869 p = TWOOPI * logq (x) * j1q (x) + p;
870 return p; 870 return p;
877 = -1/sqrt(2) * (sin(x) + cos(x)) 877 = -1/sqrt(2) * (sin(x) + cos(x))
878 cf. Fdlibm. */ 878 cf. Fdlibm. */
879 sincosq (xx, &s, &c); 879 sincosq (xx, &s, &c);
880 ss = -s - c; 880 ss = -s - c;
881 cc = s - c; 881 cc = s - c;
882 if (xx <= FLT128_MAX / 2.0Q) 882 if (xx <= FLT128_MAX / 2)
883 { 883 {
884 z = cosq (xx + xx); 884 z = cosq (xx + xx);
885 if ((s * c) > 0) 885 if ((s * c) > 0)
886 cc = z / ss; 886 cc = z / ss;
887 else 887 else
889 } 889 }
890 890
891 if (xx > 0x1p256Q) 891 if (xx > 0x1p256Q)
892 return ONEOSQPI * ss / sqrtq (xx); 892 return ONEOSQPI * ss / sqrtq (xx);
893 893
894 xinv = 1.0Q / xx; 894 xinv = 1 / xx;
895 z = xinv * xinv; 895 z = xinv * xinv;
896 if (xinv <= 0.25) 896 if (xinv <= 0.25)
897 { 897 {
898 if (xinv <= 0.125) 898 if (xinv <= 0.125)
899 { 899 {
947 { 947 {
948 p = neval (z, P2_2r3N, NP2_2r3N) / deval (z, P2_2r3D, NP2_2r3D); 948 p = neval (z, P2_2r3N, NP2_2r3N) / deval (z, P2_2r3D, NP2_2r3D);
949 q = neval (z, Q2_2r3N, NQ2_2r3N) / deval (z, Q2_2r3D, NQ2_2r3D); 949 q = neval (z, Q2_2r3N, NQ2_2r3N) / deval (z, Q2_2r3D, NQ2_2r3D);
950 } 950 }
951 } 951 }
952 p = 1.0Q + z * p; 952 p = 1 + z * p;
953 q = z * q; 953 q = z * q;
954 q = q * xinv + 0.375Q * xinv; 954 q = q * xinv + 0.375Q * xinv;
955 z = ONEOSQPI * (p * ss + q * cc) / sqrtq (xx); 955 z = ONEOSQPI * (p * ss + q * cc) / sqrtq (xx);
956 return z; 956 return z;
957 } 957 }