1 #define _XOPEN_SOURCE 600
12 #include "basic-complex.h"
17 /*******************************************************************************
19 ******************************************************************************/
21 dom_acos(long double x)
23 return (x >= -1.0 && x <= 1.0);
27 dom_acosh(long double x)
33 dom_asin(long double x)
35 return (x >= -1.0 && x <= 1.0);
39 dom_asinh(long double x)
45 dom_atan(long double x)
51 dom_atan2(long double y, long double x)
53 return (fpclassify(x) != FP_ZERO);
57 dom_atanh(long double x)
59 return (x > -1.0 && x < 1.0);
63 dom_cbrt(long double x)
69 dom_ceil(long double x)
75 dom_cos(long double x)
81 dom_cosh(long double x)
87 dom_erf(long double x)
93 dom_erfc(long double x)
99 dom_exp(long double x)
105 dom_expm1(long double x)
111 dom_exp2(long double x)
117 dom_fabs(long double x)
123 dom_floor(long double x)
129 dom_fmod(long double x, long double y)
131 return (fpclassify(y) != FP_ZERO);
135 dom_hypot(long double x, long double y)
141 dom_j0(long double x)
147 dom_j1(long double x)
153 dom_log(long double x)
159 dom_log1p(long double x)
165 dom_log10(long double x)
171 dom_log2(long double x)
177 dom_remainder(long double x, long double y)
179 return (fpclassify(y) != FP_ZERO);
183 dom_rint(long double x)
189 dom_round(long double x)
195 dom_sin(long double x)
201 dom_sinh(long double x)
207 dom_sqrt(long double x)
213 dom_tan(long double x)
215 return (fabs(x - M_PI_2) > 1E-10);
219 dom_tanh(long double x)
225 dom_pow(long double x, long double y)
227 return (x >= 0.0 || (floor(y) == y));
231 dom_tgamma(long double x)
233 return (x > 0.0 || (floor(x) != x));
237 dom_trunc(long double x)
243 dom_y0(long double x)
249 dom_y1(long double x)
255 dom_yn(long double x, long double y)
260 /*******************************************************************************
262 ******************************************************************************/
264 dom_cabs(long double complex z)
270 dom_cacos(long double complex z)
276 dom_cacosh(long double complex z)
282 dom_carg(long double complex z)
289 dom_casin(long double complex z)
295 dom_casinh(long double complex z)
301 dom_catan(long double complex z)
307 dom_catanh(long double complex z)
313 dom_ccos(long double complex z)
319 dom_cexp(long double complex z)
325 dom_clog(long double complex z)
327 long_double_complex ldcz = { .z = z };
329 return (fpclassify(ldcz.parts[0]) != FP_ZERO ||
330 fpclassify(ldcz.parts[1]) != FP_ZERO);
334 dom_conj(long double complex z)
340 dom_cpow(long double complex z, long double complex w)
347 dom_cproj(long double complex z)
353 dom_csin(long double complex z)
359 dom_csinh(long double complex z)
365 dom_csqrt(long double complex z)
371 dom_ctan(long double complex z)
377 /*******************************************************************************
378 * Basic arithmetic of complex numbers
379 ******************************************************************************/
381 dom_cadd(long double complex z, long double complex w)
387 dom_csub(long double complex z, long double complex w)
392 dom_cmul(long double complex z, long double complex w)
397 dom_cdiv(long double complex z, long double complex w)
399 long_double_complex ldcw = { .z = w };
401 return (fpclassify(ldcw.parts[0]) != FP_ZERO ||
402 fpclassify(ldcw.parts[1]) != FP_ZERO);
405 dom_cneg(long double complex z)
411 * ISO/IEC 9899:1999 - 6.7.8.10 - Initialization
413 * If an object that has static storage duration is not initialized explicitly,
414 * then [...] if it has pointer type, it is initialized to a null pointer.
416 * Therefore, we can safely assume that f_namel, f_mpfr or f_mpc is NULL,
417 * if autoconf didn't define the corresponding HAVE_XYZ symbol for us.
419 static const struct fentry
421 /*******************************************************************************
423 ******************************************************************************/
432 .f_libml_real = acosl,
444 .f_libm_real = acosh,
447 .f_libml_real = acoshl,
449 .f_mpfr = mpfr_acosh,
462 .f_libml_real = asinl,
474 .f_libm_real = asinh,
477 .f_libml_real = asinhl,
479 .f_mpfr = mpfr_asinh,
492 .f_libml_real = atanl,
504 .f_libm_real = atan2,
507 .f_libml_real = atan2l,
509 .f_mpfr = mpfr_atan2,
519 .f_libm_real = atanh,
522 .f_libml_real = atanhl,
524 .f_mpfr = mpfr_atanh,
537 .f_libml_real = cbrtl,
552 .f_libml_real = ceill,
567 .f_libml_real = cosl,
582 .f_libml_real = coshl,
597 .f_libml_real = expl,
609 .f_libm_real = expm1,
612 .f_libml_real = expm1l,
614 .f_mpfr = mpfr_expm1,
627 .f_libml_real = exp2l,
642 .f_libml_real = erfl,
657 .f_libml_real = erfcl,
672 .f_libml_real = fabsl,
684 .f_libm_real = floor,
687 .f_libml_real = floorl,
689 .f_mpfr = mpfr_floor,
702 .f_libml_real = fmodl,
714 .f_libm_real = hypot,
717 .f_libml_real = hypotl,
719 .f_mpfr = mpfr_hypot,
763 .f_libml_real = logl,
775 .f_libm_real = log1p,
778 .f_libml_real = log1pl,
780 .f_mpfr = mpfr_log1p,
790 .f_libm_real = log10,
793 .f_libml_real = log10l,
795 .f_mpfr = mpfr_log10,
808 .f_libml_real = log2l,
816 #ifdef HAVE_REMAINDER
819 .f_name = "remainder",
820 .f_libm_real = remainder,
821 #ifdef HAVE_REMAINDERL
822 .f_namel = "remainderl",
823 .f_libml_real = remainderl,
825 .f_mpfr = mpfr_remainder,
826 .f_u.fp2 = dom_remainder
838 .f_libml_real = rintl,
850 .f_libm_real = round,
853 .f_libml_real = roundl,
855 .f_mpfr = mpfr_round,
868 .f_libml_real = sinl,
883 .f_libml_real = sinhl,
898 .f_libml_real = sqrtl,
913 .f_libml_real = powl,
928 .f_libml_real = tanl,
943 .f_libml_real = tanhl,
955 .f_libm_real = tgamma,
957 .f_namel = "tgammal",
958 .f_libml_real = tgammal,
960 .f_mpfr = mpfr_gamma,
961 .f_u.fp1 = dom_tgamma
970 .f_libm_real = trunc,
973 .f_libml_real = truncl,
975 .f_mpfr = mpfr_trunc,
1013 /*******************************************************************************
1014 * Complex arithmetic
1015 ******************************************************************************/
1021 .f_libm_complex = cabs,
1024 .f_libml_complex = cabsl,
1027 .f_uc.fp1 = dom_cabs
1036 .f_libm_complex = cacos,
1038 .f_namel = "cacosl",
1039 .f_libml_complex = cacosl,
1042 .f_uc.fp1 = dom_cacos
1051 .f_libm_complex = cacosh,
1053 .f_namel = "cacoshl",
1054 .f_libml_complex = cacoshl,
1057 .f_uc.fp1 = dom_cacosh
1066 .f_libm_complex = carg,
1069 .f_libml_complex = cargl,
1072 .f_uc.fp1 = dom_carg
1081 .f_libm_complex = casin,
1083 .f_namel = "casinl",
1084 .f_libml_complex = casinl,
1087 .f_uc.fp1 = dom_casin
1096 .f_libm_complex = casinh,
1098 .f_namel = "casinhl",
1099 .f_libml_complex = casinhl,
1102 .f_uc.fp1 = dom_casinh
1111 .f_libm_complex = catan,
1113 .f_namel = "catanl",
1114 .f_libml_complex = catanl,
1117 .f_uc.fp1 = dom_catan
1126 .f_libm_complex = catanh,
1128 .f_namel = "catanhl",
1129 .f_libml_complex = catanhl,
1132 .f_uc.fp1 = dom_catanh
1141 .f_libm_complex = ccos,
1144 .f_libml_complex = ccosl,
1147 .f_uc.fp1 = dom_ccos
1156 .f_libm_complex = cexp,
1159 .f_libml_complex = cexpl,
1162 .f_uc.fp1 = dom_cexp
1171 .f_libm_complex = clog,
1174 .f_libml_complex = clogl,
1177 .f_uc.fp1 = dom_clog
1186 .f_libm_complex = conj,
1189 .f_libml_complex = conjl,
1192 .f_uc.fp1 = dom_conj
1201 .f_libm_complex = cpow,
1204 .f_libml_complex = cpowl,
1207 .f_uc.fp1 = dom_cpow
1216 .f_libm_complex = cproj,
1218 .f_namel = "cprojl",
1219 .f_libml_complex = cprojl,
1222 .f_uc.fp1 = dom_cproj
1231 .f_libm_complex = csin,
1234 .f_libml_complex = csinl,
1237 .f_uc.fp1 = dom_csin
1246 .f_libm_complex = csinh,
1248 .f_namel = "csinhl",
1249 .f_libml_complex = csinhl,
1252 .f_uc.fp1 = dom_csinh
1261 .f_libm_complex = csqrt,
1263 .f_namel = "csqrtl",
1264 .f_libml_complex = csqrtl,
1267 .f_uc.fp1 = dom_csqrt
1276 .f_libm_complex = ctan,
1279 .f_libml_complex = ctanl,
1282 .f_uc.fp1 = dom_ctan
1286 /*******************************************************************************
1287 * Basic arithmetic of complex numbers
1288 ******************************************************************************/
1293 .f_libm_complex = cadd,
1295 .f_libml_complex = caddl,
1297 .f_uc.fp2 = dom_cadd
1304 .f_libm_complex = csub,
1306 .f_libml_complex = csubl,
1308 .f_uc.fp2 = dom_csub
1315 .f_libm_complex = cmul,
1317 .f_libml_complex = cmull,
1319 .f_uc.fp2 = dom_cmul
1326 .f_libm_complex = cdiv,
1328 .f_libml_complex = cdivl,
1330 .f_uc.fp2 = dom_cdiv
1337 .f_libm_complex = cneg,
1339 .f_libml_complex = cnegl,
1341 .f_uc.fp2 = dom_cneg
1345 const int fsize = sizeof(ftable) / sizeof(ftable[0]);
1348 assertfunction(const struct fentry *f)
1351 assert(f->f_narg == 1 || f->f_narg == 2);
1355 assert(f->f_u.fp1 || f->f_u.fp2);
1356 assert(f->f_libm_real);
1358 assert(f->f_libml_real);
1362 assert(f->f_uc.fp1 || f->f_u.fp2);
1363 assert(f->f_libm_complex);
1365 assert(f->f_libml_complex);
1368 assert(f->f_mpfr || f->f_mpc);
1371 const struct fentry *
1372 getfunctionbyidx(int idx)
1374 assert(0 <= idx && idx < fsize);
1376 return (&ftable[idx]);
1379 const struct fentry *
1380 getfunctionbyname(const char *fname)
1382 const struct fentry *f;
1387 for (i = 0; i < fsize; i++) {
1389 if ((strcmp(fname, f->f_name ) == 0) ||
1390 (f->f_namel && strcmp(fname, f->f_namel) == 0)) {
1400 printfunctions(void)
1402 const struct fentry *f;
1405 for (i = 0, cnt = 0; i < fsize; i++, cnt++) {
1407 printf("%-10s ", f->f_name);
1412 printf("%-10s ", f->f_namel);
1418 /* If cnt % 5 was equal to 4, then now it's equal to 0 */