1 ! { dg-options "-fdec-math" }
4 ! Test extra math intrinsics offered by -fdec-math.
7 subroutine cmpf(f1
, f2
, tolerance
, str
)
9 real(4), intent(in
) :: f1
, f2
, tolerance
10 character(len
=*), intent(in
) :: str
11 if ( abs(f2
- f1
) .gt
. tolerance
) then
12 write (*, '(A,F12.6,F12.6)') str
, f1
, f2
17 subroutine cmpd(d1
, d2
, tolerance
, str
)
19 real(8), intent(in
) :: d1
, d2
, tolerance
20 character(len
=*), intent(in
) :: str
21 if ( dabs(d2
- d1
) .gt
. tolerance
) then
22 write (*, '(A,F12.6,F12.6)') str
, d1
, d2
29 real(4), parameter :: pi_f
= (4.0_4
* atan(1.0_4
))
30 real(8), parameter :: pi_d
= (4.0_8
* datan(1.0_8
))
31 real(4), parameter :: r2d_f
= 180.0_4
/ pi_f
32 real(8), parameter :: r2d_d
= 180.0_8
/ pi_d
33 real(4), parameter :: d2r_f
= pi_f
/ 180.0_4
34 real(8), parameter :: d2r_d
= pi_d
/ 180.0_8
38 real(4), volatile :: xf
40 real(8), volatile :: xd
42 ! expected outputs from (oe) default (oxe) expression
43 real(4) :: f_oe
, f_oxe
44 real(8) :: d_oe
, d_oxe
46 ! actual outputs from (oa) default (oc) constant (ox) expression
47 real(4) :: f_oa
, f_oc
, f_ox
48 real(8) :: d_oa
, d_oc
, d_ox
50 ! tolerance of the answer: assert |exp-act| <= tol
54 ! equivalence tolerance
58 ! multiplication factors to test non-constant expressions
67 f_oe
= r2d_f
*acos (f_i1
)
68 f_oxe
= xf
*r2d_f
*acos (f_i1
)
69 d_oe
= r2d_d
*dacos(d_i1
)
70 d_oxe
= xd
*r2d_d
*dacos(d_i1
)
74 f_oc
= acosd (0.68032123_4
)
75 f_ox
= xf
*acosd (f_i1
)
77 d_oc
= dacosd (0.68032123_8
)
78 d_ox
= xd
*dacosd (0.68032123_8
)
80 call cmpf(f_oe
, f_oa
, f_tol
, "( ) acosd")
81 call cmpf(f_oe
, f_oc
, f_tol
, "(c) acosd")
82 call cmpf(f_oxe
, f_ox
, f_tol
, "(x) acosd")
83 call cmpd(d_oe
, d_oa
, d_tol
, "( ) dacosd")
84 call cmpd(d_oe
, d_oc
, d_tol
, "(c) dacosd")
85 call cmpd(d_oxe
, d_ox
, d_tol
, "(x) dacosd")
92 f_oe
= cos (d2r_f
*f_i1
)
93 f_oxe
= xf
*cos (d2r_f
*f_i1
)
94 d_oe
= cos (d2r_d
*d_i1
)
95 d_oxe
= xd
*cos (d2r_d
*d_i1
)
100 f_ox
= xf
* cosd (f_i1
)
102 d_oc
= dcosd (60.0_8
)
103 d_ox
= xd
* cosd (d_i1
)
105 call cmpf(f_oe
, f_oa
, f_tol
, "( ) cosd")
106 call cmpf(f_oe
, f_oc
, f_tol
, "(c) cosd")
107 call cmpf(f_oxe
, f_ox
, f_tol
, "(x) cosd")
108 call cmpd(d_oe
, d_oa
, d_tol
, "( ) dcosd")
109 call cmpd(d_oe
, d_oc
, d_tol
, "(c) dcosd")
110 call cmpd(d_oxe
, d_ox
, d_tol
, "(x) cosd")
117 f_oe
= r2d_f
*asin (f_i1
)
118 f_oxe
= xf
*r2d_f
*asin (f_i1
)
119 d_oe
= r2d_d
*asin (d_i1
)
120 d_oxe
= xd
*r2d_d
*asin (d_i1
)
124 f_oc
= asind (0.79345021_4
)
125 f_ox
= xf
* asind (f_i1
)
127 d_oc
= dasind (0.79345021_8
)
128 d_ox
= xd
* asind (d_i1
)
130 call cmpf(f_oe
, f_oa
, f_tol
, "( ) asind")
131 call cmpf(f_oe
, f_oc
, f_tol
, "(c) asind")
132 call cmpf(f_oxe
, f_ox
, f_tol
, "(x) asind")
133 call cmpd(d_oe
, d_oa
, d_tol
, "( ) dasind")
134 call cmpd(d_oe
, d_oc
, d_tol
, "(c) dasind")
135 call cmpd(d_oxe
, d_ox
, d_tol
, "(x) asind")
142 f_oe
= sin (d2r_f
*f_i1
)
143 f_oxe
= xf
*sin (d2r_f
*f_i1
)
144 d_oe
= sin (d2r_d
*d_i1
)
145 d_oxe
= xd
*sin (d2r_d
*d_i1
)
150 f_ox
= xf
* sind (f_i1
)
152 d_oc
= dsind (60.0_8
)
153 d_ox
= xd
* sind (d_i1
)
155 call cmpf(f_oe
, f_oa
, f_tol
, "( ) sind")
156 call cmpf(f_oe
, f_oc
, f_tol
, "(c) sind")
157 call cmpf(f_oxe
, f_ox
, f_tol
, "(x) sind")
158 call cmpd(d_oe
, d_oa
, d_tol
, "( ) dsind")
159 call cmpd(d_oe
, d_oc
, d_tol
, "(c) dsind")
160 call cmpd(d_oxe
, d_ox
, d_tol
, "(x) sind")
169 f_oe
= r2d_f
*atan2 (f_i1
, f_i2
)
170 f_oxe
= xf
*r2d_f
*atan2 (f_i1
, f_i2
)
171 d_oe
= r2d_d
*atan2 (d_i1
, d_i2
)
172 d_oxe
= xd
*r2d_d
*atan2 (d_i1
, d_i2
)
175 f_oa
= atan2d (f_i1
, f_i2
)
176 f_oc
= atan2d (2.679676_4
, 1.0_4
)
177 f_ox
= xf
* atan2d (f_i1
, f_i2
)
178 d_oa
= datan2d (d_i1
, d_i2
)
179 d_oc
= datan2d (2.679676_8
, 1.0_8
)
180 d_ox
= xd
* atan2d (d_i1
, d_i2
)
182 call cmpf(f_oe
, f_oa
, f_tol
, "( ) atan2d")
183 call cmpf(f_oe
, f_oc
, f_tol
, "(c) atan2d")
184 call cmpf(f_oxe
, f_ox
, f_tol
, "(x) atan2d")
185 call cmpd(d_oe
, d_oa
, d_tol
, "( ) datan2d")
186 call cmpd(d_oe
, d_oc
, d_tol
, "(c) datan2d")
187 call cmpd(d_oxe
, d_ox
, d_tol
, "(x) atan2d")
194 f_oe
= r2d_f
*atan (f_i1
)
195 f_oxe
= xf
*r2d_f
*atan (f_i1
)
196 d_oe
= r2d_d
*atan (d_i1
)
197 d_oxe
= xd
*r2d_d
*atan (d_i1
)
201 f_oc
= atand (1.5874993_4
)
202 f_ox
= xf
* atand (f_i1
)
204 d_oc
= datand (1.5874993_8
)
205 d_ox
= xd
* atand (d_i1
)
207 call cmpf(f_oe
, f_oa
, f_tol
, "( ) atand")
208 call cmpf(f_oe
, f_oc
, f_tol
, "(c) atand")
209 call cmpf(f_oxe
, f_ox
, f_tol
, "(x) atand")
210 call cmpd(d_oe
, d_oa
, d_tol
, "( ) datand")
211 call cmpd(d_oe
, d_oc
, d_tol
, "(c) datand")
212 call cmpd(d_oxe
, d_ox
, d_tol
, "(x) atand")
219 f_oe
= cotan (d2r_f
*f_i1
)
220 f_oxe
= xf
*cotan (d2r_f
*f_i1
)
221 d_oe
= cotan (d2r_d
*d_i1
)
222 d_oxe
= xd
*cotan (d2r_d
*d_i1
)
226 f_oc
= cotand (0.6_4
)
227 f_ox
= xf
* cotand (f_i1
)
228 d_oa
= dcotand (d_i1
)
229 d_oc
= dcotand (0.6_8
)
230 d_ox
= xd
* cotand (d_i1
)
232 call cmpf(f_oe
, f_oa
, f_tol
, "( ) cotand")
233 call cmpf(f_oe
, f_oc
, f_tol
, "(c) cotand")
234 call cmpf(f_oxe
, f_ox
, f_tol
, "(x) cotand")
235 call cmpd(d_oe
, d_oa
, d_tol
, "( ) dcotand")
236 call cmpd(d_oe
, d_oc
, d_tol
, "(c) dcotand")
237 call cmpd(d_oxe
, d_ox
, d_tol
, "(x) cotand")
244 f_oe
= 1.0_4
/tan (f_i1
)
245 f_oxe
= xf
* 1.0_4
/tan (f_i1
)
246 d_oe
= 1.0_8
/dtan (d_i1
)
247 d_oxe
= xd
*1.0_8
/dtan (d_i1
)
252 f_ox
= xf
* cotan (f_i1
)
254 d_oc
= dcotan (0.6_8
)
255 d_ox
= xd
* cotan (d_i1
)
257 call cmpf(f_oe
, f_oa
, f_tol
, "( ) cotan")
258 call cmpf(f_oe
, f_oc
, f_tol
, "(c) cotan")
259 call cmpf(f_oxe
, f_ox
, f_tol
, "(x) cotan")
260 call cmpd(d_oe
, d_oa
, d_tol
, "( ) dcotan")
261 call cmpd(d_oe
, d_oc
, d_tol
, "(c) dcotan")
262 call cmpd(d_oxe
, d_ox
, d_tol
, "(x) cotan")
269 f_oe
= tan (d2r_f
*f_i1
)
270 f_oxe
= xf
*tan (d2r_f
*f_i1
)
271 d_oe
= tan (d2r_d
*d_i1
)
272 d_oxe
= xd
*tan (d2r_d
*d_i1
)
277 f_ox
= xf
* tand (f_i1
)
279 d_oc
= dtand (60.0_8
)
280 d_ox
= xd
* tand (d_i1
)
282 call cmpf(f_oe
, f_oa
, f_tol
, "( ) tand")
283 call cmpf(f_oe
, f_oc
, f_tol
, "(c) tand")
284 call cmpf(f_oxe
, f_ox
, f_tol
, "(x) tand")
285 call cmpd(d_oe
, d_oa
, d_tol
, "( ) dtand")
286 call cmpd(d_oe
, d_oc
, d_tol
, "(c) dtand")
287 call cmpd(d_oxe
, d_ox
, d_tol
, "(x) tand")