1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <math.h>
11
12#include <math.h>
13#include <type_traits>
14#include <cassert>
15
16#include "hexfloat.h"
17
18void test_acos()
19{
20    static_assert((std::is_same<decltype(acos((double)0)), double>::value), "");
21    static_assert((std::is_same<decltype(acosf(0)), float>::value), "");
22    static_assert((std::is_same<decltype(acosl(0)), long double>::value), "");
23    assert(acos(1) == 0);
24}
25
26void test_asin()
27{
28    static_assert((std::is_same<decltype(asin((double)0)), double>::value), "");
29    static_assert((std::is_same<decltype(asinf(0)), float>::value), "");
30    static_assert((std::is_same<decltype(asinl(0)), long double>::value), "");
31    assert(asin(0) == 0);
32}
33
34void test_atan()
35{
36    static_assert((std::is_same<decltype(atan((double)0)), double>::value), "");
37    static_assert((std::is_same<decltype(atanf(0)), float>::value), "");
38    static_assert((std::is_same<decltype(atanl(0)), long double>::value), "");
39    assert(atan(0) == 0);
40}
41
42void test_atan2()
43{
44    static_assert((std::is_same<decltype(atan2((double)0, (double)0)), double>::value), "");
45    static_assert((std::is_same<decltype(atan2f(0,0)), float>::value), "");
46    static_assert((std::is_same<decltype(atan2l(0,0)), long double>::value), "");
47    assert(atan2(0,1) == 0);
48}
49
50void test_ceil()
51{
52    static_assert((std::is_same<decltype(ceil((double)0)), double>::value), "");
53    static_assert((std::is_same<decltype(ceilf(0)), float>::value), "");
54    static_assert((std::is_same<decltype(ceill(0)), long double>::value), "");
55    assert(ceil(0) == 0);
56}
57
58void test_cos()
59{
60    static_assert((std::is_same<decltype(cos((double)0)), double>::value), "");
61    static_assert((std::is_same<decltype(cosf(0)), float>::value), "");
62    static_assert((std::is_same<decltype(cosl(0)), long double>::value), "");
63    assert(cos(0) == 1);
64}
65
66void test_cosh()
67{
68    static_assert((std::is_same<decltype(cosh((double)0)), double>::value), "");
69    static_assert((std::is_same<decltype(coshf(0)), float>::value), "");
70    static_assert((std::is_same<decltype(coshl(0)), long double>::value), "");
71    assert(cosh(0) == 1);
72}
73
74void test_exp()
75{
76    static_assert((std::is_same<decltype(exp((double)0)), double>::value), "");
77    static_assert((std::is_same<decltype(expf(0)), float>::value), "");
78    static_assert((std::is_same<decltype(expl(0)), long double>::value), "");
79    assert(exp(0) == 1);
80}
81
82void test_fabs()
83{
84    static_assert((std::is_same<decltype(fabs((double)0)), double>::value), "");
85    static_assert((std::is_same<decltype(fabsf(0.f)), float>::value), "");
86    static_assert((std::is_same<decltype(fabsl(0.L)), long double>::value), "");
87    assert(fabs(-1.f) == 1);
88}
89
90void test_floor()
91{
92    static_assert((std::is_same<decltype(floor((double)0)), double>::value), "");
93    static_assert((std::is_same<decltype(floorf(0)), float>::value), "");
94    static_assert((std::is_same<decltype(floorl(0)), long double>::value), "");
95    assert(floor(1) == 1);
96}
97
98void test_fmod()
99{
100    static_assert((std::is_same<decltype(fmod((double)0, (double)0)), double>::value), "");
101    static_assert((std::is_same<decltype(fmodf(0,0)), float>::value), "");
102    static_assert((std::is_same<decltype(fmodl(0,0)), long double>::value), "");
103    assert(fmod(1.5,1) == .5);
104}
105
106void test_frexp()
107{
108    int ip;
109    static_assert((std::is_same<decltype(frexp((double)0, &ip)), double>::value), "");
110    static_assert((std::is_same<decltype(frexpf(0, &ip)), float>::value), "");
111    static_assert((std::is_same<decltype(frexpl(0, &ip)), long double>::value), "");
112    assert(frexp(0, &ip) == 0);
113}
114
115void test_ldexp()
116{
117    int ip = 1;
118    static_assert((std::is_same<decltype(ldexp((double)0, ip)), double>::value), "");
119    static_assert((std::is_same<decltype(ldexpf(0, ip)), float>::value), "");
120    static_assert((std::is_same<decltype(ldexpl(0, ip)), long double>::value), "");
121    assert(ldexp(1, ip) == 2);
122}
123
124void test_log()
125{
126    static_assert((std::is_same<decltype(log((double)0)), double>::value), "");
127    static_assert((std::is_same<decltype(logf(0)), float>::value), "");
128    static_assert((std::is_same<decltype(logl(0)), long double>::value), "");
129    assert(log(1) == 0);
130}
131
132void test_log10()
133{
134    static_assert((std::is_same<decltype(log10((double)0)), double>::value), "");
135    static_assert((std::is_same<decltype(log10f(0)), float>::value), "");
136    static_assert((std::is_same<decltype(log10l(0)), long double>::value), "");
137    assert(log10(1) == 0);
138}
139
140void test_modf()
141{
142    static_assert((std::is_same<decltype(modf((double)0, (double*)0)), double>::value), "");
143    static_assert((std::is_same<decltype(modff(0, (float*)0)), float>::value), "");
144    static_assert((std::is_same<decltype(modfl(0, (long double*)0)), long double>::value), "");
145    double i;
146    assert(modf(1., &i) == 0);
147}
148
149void test_pow()
150{
151    static_assert((std::is_same<decltype(pow((double)0, (double)0)), double>::value), "");
152    static_assert((std::is_same<decltype(powf(0,0)), float>::value), "");
153    static_assert((std::is_same<decltype(powl(0,0)), long double>::value), "");
154    assert(pow(1,1) == 1);
155}
156
157void test_sin()
158{
159    static_assert((std::is_same<decltype(sin((double)0)), double>::value), "");
160    static_assert((std::is_same<decltype(sinf(0)), float>::value), "");
161    static_assert((std::is_same<decltype(sinl(0)), long double>::value), "");
162    assert(sin(0) == 0);
163}
164
165void test_sinh()
166{
167    static_assert((std::is_same<decltype(sinh((double)0)), double>::value), "");
168    static_assert((std::is_same<decltype(sinhf(0)), float>::value), "");
169    static_assert((std::is_same<decltype(sinhl(0)), long double>::value), "");
170    assert(sinh(0) == 0);
171}
172
173void test_sqrt()
174{
175    static_assert((std::is_same<decltype(sqrt((double)0)), double>::value), "");
176    static_assert((std::is_same<decltype(sqrtf(0)), float>::value), "");
177    static_assert((std::is_same<decltype(sqrtl(0)), long double>::value), "");
178    assert(sqrt(4) == 2);
179}
180
181void test_tan()
182{
183    static_assert((std::is_same<decltype(tan((double)0)), double>::value), "");
184    static_assert((std::is_same<decltype(tanf(0)), float>::value), "");
185    static_assert((std::is_same<decltype(tanl(0)), long double>::value), "");
186    assert(tan(0) == 0);
187}
188
189void test_tanh()
190{
191    static_assert((std::is_same<decltype(tanh((double)0)), double>::value), "");
192    static_assert((std::is_same<decltype(tanhf(0)), float>::value), "");
193    static_assert((std::is_same<decltype(tanhl(0)), long double>::value), "");
194    assert(tanh(0) == 0);
195}
196
197void test_signbit()
198{
199    static_assert((std::is_same<decltype(signbit((float)0)), bool>::value), "");
200    static_assert((std::is_same<decltype(signbit((double)0)), bool>::value), "");
201    static_assert((std::is_same<decltype(signbit((long double)0)), bool>::value), "");
202    assert(signbit(-1.0) == true);
203}
204
205void test_fpclassify()
206{
207    static_assert((std::is_same<decltype(fpclassify((float)0)), int>::value), "");
208    static_assert((std::is_same<decltype(fpclassify((double)0)), int>::value), "");
209    static_assert((std::is_same<decltype(fpclassify((long double)0)), int>::value), "");
210    assert(fpclassify(-1.0) == FP_NORMAL);
211}
212
213void test_isfinite()
214{
215    static_assert((std::is_same<decltype(isfinite((float)0)), bool>::value), "");
216    static_assert((std::is_same<decltype(isfinite((double)0)), bool>::value), "");
217    static_assert((std::is_same<decltype(isfinite((long double)0)), bool>::value), "");
218    assert(isfinite(-1.0) == true);
219}
220
221void test_isinf()
222{
223    static_assert((std::is_same<decltype(isinf((float)0)), bool>::value), "");
224    static_assert((std::is_same<decltype(isinf((double)0)), bool>::value), "");
225    static_assert((std::is_same<decltype(isinf((long double)0)), bool>::value), "");
226    assert(isinf(-1.0) == false);
227}
228
229void test_isnan()
230{
231    static_assert((std::is_same<decltype(isnan((float)0)), bool>::value), "");
232    static_assert((std::is_same<decltype(isnan((double)0)), bool>::value), "");
233    static_assert((std::is_same<decltype(isnan((long double)0)), bool>::value), "");
234    assert(isnan(-1.0) == false);
235}
236
237void test_isnormal()
238{
239    static_assert((std::is_same<decltype(isnormal((float)0)), bool>::value), "");
240    static_assert((std::is_same<decltype(isnormal((double)0)), bool>::value), "");
241    static_assert((std::is_same<decltype(isnormal((long double)0)), bool>::value), "");
242    assert(isnormal(-1.0) == true);
243}
244
245void test_isgreater()
246{
247    static_assert((std::is_same<decltype(isgreater((float)0, (float)0)), bool>::value), "");
248    static_assert((std::is_same<decltype(isgreater((float)0, (double)0)), bool>::value), "");
249    static_assert((std::is_same<decltype(isgreater((float)0, (long double)0)), bool>::value), "");
250    static_assert((std::is_same<decltype(isgreater((double)0, (float)0)), bool>::value), "");
251    static_assert((std::is_same<decltype(isgreater((double)0, (double)0)), bool>::value), "");
252    static_assert((std::is_same<decltype(isgreater((double)0, (long double)0)), bool>::value), "");
253    static_assert((std::is_same<decltype(isgreater((long double)0, (float)0)), bool>::value), "");
254    static_assert((std::is_same<decltype(isgreater((long double)0, (double)0)), bool>::value), "");
255    static_assert((std::is_same<decltype(isgreater((long double)0, (long double)0)), bool>::value), "");
256    assert(isgreater(-1.0, 0.F) == false);
257}
258
259void test_isgreaterequal()
260{
261    static_assert((std::is_same<decltype(isgreaterequal((float)0, (float)0)), bool>::value), "");
262    static_assert((std::is_same<decltype(isgreaterequal((float)0, (double)0)), bool>::value), "");
263    static_assert((std::is_same<decltype(isgreaterequal((float)0, (long double)0)), bool>::value), "");
264    static_assert((std::is_same<decltype(isgreaterequal((double)0, (float)0)), bool>::value), "");
265    static_assert((std::is_same<decltype(isgreaterequal((double)0, (double)0)), bool>::value), "");
266    static_assert((std::is_same<decltype(isgreaterequal((double)0, (long double)0)), bool>::value), "");
267    static_assert((std::is_same<decltype(isgreaterequal((long double)0, (float)0)), bool>::value), "");
268    static_assert((std::is_same<decltype(isgreaterequal((long double)0, (double)0)), bool>::value), "");
269    static_assert((std::is_same<decltype(isgreaterequal((long double)0, (long double)0)), bool>::value), "");
270    assert(isgreaterequal(-1.0, 0.F) == false);
271}
272
273void test_isless()
274{
275    static_assert((std::is_same<decltype(isless((float)0, (float)0)), bool>::value), "");
276    static_assert((std::is_same<decltype(isless((float)0, (double)0)), bool>::value), "");
277    static_assert((std::is_same<decltype(isless((float)0, (long double)0)), bool>::value), "");
278    static_assert((std::is_same<decltype(isless((double)0, (float)0)), bool>::value), "");
279    static_assert((std::is_same<decltype(isless((double)0, (double)0)), bool>::value), "");
280    static_assert((std::is_same<decltype(isless((double)0, (long double)0)), bool>::value), "");
281    static_assert((std::is_same<decltype(isless((long double)0, (float)0)), bool>::value), "");
282    static_assert((std::is_same<decltype(isless((long double)0, (double)0)), bool>::value), "");
283    static_assert((std::is_same<decltype(isless((long double)0, (long double)0)), bool>::value), "");
284    assert(isless(-1.0, 0.F) == true);
285}
286
287void test_islessequal()
288{
289    static_assert((std::is_same<decltype(islessequal((float)0, (float)0)), bool>::value), "");
290    static_assert((std::is_same<decltype(islessequal((float)0, (double)0)), bool>::value), "");
291    static_assert((std::is_same<decltype(islessequal((float)0, (long double)0)), bool>::value), "");
292    static_assert((std::is_same<decltype(islessequal((double)0, (float)0)), bool>::value), "");
293    static_assert((std::is_same<decltype(islessequal((double)0, (double)0)), bool>::value), "");
294    static_assert((std::is_same<decltype(islessequal((double)0, (long double)0)), bool>::value), "");
295    static_assert((std::is_same<decltype(islessequal((long double)0, (float)0)), bool>::value), "");
296    static_assert((std::is_same<decltype(islessequal((long double)0, (double)0)), bool>::value), "");
297    static_assert((std::is_same<decltype(islessequal((long double)0, (long double)0)), bool>::value), "");
298    assert(islessequal(-1.0, 0.F) == true);
299}
300
301void test_islessgreater()
302{
303    static_assert((std::is_same<decltype(islessgreater((float)0, (float)0)), bool>::value), "");
304    static_assert((std::is_same<decltype(islessgreater((float)0, (double)0)), bool>::value), "");
305    static_assert((std::is_same<decltype(islessgreater((float)0, (long double)0)), bool>::value), "");
306    static_assert((std::is_same<decltype(islessgreater((double)0, (float)0)), bool>::value), "");
307    static_assert((std::is_same<decltype(islessgreater((double)0, (double)0)), bool>::value), "");
308    static_assert((std::is_same<decltype(islessgreater((double)0, (long double)0)), bool>::value), "");
309    static_assert((std::is_same<decltype(islessgreater((long double)0, (float)0)), bool>::value), "");
310    static_assert((std::is_same<decltype(islessgreater((long double)0, (double)0)), bool>::value), "");
311    static_assert((std::is_same<decltype(islessgreater((long double)0, (long double)0)), bool>::value), "");
312    assert(islessgreater(-1.0, 0.F) == true);
313}
314
315void test_isunordered()
316{
317    static_assert((std::is_same<decltype(isunordered((float)0, (float)0)), bool>::value), "");
318    static_assert((std::is_same<decltype(isunordered((float)0, (double)0)), bool>::value), "");
319    static_assert((std::is_same<decltype(isunordered((float)0, (long double)0)), bool>::value), "");
320    static_assert((std::is_same<decltype(isunordered((double)0, (float)0)), bool>::value), "");
321    static_assert((std::is_same<decltype(isunordered((double)0, (double)0)), bool>::value), "");
322    static_assert((std::is_same<decltype(isunordered((double)0, (long double)0)), bool>::value), "");
323    static_assert((std::is_same<decltype(isunordered((long double)0, (float)0)), bool>::value), "");
324    static_assert((std::is_same<decltype(isunordered((long double)0, (double)0)), bool>::value), "");
325    static_assert((std::is_same<decltype(isunordered((long double)0, (long double)0)), bool>::value), "");
326    assert(isunordered(-1.0, 0.F) == false);
327}
328
329void test_acosh()
330{
331    static_assert((std::is_same<decltype(acosh((double)0)), double>::value), "");
332    static_assert((std::is_same<decltype(acoshf(0)), float>::value), "");
333    static_assert((std::is_same<decltype(acoshl(0)), long double>::value), "");
334    assert(acosh(1) == 0);
335}
336
337void test_asinh()
338{
339    static_assert((std::is_same<decltype(asinh((double)0)), double>::value), "");
340    static_assert((std::is_same<decltype(asinhf(0)), float>::value), "");
341    static_assert((std::is_same<decltype(asinhl(0)), long double>::value), "");
342    assert(asinh(0) == 0);
343}
344
345void test_atanh()
346{
347    static_assert((std::is_same<decltype(atanh((double)0)), double>::value), "");
348    static_assert((std::is_same<decltype(atanhf(0)), float>::value), "");
349    static_assert((std::is_same<decltype(atanhl(0)), long double>::value), "");
350    assert(atanh(0) == 0);
351}
352
353void test_cbrt()
354{
355    static_assert((std::is_same<decltype(cbrt((double)0)), double>::value), "");
356    static_assert((std::is_same<decltype(cbrtf(0)), float>::value), "");
357    static_assert((std::is_same<decltype(cbrtl(0)), long double>::value), "");
358    assert(cbrt(1) == 1);
359}
360
361void test_copysign()
362{
363    static_assert((std::is_same<decltype(copysign((double)0, (double)0)), double>::value), "");
364    static_assert((std::is_same<decltype(copysignf(0,0)), float>::value), "");
365    static_assert((std::is_same<decltype(copysignl(0,0)), long double>::value), "");
366    assert(copysign(1,1) == 1);
367}
368
369void test_erf()
370{
371    static_assert((std::is_same<decltype(erf((double)0)), double>::value), "");
372    static_assert((std::is_same<decltype(erff(0)), float>::value), "");
373    static_assert((std::is_same<decltype(erfl(0)), long double>::value), "");
374    assert(erf(0) == 0);
375}
376
377void test_erfc()
378{
379    static_assert((std::is_same<decltype(erfc((double)0)), double>::value), "");
380    static_assert((std::is_same<decltype(erfcf(0)), float>::value), "");
381    static_assert((std::is_same<decltype(erfcl(0)), long double>::value), "");
382    assert(erfc(0) == 1);
383}
384
385void test_exp2()
386{
387    static_assert((std::is_same<decltype(exp2((double)0)), double>::value), "");
388    static_assert((std::is_same<decltype(exp2f(0)), float>::value), "");
389    static_assert((std::is_same<decltype(exp2l(0)), long double>::value), "");
390    assert(exp2(1) == 2);
391}
392
393void test_expm1()
394{
395    static_assert((std::is_same<decltype(expm1((double)0)), double>::value), "");
396    static_assert((std::is_same<decltype(expm1f(0)), float>::value), "");
397    static_assert((std::is_same<decltype(expm1l(0)), long double>::value), "");
398    assert(expm1(0) == 0);
399}
400
401void test_fdim()
402{
403    static_assert((std::is_same<decltype(fdim((double)0, (double)0)), double>::value), "");
404    static_assert((std::is_same<decltype(fdimf(0,0)), float>::value), "");
405    static_assert((std::is_same<decltype(fdiml(0,0)), long double>::value), "");
406    assert(fdim(1,0) == 1);
407}
408
409void test_fma()
410{
411    static_assert((std::is_same<decltype(fma((double)0, (double)0,  (double)0)), double>::value), "");
412    static_assert((std::is_same<decltype(fmaf(0,0,0)), float>::value), "");
413    static_assert((std::is_same<decltype(fmal(0,0,0)), long double>::value), "");
414    assert(fma(1,1,1) == 2);
415}
416
417void test_fmax()
418{
419    static_assert((std::is_same<decltype(fmax((double)0, (double)0)), double>::value), "");
420    static_assert((std::is_same<decltype(fmaxf(0,0)), float>::value), "");
421    static_assert((std::is_same<decltype(fmaxl(0,0)), long double>::value), "");
422    assert(fmax(1,0) == 1);
423}
424
425void test_fmin()
426{
427    static_assert((std::is_same<decltype(fmin((double)0, (double)0)), double>::value), "");
428    static_assert((std::is_same<decltype(fminf(0,0)), float>::value), "");
429    static_assert((std::is_same<decltype(fminl(0,0)), long double>::value), "");
430    assert(fmin(1,0) == 0);
431}
432
433void test_hypot()
434{
435    static_assert((std::is_same<decltype(hypot((double)0, (double)0)), double>::value), "");
436    static_assert((std::is_same<decltype(hypotf(0,0)), float>::value), "");
437    static_assert((std::is_same<decltype(hypotl(0,0)), long double>::value), "");
438    assert(hypot(3,4) == 5);
439}
440
441void test_ilogb()
442{
443    static_assert((std::is_same<decltype(ilogb((double)0)), int>::value), "");
444    static_assert((std::is_same<decltype(ilogbf(0)), int>::value), "");
445    static_assert((std::is_same<decltype(ilogbl(0)), int>::value), "");
446    assert(ilogb(1) == 0);
447}
448
449void test_lgamma()
450{
451    static_assert((std::is_same<decltype(lgamma((double)0)), double>::value), "");
452    static_assert((std::is_same<decltype(lgammaf(0)), float>::value), "");
453    static_assert((std::is_same<decltype(lgammal(0)), long double>::value), "");
454    assert(lgamma(1) == 0);
455}
456
457void test_llrint()
458{
459    static_assert((std::is_same<decltype(llrint((double)0)), long long>::value), "");
460    static_assert((std::is_same<decltype(llrintf(0)), long long>::value), "");
461    static_assert((std::is_same<decltype(llrintl(0)), long long>::value), "");
462    assert(llrint(1) == 1LL);
463}
464
465void test_llround()
466{
467    static_assert((std::is_same<decltype(llround((double)0)), long long>::value), "");
468    static_assert((std::is_same<decltype(llroundf(0)), long long>::value), "");
469    static_assert((std::is_same<decltype(llroundl(0)), long long>::value), "");
470    assert(llround(1) == 1LL);
471}
472
473void test_log1p()
474{
475    static_assert((std::is_same<decltype(log1p((double)0)), double>::value), "");
476    static_assert((std::is_same<decltype(log1pf(0)), float>::value), "");
477    static_assert((std::is_same<decltype(log1pl(0)), long double>::value), "");
478    assert(log1p(0) == 0);
479}
480
481void test_log2()
482{
483    static_assert((std::is_same<decltype(log2((double)0)), double>::value), "");
484    static_assert((std::is_same<decltype(log2f(0)), float>::value), "");
485    static_assert((std::is_same<decltype(log2l(0)), long double>::value), "");
486    assert(log2(1) == 0);
487}
488
489void test_logb()
490{
491    static_assert((std::is_same<decltype(logb((double)0)), double>::value), "");
492    static_assert((std::is_same<decltype(logbf(0)), float>::value), "");
493    static_assert((std::is_same<decltype(logbl(0)), long double>::value), "");
494    assert(logb(1) == 0);
495}
496
497void test_lrint()
498{
499    static_assert((std::is_same<decltype(lrint((double)0)), long>::value), "");
500    static_assert((std::is_same<decltype(lrintf(0)), long>::value), "");
501    static_assert((std::is_same<decltype(lrintl(0)), long>::value), "");
502    assert(lrint(1) == 1L);
503}
504
505void test_lround()
506{
507    static_assert((std::is_same<decltype(lround((double)0)), long>::value), "");
508    static_assert((std::is_same<decltype(lroundf(0)), long>::value), "");
509    static_assert((std::is_same<decltype(lroundl(0)), long>::value), "");
510    assert(lround(1) == 1L);
511}
512
513void test_nan()
514{
515    static_assert((std::is_same<decltype(nan("")), double>::value), "");
516    static_assert((std::is_same<decltype(nanf("")), float>::value), "");
517    static_assert((std::is_same<decltype(nanl("")), long double>::value), "");
518}
519
520void test_nearbyint()
521{
522    static_assert((std::is_same<decltype(nearbyint((double)0)), double>::value), "");
523    static_assert((std::is_same<decltype(nearbyintf(0)), float>::value), "");
524    static_assert((std::is_same<decltype(nearbyintl(0)), long double>::value), "");
525    assert(nearbyint(1) == 1);
526}
527
528void test_nextafter()
529{
530    static_assert((std::is_same<decltype(nextafter((double)0, (double)0)), double>::value), "");
531    static_assert((std::is_same<decltype(nextafterf(0,0)), float>::value), "");
532    static_assert((std::is_same<decltype(nextafterl(0,0)), long double>::value), "");
533    assert(nextafter(0,1) == hexfloat<double>(0x1, 0, -1074));
534}
535
536void test_nexttoward()
537{
538    static_assert((std::is_same<decltype(nexttoward((double)0, (long double)0)), double>::value), "");
539    static_assert((std::is_same<decltype(nexttowardf(0, (long double)0)), float>::value), "");
540    static_assert((std::is_same<decltype(nexttowardl(0, (long double)0)), long double>::value), "");
541    assert(nexttoward(0, 1) == hexfloat<double>(0x1, 0, -1074));
542}
543
544void test_remainder()
545{
546    static_assert((std::is_same<decltype(remainder((double)0, (double)0)), double>::value), "");
547    static_assert((std::is_same<decltype(remainderf(0,0)), float>::value), "");
548    static_assert((std::is_same<decltype(remainderl(0,0)), long double>::value), "");
549    static_assert((std::is_same<decltype(remainder((int)0, (int)0)), double>::value), "");
550    assert(remainder(0.5,1) == 0.5);
551}
552
553void test_remquo()
554{
555    int ip;
556    static_assert((std::is_same<decltype(remquo((double)0, (double)0, &ip)), double>::value), "");
557    static_assert((std::is_same<decltype(remquof(0,0, &ip)), float>::value), "");
558    static_assert((std::is_same<decltype(remquol(0,0, &ip)), long double>::value), "");
559    assert(remquo(0.5,1, &ip) == 0.5);
560}
561
562void test_rint()
563{
564    static_assert((std::is_same<decltype(rint((double)0)), double>::value), "");
565    static_assert((std::is_same<decltype(rintf(0)), float>::value), "");
566    static_assert((std::is_same<decltype(rintl(0)), long double>::value), "");
567    assert(rint(1) == 1);
568}
569
570void test_round()
571{
572    static_assert((std::is_same<decltype(round((double)0)), double>::value), "");
573    static_assert((std::is_same<decltype(roundf(0)), float>::value), "");
574    static_assert((std::is_same<decltype(roundl(0)), long double>::value), "");
575    assert(round(1) == 1);
576}
577
578void test_scalbln()
579{
580    static_assert((std::is_same<decltype(scalbln((double)0, (long)0)), double>::value), "");
581    static_assert((std::is_same<decltype(scalblnf(0, (long)0)), float>::value), "");
582    static_assert((std::is_same<decltype(scalblnl(0, (long)0)), long double>::value), "");
583    assert(scalbln(1, 1) == 2);
584}
585
586void test_scalbn()
587{
588    static_assert((std::is_same<decltype(scalbn((double)0, (int)0)), double>::value), "");
589    static_assert((std::is_same<decltype(scalbnf(0, (int)0)), float>::value), "");
590    static_assert((std::is_same<decltype(scalbnl(0, (int)0)), long double>::value), "");
591    assert(scalbn(1, 1) == 2);
592}
593
594void test_tgamma()
595{
596    static_assert((std::is_same<decltype(tgamma((double)0)), double>::value), "");
597    static_assert((std::is_same<decltype(tgammaf(0)), float>::value), "");
598    static_assert((std::is_same<decltype(tgammal(0)), long double>::value), "");
599    assert(tgamma(1) == 1);
600}
601
602void test_trunc()
603{
604    static_assert((std::is_same<decltype(trunc((double)0)), double>::value), "");
605    static_assert((std::is_same<decltype(truncf(0)), float>::value), "");
606    static_assert((std::is_same<decltype(truncl(0)), long double>::value), "");
607    assert(trunc(1) == 1);
608}
609
610int main()
611{
612    test_acos();
613    test_asin();
614    test_atan();
615    test_atan2();
616    test_ceil();
617    test_cos();
618    test_cosh();
619    test_exp();
620    test_fabs();
621    test_floor();
622    test_fmod();
623    test_frexp();
624    test_ldexp();
625    test_log();
626    test_log10();
627    test_modf();
628    test_pow();
629    test_sin();
630    test_sinh();
631    test_sqrt();
632    test_tan();
633    test_tanh();
634    test_signbit();
635    test_fpclassify();
636    test_isfinite();
637    test_isinf();
638    test_isnan();
639    test_isnormal();
640    test_isgreater();
641    test_isgreaterequal();
642    test_isless();
643    test_islessequal();
644    test_islessgreater();
645    test_isunordered();
646    test_acosh();
647    test_asinh();
648    test_atanh();
649    test_cbrt();
650    test_copysign();
651    test_erf();
652    test_erfc();
653    test_exp2();
654    test_expm1();
655    test_fdim();
656    test_fma();
657    test_fmax();
658    test_fmin();
659    test_hypot();
660    test_ilogb();
661    test_lgamma();
662    test_llrint();
663    test_llround();
664    test_log1p();
665    test_log2();
666    test_logb();
667    test_lrint();
668    test_lround();
669    test_nan();
670    test_nearbyint();
671    test_nextafter();
672    test_nexttoward();
673    test_remainder();
674    test_remquo();
675    test_rint();
676    test_round();
677    test_scalbln();
678    test_scalbn();
679    test_tgamma();
680    test_trunc();
681}
682