// Copyright Naoki Shibata and contributors 2010 - 2021. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // This define is needed to prevent the `execvpe` function to raise a // warning at compile time. For more information, see // https://linux.die.net/man/3/execvp. #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "misc.h" #include "qtesterutil.h" void stop(char *mes) { fprintf(stderr, "%s\n", mes); exit(-1); } int ptoc[2], ctop[2]; int pid; FILE *fpctop; extern char **environ; void startChild(const char *path, char *const argv[]) { pipe(ptoc); pipe(ctop); pid = fork(); assert(pid != -1); if (pid == 0) { // child process char buf0[1], buf1[1]; close(ptoc[1]); close(ctop[0]); fflush(stdin); fflush(stdout); if (dup2(ptoc[0], fileno(stdin)) == -1) exit(-1); if (dup2(ctop[1], fileno(stdout)) == -1) exit(-1); setvbuf(stdin, buf0, _IONBF,0); setvbuf(stdout, buf1, _IONBF,0); fflush(stdin); fflush(stdout); #if !defined(__APPLE__) && !defined(__FreeBSD__) execvpe(path, argv, environ); #else execvp(path, argv); #endif fprintf(stderr, "execvp in startChild : %s\n", strerror(errno)); exit(-1); } // parent process close(ptoc[0]); close(ctop[1]); } // #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) typedef union { Sleef_quad q; struct { uint64_t h, l; }; } cnv128; #else typedef union { Sleef_quad q; struct { uint64_t l, h; }; } cnv128; #endif #define child_q_q(funcStr, arg) do { \ char str[256]; \ cnv128 c; \ c.q = arg; \ sprintf(str, funcStr " %" PRIx64 ":%" PRIx64 "\n", c.h, c.l); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ sscanf(str, "%" PRIx64 ":%" PRIx64, &c.h, &c.l); \ return c.q; \ } while(0) #define child_q2_q(funcStr, arg) do { \ char str[256]; \ cnv128 c0, c1; \ c0.q = arg; \ sprintf(str, funcStr " %" PRIx64 ":%" PRIx64 "\n", c0.h, c0.l); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ sscanf(str, "%" PRIx64 ":%" PRIx64 " %" PRIx64 ":%" PRIx64 , &c0.h, &c0.l, &c1.h, &c1.l); \ Sleef_quad2 ret = { c0.q, c1.q }; \ return ret; \ } while(0) #define child_q_q_q(funcStr, arg0, arg1) do { \ char str[256]; \ cnv128 c0, c1; \ c0.q = arg0; \ c1.q = arg1; \ sprintf(str, funcStr " %" PRIx64 ":%" PRIx64 " %" PRIx64 ":%" PRIx64 "\n", c0.h, c0.l, c1.h, c1.l); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ sscanf(str, "%" PRIx64 ":%" PRIx64, &c0.h, &c0.l); \ return c0.q; \ } while(0) #define child_q_q_q_q(funcStr, arg0, arg1, arg2) do { \ char str[256]; \ cnv128 c0, c1, c2; \ c0.q = arg0; \ c1.q = arg1; \ c2.q = arg2; \ sprintf(str, funcStr " %" PRIx64 ":%" PRIx64 " %" PRIx64 ":%" PRIx64 " %" PRIx64 ":%" PRIx64 "\n", c0.h, c0.l, c1.h, c1.l, c2.h, c2.l); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ sscanf(str, "%" PRIx64 ":%" PRIx64, &c0.h, &c0.l); \ return c0.q; \ } while(0) #define child_i_q(funcStr, arg0) do { \ char str[256]; \ cnv128 c0; \ c0.q = arg0; \ sprintf(str, funcStr " %" PRIx64 ":%" PRIx64 "\n", c0.h, c0.l); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ int i; \ sscanf(str, "%d", &i); \ return i; \ } while(0) #define child_i_q_q(funcStr, arg0, arg1) do { \ char str[256]; \ cnv128 c0, c1; \ c0.q = arg0; \ c1.q = arg1; \ sprintf(str, funcStr " %" PRIx64 ":%" PRIx64 " %" PRIx64 ":%" PRIx64 "\n", c0.h, c0.l, c1.h, c1.l); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ int i; \ sscanf(str, "%d", &i); \ return i; \ } while(0) #define child_q_q_i(funcStr, arg0, arg1) do { \ char str[256]; \ cnv128 c; \ c.q = arg0; \ sprintf(str, funcStr " %" PRIx64 ":%" PRIx64 " %d\n", c.h, c.l, arg1); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ sscanf(str, "%" PRIx64 ":%" PRIx64, &c.h, &c.l); \ return c.q; \ } while(0) #define child_d_q(funcStr, arg) do { \ char str[256]; \ cnv128 c; \ c.q = arg; \ sprintf(str, funcStr " %" PRIx64 ":%" PRIx64 "\n", c.h, c.l); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ uint64_t u; \ sscanf(str, "%" PRIx64, &u); \ return u2d(u); \ } while(0) #define child_q_d(funcStr, arg) do { \ char str[256]; \ sprintf(str, funcStr " %" PRIx64 "\n", d2u(arg)); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ cnv128 c; \ sscanf(str, "%" PRIx64 ":%" PRIx64, &c.h, &c.l); \ return c.q; \ } while(0) #define child_m_q(funcStr, arg) do { \ char str[256]; \ cnv128 c; \ c.q = arg; \ sprintf(str, funcStr " %" PRIx64 ":%" PRIx64 "\n", c.h, c.l); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ uint64_t u; \ sscanf(str, "%" PRIx64, &u); \ return u; \ } while(0) #define child_q_m(funcStr, arg) do { \ char str[256]; \ sprintf(str, funcStr " %" PRIx64 "\n", arg); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ cnv128 c; \ sscanf(str, "%" PRIx64 ":%" PRIx64, &c.h, &c.l); \ return c.q; \ } while(0) #define child_q_q_pi(funcStr, arg) do { \ char str[256]; \ cnv128 c; \ c.q = arg; \ sprintf(str, funcStr " %" PRIx64 ":%" PRIx64 "\n", c.h, c.l); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ int i; \ sscanf(str, "%" PRIx64 ":%" PRIx64 " %d", &c.h, &c.l, &i); \ *ptr = i; \ return c.q; \ } while(0) #define child_q_q_pq(funcStr, arg) do { \ char str[256]; \ cnv128 c0, c1; \ c0.q = arg; \ sprintf(str, funcStr " %" PRIx64 ":%" PRIx64 "\n", c0.h, c0.l); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ sscanf(str, "%" PRIx64 ":%" PRIx64 " %" PRIx64 ":%" PRIx64, &c0.h, &c0.l, &c1.h, &c1.l); \ *ptr = c1.q; \ return c0.q; \ } while(0) #define child_q_str(funcStr, arg) do { \ char str[256]; \ sprintf(str, funcStr " %s\n", arg); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ cnv128 c; \ sscanf(str, "%" PRIx64 ":%" PRIx64, &c.h, &c.l); \ return c.q; \ } while(0) #define child_str_q(funcStr, ret, arg) do { \ char str[256]; \ cnv128 c; \ c.q = arg; \ sprintf(str, funcStr " %" PRIx64 ":%" PRIx64 "\n", c.h, c.l); \ write(ptoc[1], str, strlen(str)); \ if (fgets(str, 255, fpctop) == NULL) stop("child " funcStr); \ sscanf(str, "%63s", ret); \ } while(0) Sleef_quad child_addq_u05(Sleef_quad x, Sleef_quad y) { child_q_q_q("addq_u05", x, y); } Sleef_quad child_subq_u05(Sleef_quad x, Sleef_quad y) { child_q_q_q("subq_u05", x, y); } Sleef_quad child_mulq_u05(Sleef_quad x, Sleef_quad y) { child_q_q_q("mulq_u05", x, y); } Sleef_quad child_divq_u05(Sleef_quad x, Sleef_quad y) { child_q_q_q("divq_u05", x, y); } Sleef_quad child_negq(Sleef_quad x) { child_q_q("negq", x); } int child_icmpltq(Sleef_quad x, Sleef_quad y) { child_i_q_q("icmpltq", x, y); } int child_icmpgtq(Sleef_quad x, Sleef_quad y) { child_i_q_q("icmpgtq", x, y); } int child_icmpleq(Sleef_quad x, Sleef_quad y) { child_i_q_q("icmpleq", x, y); } int child_icmpgeq(Sleef_quad x, Sleef_quad y) { child_i_q_q("icmpgeq", x, y); } int child_icmpeqq(Sleef_quad x, Sleef_quad y) { child_i_q_q("icmpeqq", x, y); } int child_icmpneq(Sleef_quad x, Sleef_quad y) { child_i_q_q("icmpneq", x, y); } int child_icmpq (Sleef_quad x, Sleef_quad y) { child_i_q_q("icmpq" , x, y); } int child_iunordq(Sleef_quad x, Sleef_quad y) { child_i_q_q("iunordq", x, y); } Sleef_quad child_cast_from_doubleq(double x) { child_q_d("cast_from_doubleq", x); } double child_cast_to_doubleq(Sleef_quad x) { child_d_q("cast_to_doubleq", x); } Sleef_quad child_cast_from_int64q(int64_t x) { child_q_m("cast_from_int64q", x); } int64_t child_cast_to_int64q(Sleef_quad x) { child_m_q("cast_to_int64q", x); } Sleef_quad child_cast_from_uint64q(uint64_t x) { child_q_m("cast_from_uint64q", x); } uint64_t child_cast_to_uint64q(Sleef_quad x) { child_m_q("cast_to_uint64q", x); } Sleef_quad child_strtoq(const char *s) { child_q_str("strtoq", s); } void child_snprintf_40Qg(char *ret, Sleef_quad x) { child_str_q("snprintf_40Qg", ret, x); } void child_snprintf_Qa(char *ret, Sleef_quad x) { child_str_q("snprintf_Qa", ret, x); } Sleef_quad child_sqrtq_u05(Sleef_quad x) { child_q_q("sqrtq_u05", x); } Sleef_quad child_cbrtq_u10(Sleef_quad x) { child_q_q("cbrtq_u10", x); } Sleef_quad child_sinq_u10(Sleef_quad x) { child_q_q("sinq_u10", x); } Sleef_quad child_cosq_u10(Sleef_quad x) { child_q_q("cosq_u10", x); } Sleef_quad child_tanq_u10(Sleef_quad x) { child_q_q("tanq_u10", x); } Sleef_quad child_asinq_u10(Sleef_quad x) { child_q_q("asinq_u10", x); } Sleef_quad child_acosq_u10(Sleef_quad x) { child_q_q("acosq_u10", x); } Sleef_quad child_atanq_u10(Sleef_quad x) { child_q_q("atanq_u10", x); } Sleef_quad child_atan2q_u10(Sleef_quad x, Sleef_quad y) { child_q_q_q("atan2q_u10", x, y); } Sleef_quad child_expq_u10(Sleef_quad x) { child_q_q("expq_u10", x); } Sleef_quad child_exp2q_u10(Sleef_quad x) { child_q_q("exp2q_u10", x); } Sleef_quad child_exp10q_u10(Sleef_quad x) { child_q_q("exp10q_u10", x); } Sleef_quad child_expm1q_u10(Sleef_quad x) { child_q_q("expm1q_u10", x); } Sleef_quad child_logq_u10(Sleef_quad x) { child_q_q("logq_u10", x); } Sleef_quad child_log2q_u10(Sleef_quad x) { child_q_q("log2q_u10", x); } Sleef_quad child_log10q_u10(Sleef_quad x) { child_q_q("log10q_u10", x); } Sleef_quad child_log1pq_u10(Sleef_quad x) { child_q_q("log1pq_u10", x); } Sleef_quad child_powq_u10(Sleef_quad x, Sleef_quad y) { child_q_q_q("powq_u10", x, y); } Sleef_quad child_sinhq_u10(Sleef_quad x) { child_q_q("sinhq_u10", x); } Sleef_quad child_coshq_u10(Sleef_quad x) { child_q_q("coshq_u10", x); } Sleef_quad child_tanhq_u10(Sleef_quad x) { child_q_q("tanhq_u10", x); } Sleef_quad child_asinhq_u10(Sleef_quad x) { child_q_q("asinhq_u10", x); } Sleef_quad child_acoshq_u10(Sleef_quad x) { child_q_q("acoshq_u10", x); } Sleef_quad child_atanhq_u10(Sleef_quad x) { child_q_q("atanhq_u10", x); } Sleef_quad child_fabsq(Sleef_quad x) { child_q_q("fabsq", x); } Sleef_quad child_copysignq(Sleef_quad x, Sleef_quad y) { child_q_q_q("copysignq", x, y); } Sleef_quad child_fmaxq(Sleef_quad x, Sleef_quad y) { child_q_q_q("fmaxq", x, y); } Sleef_quad child_fminq(Sleef_quad x, Sleef_quad y) { child_q_q_q("fminq", x, y); } Sleef_quad child_fdimq_u05(Sleef_quad x, Sleef_quad y) { child_q_q_q("fdimq_u05", x, y); } Sleef_quad child_fmodq(Sleef_quad x, Sleef_quad y) { child_q_q_q("fmodq", x, y); } Sleef_quad child_remainderq(Sleef_quad x, Sleef_quad y) { child_q_q_q("remainderq", x, y); } Sleef_quad child_frexpq(Sleef_quad x, int *ptr) { child_q_q_pi("frexpq", x); } Sleef_quad child_modfq(Sleef_quad x, Sleef_quad *ptr) { child_q_q_pq("modfq", x); } Sleef_quad child_hypotq_u05(Sleef_quad x, Sleef_quad y) { child_q_q_q("hypotq_u05", x, y); } Sleef_quad child_fmaq_u05(Sleef_quad x, Sleef_quad y, Sleef_quad z) { child_q_q_q_q("fmaq_u05", x, y, z); } Sleef_quad child_ldexpq(Sleef_quad x, int k) { child_q_q_i("ldexpq", x, k); } int child_ilogbq(Sleef_quad x) { child_i_q("ilogbq", x); } Sleef_quad child_truncq(Sleef_quad x) { child_q_q("truncq", x); } Sleef_quad child_floorq(Sleef_quad x) { child_q_q("floorq", x); } Sleef_quad child_ceilq(Sleef_quad x) { child_q_q("ceilq", x); } Sleef_quad child_roundq(Sleef_quad x) { child_q_q("roundq", x); } Sleef_quad child_rintq(Sleef_quad x) { child_q_q("rintq", x); } // #define cmpDenorm_q(mpfrFunc, childFunc, argx) do { \ mpfr_set_f128(frx, argx, GMP_RNDN); \ mpfrFunc(frz, frx, GMP_RNDN); \ Sleef_quad t = childFunc(argx); \ double u = countULPf128(t, frz, 1); \ if (u >= 10) { \ fprintf(stderr, "\narg = %s\ntest = %s\ncorrect = %s\nulp = %g\n", \ sprintf128(argx), sprintf128(t), sprintfr(frz), u); \ success = 0; \ break; \ } \ } while(0) #define cmpDenormNMR_q(mpfrFunc, childFunc, argx) do { \ mpfr_set_f128(frx, argx, GMP_RNDN); \ mpfrFunc(frz, frx); \ Sleef_quad t = childFunc(argx); \ double u = countULPf128(t, frz, 1); \ if (u >= 10) { \ fprintf(stderr, "\narg = %s\ntest = %s\ncorrect = %s\nulp = %g\n", \ sprintf128(argx), sprintf128(t), sprintfr(frz), u); \ success = 0; \ break; \ } \ } while(0) #define cmpDenorm_q_q(mpfrFunc, childFunc, argx, argy) do { \ mpfr_set_f128(frx, argx, GMP_RNDN); \ mpfr_set_f128(fry, argy, GMP_RNDN); \ mpfrFunc(frz, frx, fry, GMP_RNDN); \ Sleef_quad t = childFunc(argx, argy); \ double u = countULPf128(t, frz, 1); \ if (u >= 10) { \ Sleef_quad qz = mpfr_get_f128(frz, GMP_RNDN); \ fprintf(stderr, "\narg = %s,\n %s\ntest = %s\ncorrect = %s\nulp = %g\n", \ sprintf128(argx), sprintf128(argy), sprintf128(t), sprintf128(qz), u); \ success = 0; \ break; \ } \ } while(0) #define cmpDenorm_q_q_q(mpfrFunc, childFunc, argw, argx, argy) do { \ mpfr_set_f128(frw, argw, GMP_RNDN); \ mpfr_set_f128(frx, argx, GMP_RNDN); \ mpfr_set_f128(fry, argy, GMP_RNDN); \ mpfrFunc(frz, frw, frx, fry, GMP_RNDN); \ Sleef_quad t = childFunc(argw, argx, argy); \ double u = countULPf128(t, frz, 1); \ if (u >= 10) { \ Sleef_quad qz = mpfr_get_f128(frz, GMP_RNDN); \ fprintf(stderr, "\narg = %s,\n %s,\n %s\ntest = %s\ncorrect = %s\nulp = %g\n", \ sprintf128(argw), sprintf128(argx), sprintf128(argy), sprintf128(t), sprintf128(qz), u); \ success = 0; \ break; \ } \ } while(0) #define cmpDenorm_q_pi(mpfrFunc, childFunc, argx) do { \ mpfr_set_f128(frx, argx, GMP_RNDN); \ mpfr_exp_t e; \ mpfrFunc(&e, frz, frx, GMP_RNDN); \ int i; \ Sleef_quad t = childFunc(argx, &i); \ double u = countULPf128(t, frz, 1); \ if (u >= 10 || i != (int)e) { \ fprintf(stderr, "\narg = %s\ntest = %s, %d\ncorrect = %s, %d\nulp = %g\n", \ sprintf128(argx), sprintf128(t), i, sprintfr(frz), (int)e, u); \ success = 0; \ break; \ } \ } while(0) #define cmpDenorm_q_pq(mpfrFunc, childFunc, argx) do { \ mpfr_set_f128(frx, argx, GMP_RNDN); \ mpfrFunc(fry, frz, frx, GMP_RNDN); \ Sleef_quad qi, qf; \ qf = childFunc(argx, &qi); \ double u = countULPf128(qf, frz, 1); \ double v = countULPf128(qi, fry, 1); \ if (u >= 10 || v >= 10) { \ fprintf(stderr, "\narg = %s\ntest = %s, %s\ncorrect = %s, %s\nulp = %g, %g\n", \ sprintf128(argx), sprintf128(qf), sprintf128(qi), sprintfr(frz), sprintfr(fry), u, v); \ success = 0; \ break; \ } \ } while(0) #define checkAccuracy_q(mpfrFunc, childFunc, argx, bound) do { \ mpfr_set_f128(frx, argx, GMP_RNDN); \ mpfrFunc(frz, frx, GMP_RNDN); \ Sleef_quad t = childFunc(argx); \ double e = countULPf128(t, frz, 0); \ maxError = fmax(maxError, e); \ if (e > bound) { \ fprintf(stderr, "\narg = %s, test = %s, correct = %s, ULP = %lf\n", \ sprintf128(argx), sprintf128(childFunc(argx)), sprintfr(frz), countULPf128(t, frz, 0)); \ success = 0; \ break; \ } \ } while(0) #define checkAccuracyNMR_q(mpfrFunc, childFunc, argx, bound) do { \ mpfr_set_f128(frx, argx, GMP_RNDN); \ mpfrFunc(frz, frx); \ Sleef_quad t = childFunc(argx); \ double e = countULPf128(t, frz, 0); \ maxError = fmax(maxError, e); \ if (e > bound) { \ fprintf(stderr, "\narg = %s, test = %s, correct = %s, ULP = %lf\n", \ sprintf128(argx), sprintf128(childFunc(argx)), sprintfr(frz), countULPf128(t, frz, 0)); \ success = 0; \ break; \ } \ } while(0) #define checkAccuracy_q_q(mpfrFunc, childFunc, argx, argy, bound) do { \ mpfr_set_f128(frx, argx, GMP_RNDN); \ mpfr_set_f128(fry, argy, GMP_RNDN); \ mpfrFunc(frz, frx, fry, GMP_RNDN); \ Sleef_quad t = childFunc(argx, argy); \ double e = countULPf128(t, frz, 0); \ maxError = fmax(maxError, e); \ if (e > bound) { \ fprintf(stderr, "\narg = %s, %s, test = %s, correct = %s, ULP = %lf\n", \ sprintf128(argx), sprintf128(argy), sprintf128(childFunc(argx, argy)), sprintfr(frz), countULPf128(t, frz, 0)); \ success = 0; \ break; \ } \ } while(0) #define checkAccuracy_q_q_q(mpfrFunc, childFunc, argw, argx, argy, bound) do { \ mpfr_set_f128(frw, argw, GMP_RNDN); \ mpfr_set_f128(frx, argx, GMP_RNDN); \ mpfr_set_f128(fry, argy, GMP_RNDN); \ mpfrFunc(frz, frw, frx, fry, GMP_RNDN); \ Sleef_quad t = childFunc(argw, argx, argy); \ double e = countULPf128(t, frz, 0); \ maxError = fmax(maxError, e); \ if (e > bound) { \ fprintf(stderr, "\narg = %s, %s, %s, test = %s, correct = %s, ULP = %lf\n", \ sprintf128(argw), sprintf128(argx), sprintf128(argy), sprintf128(childFunc(argw, argx, argy)), sprintfr(frz), countULPf128(t, frz, 0)); \ success = 0; \ break; \ } \ } while(0) #define checkAccuracy_q_pi(mpfrFunc, childFunc, argx, bound) do { \ mpfr_set_f128(frx, argx, GMP_RNDN); \ mpfr_exp_t ex; \ mpfrFunc(&ex, frz, frx, GMP_RNDN); \ int i; \ Sleef_quad t = childFunc(argx, &i); \ double e = countULPf128(t, frz, 0); \ maxError = fmax(maxError, e); \ if (e > bound || i != (int)ex) { \ fprintf(stderr, "\narg = %s, test = %s, %d, correct = %s, %d, ULP = %lf\n", \ sprintf128(argx), sprintf128(t), i, sprintfr(frz), (int)ex, countULPf128(t, frz, 0)); \ success = 0; \ break; \ } \ } while(0) #define checkAccuracy_q_pq(mpfrFunc, childFunc, argx, bound) do { \ mpfr_set_f128(frx, argx, GMP_RNDN); \ mpfrFunc(fry, frz, frx, GMP_RNDN); \ Sleef_quad qi, qf; \ qf = childFunc(argx, &qi); \ double ef = countULPf128(qf, frz, 0); \ double ei = countULPf128(qi, fry, 0); \ maxError = fmax(maxError, ef); \ maxError = fmax(maxError, ei); \ if (ef > bound || ei > bound) { \ fprintf(stderr, "\narg = %s, test = %s, %s, correct = %s, %s, ULP = %lf, %lf\n", \ sprintf128(argx), sprintf128(qf), sprintf128(qi), sprintfr(frz), sprintfr(fry), ef, ei); \ success = 0; \ break; \ } \ } while(0) #define testComparison(mpfrFunc, childFunc, argx, argy) do { \ mpfr_set_f128(frx, argx, GMP_RNDN); \ mpfr_set_f128(fry, argy, GMP_RNDN); \ int c = mpfrFunc(frx, fry); \ int t = childFunc(argx, argy); \ if ((c != 0) != (t != 0)) { \ fprintf(stderr, "\narg = %s, %s, test = %d, correct = %d\n", \ sprintf128(argx), sprintf128(argy), t, c); \ success = 0; \ break; \ } \ } while(0) // #define cmpDenormOuterLoop_q(mpfrFunc, childFunc, checkVals) do { \ for(int i=0;i 0.5) { fprintf(stderr, "\narg = %s, %d\ntest = %s\ncorrect = %s\nulp = %g\n", sprintf128(a0), ldexpCheckVals[i], sprintf128(t), sprintfr(frz), u); success = 0; break; } } } checkResult(success, -1); } { fprintf(stderr, "ilogb : "); static const int correctIlogbVals[] = { -2147483648, -2147483648, -2, -2, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 332, 332, -332, -332, 9966, 9966, -9966, -9966, 1, -16382, -16382, -16494, -16494, 2147483647, 2147483647, 2147483647, }; for(int i=0;i