in src/jdk.incubator.vector/unix/native/libsleef/upstream/src/quad-tester/qtester.c [734:1495]
void do_test(int options) {
mpfr_set_default_prec(256);
mpfr_t frw, frx, fry, frz;
mpfr_inits(frw, frx, fry, frz, NULL);
int success = 1;
static const char *stdCheckVals[] = {
"-0.0", "0.0", "+0.25", "-0.25", "+0.5", "-0.5", "+0.75", "-0.75", "+1.0", "-1.0",
"+1.25", "-1.25", "+1.5", "-1.5", "+2.0", "-2.0", "+2.5", "-2.5", "+3.0", "-3.0",
"+4.0", "-4.0", "+5.0", "-5.0", "+6.0", "-6.0", "+7.0", "-7.0",
"1.234", "-1.234", "+1.234e+100", "-1.234e+100", "+1.234e-100", "-1.234e-100",
"+1.234e+3000", "-1.234e+3000", "+1.234e-3000", "-1.234e-3000",
"3.1415926535897932384626433832795028841971693993751058209749445923078164",
"+" STR_QUAD_MIN, "-" STR_QUAD_MIN,
"+" STR_QUAD_DENORM_MIN, "-" STR_QUAD_DENORM_MIN,
"Inf", "-Inf", "NaN"
};
static const char *noNegZeroCheckVals[] = {
"0.0", "+0.25", "-0.25", "+0.5", "-0.5", "+0.75", "-0.75", "+1.0", "-1.0",
"+1.25", "-1.25", "+1.5", "-1.5", "+2.0", "-2.0", "+2.5", "-2.5", "+3.0", "-3.0",
"+4.0", "-4.0", "+5.0", "-5.0", "+6.0", "-6.0", "+7.0", "-7.0",
"1.234", "-1.234", "+1.234e+100", "-1.234e+100", "+1.234e-100", "-1.234e-100",
"+1.234e+3000", "-1.234e+3000", "+1.234e-3000", "-1.234e-3000",
"3.1415926535897932384626433832795028841971693993751058209749445923078164",
"+" STR_QUAD_MIN, "-" STR_QUAD_MIN,
"+" STR_QUAD_DENORM_MIN, "-" STR_QUAD_DENORM_MIN,
"Inf", "-Inf", "NaN"
};
static const char *noNanCheckVals[] = {
"-0.0", "0.0", "+0.25", "-0.25", "+0.5", "-0.5", "+0.75", "-0.75", "+1.0", "-1.0",
"+1.25", "-1.25", "+1.5", "-1.5", "+2.0", "-2.0", "+2.5", "-2.5", "+3.0", "-3.0",
"+4.0", "-4.0", "+5.0", "-5.0", "+6.0", "-6.0", "+7.0", "-7.0",
"1.234", "-1.234", "+1.234e+100", "-1.234e+100", "+1.234e-100", "-1.234e-100",
"+1.234e+3000", "-1.234e+3000", "+1.234e-3000", "-1.234e-3000",
"3.1415926535897932384626433832795028841971693993751058209749445923078164",
"+" STR_QUAD_MIN, "-" STR_QUAD_MIN,
"+" STR_QUAD_DENORM_MIN, "-" STR_QUAD_DENORM_MIN,
"Inf", "-Inf"
};
static const char *noInfCheckVals[] = {
"-0.0", "0.0", "+0.25", "-0.25", "+0.5", "-0.5", "+0.75", "-0.75", "+1.0", "-1.0",
"+1.25", "-1.25", "+1.5", "-1.5", "+2.0", "-2.0", "+2.5", "-2.5", "+3.0", "-3.0",
"+4.0", "-4.0", "+5.0", "-5.0", "+6.0", "-6.0", "+7.0", "-7.0",
"1.234", "-1.234", "+1.234e+100", "-1.234e+100", "+1.234e-100", "-1.234e-100",
"+1.234e+3000", "-1.234e+3000", "+1.234e-3000", "-1.234e-3000",
"3.1415926535897932384626433832795028841971693993751058209749445923078164",
"+" STR_QUAD_MIN, "-" STR_QUAD_MIN,
"+" STR_QUAD_DENORM_MIN, "-" STR_QUAD_DENORM_MIN,
"NaN"
};
static const char *finiteCheckVals[] = {
"-0.0", "0.0", "+0.25", "-0.25", "+0.5", "-0.5", "+0.75", "-0.75", "+1.0", "-1.0",
"+1.25", "-1.25", "+1.5", "-1.5", "+2.0", "-2.0", "+2.5", "-2.5", "+3.0", "-3.0",
"+4.0", "-4.0", "+5.0", "-5.0", "+6.0", "-6.0", "+7.0", "-7.0",
"1.234", "-1.234", "+1.234e+100", "-1.234e+100", "+1.234e-100", "-1.234e-100",
"+1.234e+3000", "-1.234e+3000", "+1.234e-3000", "-1.234e-3000",
"3.1415926535897932384626433832795028841971693993751058209749445923078164",
"+" STR_QUAD_MIN, "-" STR_QUAD_MIN,
"+" STR_QUAD_DENORM_MIN, "-" STR_QUAD_DENORM_MIN,
};
static const char *trigCheckVals[] = {
"3.141592653589793238462643383279502884197169399375105820974944592307",
"6.283185307179586476925286766559005768394338798750211641949889184615",
"25.13274122871834590770114706623602307357735519500084656779955673846",
"402.1238596594935345232183530597763691772376831200135450847929078154",
"102943.7080728303448379438983833027505093728468787234675417069844007",
"6746518852.261009479299491324448129057382258893044021168813308929687",
"28976077832308491369.53730422794043954984410931622923280838485698255",
"534514292032483373929840186580935391650.3203828374578833308216124114",
"1.8188578844588316214011747138886493132669668866419621497938607555896e+77"
"3.141592653589793238462643383279502884197169399375105820974944592307e+1000",
"3.141592653589793238462643383279502884197169399375105820974944592307e+2000",
};
static const char *bigIntCheckVals[] = {
"+5192296858534827628530496329220094.0",
"+5192296858534827628530496329220094.25",
"+5192296858534827628530496329220094.5",
"+5192296858534827628530496329220094.75",
"+5192296858534827628530496329220095.0",
"+5192296858534827628530496329220095.25",
"+5192296858534827628530496329220095.5",
"+5192296858534827628530496329220095.75",
"+5192296858534827628530496329220096.0",
"+5192296858534827628530496329220097.0",
"+5192296858534827628530496329220098.0",
"-5192296858534827628530496329220094.0",
"-5192296858534827628530496329220094.25",
"-5192296858534827628530496329220094.5",
"-5192296858534827628530496329220094.75",
"-5192296858534827628530496329220095.0",
"-5192296858534827628530496329220095.25",
"-5192296858534827628530496329220095.5",
"-5192296858534827628530496329220095.75",
"-5192296858534827628530496329220096.0",
"-5192296858534827628530496329220097.0",
"-5192296858534827628530496329220098.0",
};
#define NTEST 1000
double errorBound = 0.5000000001;
double maxError;
fprintf(stderr, "addq_u05 : ");
maxError = 0;
cmpDenormOuterLoop_q_q(mpfr_add, child_addq_u05, stdCheckVals);
checkAccuracyOuterLoop2_q_q(mpfr_add, child_addq_u05, stdCheckVals, 0.5);
checkAccuracyOuterLoop_q_q(mpfr_add, child_addq_u05, "1e-100", "1e+100", 1, 5 * NTEST, errorBound, 0);
checkAccuracyOuterLoop_q_q(mpfr_add, child_addq_u05, "1e-4000", "1e+4000", 1, 5 * NTEST, errorBound, 1);
checkResult(success, maxError);
fprintf(stderr, "subq_u05 : ");
maxError = 0;
cmpDenormOuterLoop_q_q(mpfr_sub, child_subq_u05, stdCheckVals);
checkAccuracyOuterLoop2_q_q(mpfr_sub, child_subq_u05, stdCheckVals, 0.5);
checkAccuracyOuterLoop_q_q(mpfr_sub, child_subq_u05, "1e-100", "1e+100", 1, 5 * NTEST, errorBound, 0);
checkAccuracyOuterLoop_q_q(mpfr_sub, child_subq_u05, "1e-4000", "1e+4000", 1, 5 * NTEST, errorBound, 1);
checkResult(success, maxError);
fprintf(stderr, "mulq_u05 : ");
maxError = 0;
cmpDenormOuterLoop_q_q(mpfr_mul, child_mulq_u05, stdCheckVals);
checkAccuracyOuterLoop2_q_q(mpfr_mul, child_mulq_u05, stdCheckVals, 0.5);
checkAccuracyOuterLoop_q_q(mpfr_mul, child_mulq_u05, "1e-100", "1e+100", 1, 5 * NTEST, errorBound, 0);
checkAccuracyOuterLoop_q_q(mpfr_mul, child_mulq_u05, "1e-4000", "1e+4000", 1, 5 * NTEST, errorBound, 1);
checkResult(success, maxError);
fprintf(stderr, "divq_u05 : ");
maxError = 0;
cmpDenormOuterLoop_q_q(mpfr_div, child_divq_u05, stdCheckVals);
checkAccuracyOuterLoop2_q_q(mpfr_div, child_divq_u05, stdCheckVals, 0.5);
checkAccuracyOuterLoop_q_q(mpfr_div, child_divq_u05, "1e-100", "1e+100", 1, 5 * NTEST, errorBound, 0);
checkAccuracyOuterLoop_q_q(mpfr_div, child_divq_u05, "1e-4000", "1e+4000", 1, 5 * NTEST, errorBound, 1);
checkResult(success, maxError);
fprintf(stderr, "negq : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_neg, child_negq, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_neg, child_negq, stdCheckVals, 0);
checkAccuracyOuterLoop_q(mpfr_neg, child_negq, "1e-100", "1e+100", 1, 5 * NTEST, 0, 0);
checkAccuracyOuterLoop_q(mpfr_neg, child_negq, "1e-4000", "1e+4000", 1, 5 * NTEST, 0, 1);
checkResult(success, maxError);
//
fprintf(stderr, "icmpltq : ");
testComparisonOuterLoop(mpfr_less_p, child_icmpltq, stdCheckVals);
checkResult(success, -1);
fprintf(stderr, "icmpgtq : ");
testComparisonOuterLoop(mpfr_greater_p, child_icmpgtq, stdCheckVals);
checkResult(success, -1);
fprintf(stderr, "icmpleq : ");
testComparisonOuterLoop(mpfr_lessequal_p, child_icmpleq, stdCheckVals);
checkResult(success, -1);
fprintf(stderr, "icmpgeq : ");
testComparisonOuterLoop(mpfr_greaterequal_p, child_icmpgeq, stdCheckVals);
checkResult(success, -1);
fprintf(stderr, "icmpeq : ");
testComparisonOuterLoop(mpfr_equal_p, child_icmpeqq, stdCheckVals);
checkResult(success, -1);
fprintf(stderr, "icmpne : ");
testComparisonOuterLoop(mpfr_lessgreater_p, child_icmpneq, stdCheckVals);
checkResult(success, -1);
fprintf(stderr, "icmpq : ");
testComparisonOuterLoop(mpfr_cmp, child_icmpq, stdCheckVals);
checkResult(success, -1);
fprintf(stderr, "iunordq : ");
testComparisonOuterLoop(mpfr_unordered_p, child_iunordq, stdCheckVals);
checkResult(success, -1);
//
fprintf(stderr, "cast_from_doubleq : ");
{
xsrand(0);
for(int i=0;i<10 * NTEST;i++) {
double d;
switch(i) {
case 0: d = +0.0; break;
case 1: d = -0.0; break;
case 2: d = +SLEEF_INFINITY; break;
case 3: d = -SLEEF_INFINITY; break;
case 4: d = SLEEF_NAN; break;
default : memrand(&d, sizeof(d));
}
Sleef_quad qt = child_cast_from_doubleq(d);
mpfr_set_d(frz, d, GMP_RNDN);
Sleef_quad qc = mpfr_get_f128(frz, GMP_RNDN);
if (memcmp(&qt, &qc, sizeof(Sleef_quad)) == 0) continue;
if (isnanf128(qt) && isnanf128(qc)) continue;
fprintf(stderr, "\narg = %.20g\ntest = %s\ncorrect = %s\n",
d, sprintf128(qt), sprintf128(qc));
success = 0;
break;
}
checkResult(success, -1);
}
fprintf(stderr, "cast_to_doubleq : ");
{
xsrand(0);
Sleef_quad min = cast_q_str("0"), max = cast_q_str("1e+20");
for(int i=0;i<10 * NTEST;i++) {
Sleef_quad x;
if (i < sizeof(stdCheckVals)/sizeof(char *)) {
x = cast_q_str(stdCheckVals[i]);
} else {
x = rndf128(min, max, 1);
}
double dt = child_cast_to_doubleq(x);
mpfr_set_f128(frz, x, GMP_RNDN);
double dc = mpfr_get_d(frz, GMP_RNDN);
if (dt == dc) continue;
if (isnan(dt) && isnan(dc)) continue;
fprintf(stderr, "\narg = %s\ntest = %.20g\ncorrect = %.20g\n",
sprintf128(x), dt, dc);
success = 0;
break;
}
checkResult(success, -1);
}
fprintf(stderr, "cast_from_int64q : ");
{
xsrand(0);
for(int i=0;i<10 * NTEST;i++) {
int64_t d;
switch(i) {
case 0: d = 0; break;
case 1: d = +0x7fffffffffffffffL; break;
case 2: d = -0x8000000000000000L; break;
default : memrand(&d, sizeof(d));
}
Sleef_quad qt = child_cast_from_int64q(d);
mpfr_set_sj(frz, d, GMP_RNDN);
Sleef_quad qc = mpfr_get_f128(frz, GMP_RNDN);
if (memcmp(&qt, &qc, sizeof(Sleef_quad)) == 0) continue;
fprintf(stderr, "\narg = %lld\ntest = %s\ncorrect = %s\n",
(long long int)d, sprintf128(qt), sprintf128(qc));
success = 0;
break;
}
checkResult(success, -1);
}
fprintf(stderr, "cast_to_int64q : ");
{
xsrand(0);
Sleef_quad min = cast_q_str("0"), max = cast_q_str("1e+20");
for(int i=0;i<10 * NTEST;i++) {
Sleef_quad x;
if (i < sizeof(stdCheckVals)/sizeof(char *) - 1) {
x = cast_q_str(stdCheckVals[i]);
} else {
x = rndf128(min, max, 1);
}
int64_t dt = child_cast_to_int64q(x);
mpfr_set_f128(frz, x, GMP_RNDN);
int64_t dc = mpfr_get_sj(frz, GMP_RNDZ);
if (dt == dc) continue;
fprintf(stderr, "\narg = %s\ntest = %lld\ncorrect = %lld\n",
sprintf128(x), (long long int)dt, (long long int)dc);
success = 0;
break;
}
checkResult(success, -1);
}
fprintf(stderr, "cast_from_uint64q : ");
{
xsrand(0);
for(int i=0;i<10 * NTEST;i++) {
uint64_t d;
switch(i) {
case 0: d = 0; break;
case 1: d = +0x7fffffffffffffffL; break;
case 2: d = -0x8000000000000000L; break;
default : memrand(&d, sizeof(d));
}
Sleef_quad qt = child_cast_from_uint64q(d);
mpfr_set_uj(frz, d, GMP_RNDN);
Sleef_quad qc = mpfr_get_f128(frz, GMP_RNDN);
if (memcmp(&qt, &qc, sizeof(Sleef_quad)) == 0) continue;
fprintf(stderr, "\narg = %lld\ntest = %s\ncorrect = %s\n",
(long long int)d, sprintf128(qt), sprintf128(qc));
success = 0;
break;
}
checkResult(success, -1);
}
fprintf(stderr, "cast_to_uint64q : ");
{
xsrand(0);
Sleef_quad min = cast_q_str("0"), max = cast_q_str("1e+20");
for(int i=0;i<10 * NTEST;i++) {
Sleef_quad x;
if (i < sizeof(stdCheckVals)/sizeof(char *) - 1) {
x = cast_q_str(stdCheckVals[i]);
} else {
x = rndf128(min, max, 0);
}
uint64_t dt = child_cast_to_uint64q(x);
mpfr_set_f128(frz, x, GMP_RNDN);
uint64_t dc = mpfr_get_uj(frz, GMP_RNDZ);
if (dt == dc) continue;
fprintf(stderr, "\narg = %s\ntest = %lld\ncorrect = %lld\n",
sprintf128(x), (long long int)dt, (long long int)dc);
success = 0;
break;
}
checkResult(success, -1);
}
//
fprintf(stderr, "sqrtq_u05 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_sqrt, child_sqrtq_u05, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_sqrt, child_sqrtq_u05, stdCheckVals, 0.5);
checkAccuracyOuterLoop_q(mpfr_sqrt, child_sqrtq_u05, "1e-100", "1e+100", 0, 5 * NTEST, errorBound, 0);
checkAccuracyOuterLoop_q(mpfr_sqrt, child_sqrtq_u05, "1e-4000", "1e+4000", 0, 5 * NTEST, errorBound, 1);
checkResult(success, maxError);
fprintf(stderr, "cbrtq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_cbrt, child_cbrtq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_cbrt, child_cbrtq_u10, stdCheckVals, 0.5);
checkAccuracyOuterLoop_q(mpfr_cbrt, child_cbrtq_u10, "1e-100", "1e+100", 1, 5 * NTEST, errorBound, 0);
checkAccuracyOuterLoop_q(mpfr_cbrt, child_cbrtq_u10, "1e-4000", "1e+4000", 1, 5 * NTEST, errorBound, 1);
checkResult(success, maxError);
fprintf(stderr, "sinq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_sin, child_sinq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_sin, child_sinq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop2_q(mpfr_sin, child_sinq_u10, trigCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_sin, child_sinq_u10, "1e-100", "1e+100", 1, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q(mpfr_sin, child_sinq_u10, "1e-4000", "1e+4000", 1, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
fprintf(stderr, "cosq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_cos, child_cosq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_cos, child_cosq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop2_q(mpfr_cos, child_cosq_u10, trigCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_cos, child_cosq_u10, "1e-100", "1e+100", 1, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q(mpfr_cos, child_cosq_u10, "1e-4000", "1e+4000", 1, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
fprintf(stderr, "tanq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_tan, child_tanq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_tan, child_tanq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop2_q(mpfr_tan, child_tanq_u10, trigCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_tan, child_tanq_u10, "1e-100", "1e+100", 1, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q(mpfr_tan, child_tanq_u10, "1e-4000", "1e+4000", 1, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
fprintf(stderr, "asinq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_asin, child_asinq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_asin, child_asinq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_asin, child_asinq_u10, "1e-100", "1", 1, 10 * NTEST, 1.0, 0);
checkResult(success, maxError);
fprintf(stderr, "acosq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_acos, child_acosq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_acos, child_acosq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_acos, child_acosq_u10, "1e-100", "1", 1, 10 * NTEST, 1.0, 0);
checkResult(success, maxError);
fprintf(stderr, "atanq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_atan, child_atanq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_atan, child_atanq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_atan, child_atanq_u10, "1e-100", "1e+100", 1, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q(mpfr_atan, child_atanq_u10, "1e-4000", "1e+4000", 1, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
fprintf(stderr, "atan2q_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q_q(mpfr_atan2, child_atan2q_u10, stdCheckVals);
checkAccuracyOuterLoop2_q_q(mpfr_atan2, child_atan2q_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q_q(mpfr_atan2, child_atan2q_u10, "1e-100", "1e+100", 1, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q_q(mpfr_atan2, child_atan2q_u10, "1e-4000", "1e+4000", 1, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
fprintf(stderr, "expq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_exp, child_expq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_exp, child_expq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_exp, child_expq_u10, "1e-100", "1e+100", 1, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q(mpfr_exp, child_expq_u10, "1e-4000", "1e+4000", 1, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
fprintf(stderr, "exp2q_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_exp2, child_exp2q_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_exp2, child_exp2q_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_exp2, child_exp2q_u10, "1e-100", "1e+100", 1, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q(mpfr_exp2, child_exp2q_u10, "1e-4000", "1e+4000", 1, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
fprintf(stderr, "exp10q_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_exp10, child_exp10q_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_exp10, child_exp10q_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_exp10, child_exp10q_u10, "1e-100", "1e+100", 1, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q(mpfr_exp10, child_exp10q_u10, "1e-4000", "1e+4000", 1, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
fprintf(stderr, "expm1q_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_expm1, child_expm1q_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_expm1, child_expm1q_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_expm1, child_expm1q_u10, "1e-100", "1e+100", 1, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q(mpfr_expm1, child_expm1q_u10, "1e-4000", "1e+4000", 1, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
fprintf(stderr, "logq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_log, child_logq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_log, child_logq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_log, child_logq_u10, "1e-100", "1e+100", 0, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q(mpfr_log, child_logq_u10, "1e-4000", "1e+4000", 0, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
fprintf(stderr, "log2q_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_log2, child_log2q_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_log2, child_log2q_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_log2, child_log2q_u10, "1e-100", "1e+100", 0, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q(mpfr_log2, child_log2q_u10, "1e-4000", "1e+4000", 0, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
fprintf(stderr, "log10q_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_log10, child_log10q_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_log10, child_log10q_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_log10, child_log10q_u10, "1e-100", "1e+100", 0, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q(mpfr_log10, child_log10q_u10, "1e-4000", "1e+4000", 0, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
static const char *log1pCheckVals[] = {
"-.9", "-.99999999", "-.9999999999999999", "-.9999999999999999999999999999999999"
};
fprintf(stderr, "log1pq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_log1p, child_log1pq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_log1p, child_log1pq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop2_q(mpfr_log1p, child_log1pq_u10, log1pCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_log1p, child_log1pq_u10, "1e-100", "1e+100", 0, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q(mpfr_log1p, child_log1pq_u10, "1e-4000", "1e+4000", 0, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
fprintf(stderr, "powq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q_q(mpfr_pow, child_powq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q_q(mpfr_pow, child_powq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q_q(mpfr_pow, child_powq_u10, "1e-100", "1e+100", 1, 5 * NTEST, 1.0, 0);
checkAccuracyOuterLoop_q_q(mpfr_pow, child_powq_u10, "1e-4000", "1e+4000", 1, 5 * NTEST, 1.0, 1);
checkResult(success, maxError);
fprintf(stderr, "sinhq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_sinh, child_sinhq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_sinh, child_sinhq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_sinh, child_sinhq_u10, "1e-15", "20000", 1, 10 * NTEST, 1.0, 0);
checkResult(success, maxError);
fprintf(stderr, "coshq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_cosh, child_coshq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_cosh, child_coshq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_cosh, child_coshq_u10, "1e-15", "20000", 1, 10 * NTEST, 1.0, 0);
checkResult(success, maxError);
fprintf(stderr, "tanhq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_tanh, child_tanhq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_tanh, child_tanhq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_tanh, child_tanhq_u10, "1e-15", "40", 1, 10 * NTEST, 1.0, 0);
checkResult(success, maxError);
fprintf(stderr, "asinhq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_asinh, child_asinhq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_asinh, child_asinhq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_asinh, child_asinhq_u10, "1e-15", "20000", 1, 10 * NTEST, 1.0, 0);
checkResult(success, maxError);
fprintf(stderr, "acoshq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_acosh, child_acoshq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_acosh, child_acoshq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_acosh, child_acoshq_u10, "1", "20000", 0, 10 * NTEST, 1.0, 0);
checkResult(success, maxError);
fprintf(stderr, "atanhq_u10 : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_atanh, child_atanhq_u10, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_atanh, child_atanhq_u10, stdCheckVals, 1.0);
checkAccuracyOuterLoop_q(mpfr_atanh, child_atanhq_u10, "1e-15", "1", 1, 10 * NTEST, 1.0, 0);
checkResult(success, maxError);
//
fprintf(stderr, "fabsq : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_abs, child_fabsq, stdCheckVals);
checkAccuracyOuterLoop2_q(mpfr_abs, child_fabsq, stdCheckVals, 0);
checkAccuracyOuterLoop_q(mpfr_abs, child_fabsq, "1e-100", "1e+100", 1, 5 * NTEST, 0, 0);
checkAccuracyOuterLoop_q(mpfr_abs, child_fabsq, "1e-4000", "1e+4000", 1, 5 * NTEST, 0, 1);
checkResult(success, maxError);
fprintf(stderr, "fmaxq : ");
maxError = 0;
cmpDenormOuterLoop_q_q(mpfr_max, child_fmaxq, noNegZeroCheckVals);
checkAccuracyOuterLoop2_q_q(mpfr_max, child_fmaxq, stdCheckVals, 0);
checkAccuracyOuterLoop_q_q(mpfr_max, child_fmaxq, "1e-100", "1e+100", 1, 5 * NTEST, 0, 0);
checkAccuracyOuterLoop_q_q(mpfr_max, child_fmaxq, "1e-4000", "1e+4000", 1, 5 * NTEST, 0, 1);
checkResult(success, maxError);
fprintf(stderr, "fminq : ");
maxError = 0;
cmpDenormOuterLoop_q_q(mpfr_min, child_fminq, noNegZeroCheckVals);
checkAccuracyOuterLoop2_q_q(mpfr_min, child_fminq, stdCheckVals, 0);
checkAccuracyOuterLoop_q_q(mpfr_min, child_fminq, "1e-100", "1e+100", 1, 5 * NTEST, 0, 0);
checkAccuracyOuterLoop_q_q(mpfr_min, child_fminq, "1e-4000", "1e+4000", 1, 5 * NTEST, 0, 1);
checkResult(success, maxError);
fprintf(stderr, "copysignq : ");
maxError = 0;
cmpDenormOuterLoop_q_q(mpfr_copysign, child_copysignq, noNanCheckVals);
checkAccuracyOuterLoop2_q_q(mpfr_copysign, child_copysignq, noNanCheckVals, 0);
checkAccuracyOuterLoop_q_q(mpfr_copysign, child_copysignq, "1e-100", "1e+100", 1, 5 * NTEST, 0, 0);
checkAccuracyOuterLoop_q_q(mpfr_copysign, child_copysignq, "1e-4000", "1e+4000", 1, 5 * NTEST, 0, 1);
checkResult(success, maxError);
fprintf(stderr, "fdimq_u05 : ");
maxError = 0;
cmpDenormOuterLoop_q_q(mpfr_dim, child_fdimq_u05, noInfCheckVals); // A workaround for a bug in MPFR
checkAccuracyOuterLoop2_q_q(mpfr_dim, child_fdimq_u05, noInfCheckVals, 0.5);
checkAccuracyOuterLoop_q_q(mpfr_dim, child_fdimq_u05, "1e-100", "1e+100", 1, 5 * NTEST, errorBound, 0);
checkAccuracyOuterLoop_q_q(mpfr_dim, child_fdimq_u05, "1e-4000", "1e+4000", 1, 5 * NTEST, errorBound, 1);
checkResult(success, maxError);
fprintf(stderr, "fmodq : ");
maxError = 0;
cmpDenormOuterLoop_q_q(mpfr_fmod, child_fmodq, stdCheckVals);
checkAccuracyOuterLoop2_q_q(mpfr_fmod, child_fmodq, stdCheckVals, 0);
checkAccuracyOuterLoop_q_q(mpfr_fmod, child_fmodq, "1e-100", "1e+100", 1, 5 * NTEST, 0, 0);
checkAccuracyOuterLoop_q_q(mpfr_fmod, child_fmodq, "1e-4000", "1e+4000", 1, 5 * NTEST, 0, 1);
checkResult(success, maxError);
fprintf(stderr, "remainderq : ");
maxError = 0;
cmpDenormOuterLoop_q_q(mpfr_remainder, child_remainderq, stdCheckVals);
checkAccuracyOuterLoop2_q_q(mpfr_remainder, child_remainderq, stdCheckVals, 0);
checkAccuracyOuterLoop_q_q(mpfr_remainder, child_remainderq, "1e-100", "1e+100", 1, 5 * NTEST, 0, 0);
checkAccuracyOuterLoop_q_q(mpfr_remainder, child_remainderq, "1e-4000", "1e+4000", 1, 5 * NTEST, 0, 1);
checkResult(success, maxError);
fprintf(stderr, "frexpq : ");
maxError = 0;
cmpDenormOuterLoop_q_pi(mpfr_frexp, child_frexpq, finiteCheckVals);
checkAccuracyOuterLoop2_q_pi(mpfr_frexp, child_frexpq, finiteCheckVals, 0);
checkAccuracyOuterLoop_q_pi(mpfr_frexp, child_frexpq, "1e-4000", "1e+4000", 1, 10 * NTEST, 0, 1);
checkResult(success, maxError);
fprintf(stderr, "modfq : ");
maxError = 0;
cmpDenormOuterLoop_q_pq(mpfr_modf, child_modfq, stdCheckVals);
checkAccuracyOuterLoop2_q_pq(mpfr_modf, child_modfq, stdCheckVals, 0);
checkAccuracyOuterLoop_q_pq(mpfr_modf, child_modfq, "1e-4000", "1e+4000", 1, 10 * NTEST, 0, 1);
checkResult(success, maxError);
fprintf(stderr, "hypotq : ");
maxError = 0;
cmpDenormOuterLoop_q_q(mpfr_hypot, child_hypotq_u05, stdCheckVals);
checkAccuracyOuterLoop2_q_q(mpfr_hypot, child_hypotq_u05, stdCheckVals, 0.5);
checkAccuracyOuterLoop_q_q(mpfr_hypot, child_hypotq_u05, "1e-100", "1e+100", 1, 5 * NTEST, errorBound, 0);
checkAccuracyOuterLoop_q_q(mpfr_hypot, child_hypotq_u05, "1e-4000", "1e+4000", 1, 5 * NTEST, errorBound, 1);
checkResult(success, maxError);
fprintf(stderr, "fmaq_u05 : ");
maxError = 0;
cmpDenormOuterLoop_q_q_q(mpfr_fma, child_fmaq_u05, stdCheckVals);
checkAccuracyOuterLoop2_q_q_q(mpfr_fma, child_fmaq_u05, stdCheckVals, 0.5);
checkAccuracyOuterLoop_q_q_q(mpfr_fma, child_fmaq_u05, "1e-100", "1e+100", 1, 5 * NTEST, errorBound, 0);
checkAccuracyOuterLoop_q_q_q(mpfr_fma, child_fmaq_u05, "1e-4000", "1e+4000", 1, 5 * NTEST, errorBound, 1);
checkResult(success, maxError);
{
fprintf(stderr, "ldexp : ");
static const int ldexpCheckVals[] = {
-40000, -32770, -32769, -32768, -32767, -32766, -32765, -16386, -16385, -16384, -16383, -16382, -5, -4, -3, -2, -1, 0,
+40000, +32770, +32769, +32768, +32767, +32766, +32765, +16386, +16385, +16384, +16383, +16382, +5, +4, +3, +2, +1
};
for(int i=0;i<sizeof(ldexpCheckVals)/sizeof(int);i++) {
for(int j=0;j<sizeof(stdCheckVals)/sizeof(char *) && success;j++) {
Sleef_quad a0 = cast_q_str(stdCheckVals[j]);
Sleef_quad t = child_ldexpq(a0, ldexpCheckVals[i]);
mpfr_set_f128(frx, a0, GMP_RNDN);
mpfr_set(frz, frx, GMP_RNDN);
if (!mpfr_zero_p(frx)) mpfr_set_exp(frz, mpfr_get_exp(frz) + ldexpCheckVals[i]);
double u = countULPf128(t, frz, 0);
if (u > 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<sizeof(stdCheckVals)/sizeof(char *);i++) {
Sleef_quad a0 = cast_q_str(stdCheckVals[i]);
int t = child_ilogbq(a0);
if (t != correctIlogbVals[i]) {
fprintf(stderr, "\narg = %s\ntest = %d\ncorrect = %d\n",
sprintf128(a0), t, correctIlogbVals[i]);
success = 0;
break;
}
}
checkResult(success, -1);
}
//
fprintf(stderr, "truncq : ");
maxError = 0;
cmpDenormOuterLoopNMR_q(mpfr_trunc, child_truncq, stdCheckVals);
cmpDenormOuterLoopNMR_q(mpfr_trunc, child_truncq, bigIntCheckVals);
checkAccuracyOuterLoop2NMR_q(mpfr_trunc, child_truncq, stdCheckVals, 0);
checkAccuracyOuterLoop2NMR_q(mpfr_trunc, child_truncq, bigIntCheckVals, 0);
checkAccuracyOuterLoopNMR_q(mpfr_trunc, child_truncq, "1e-1", "1e+100", 1, 10 * NTEST, 0, 0);
checkResult(success, maxError);
fprintf(stderr, "floorq : ");
maxError = 0;
cmpDenormOuterLoopNMR_q(mpfr_floor, child_floorq, stdCheckVals);
cmpDenormOuterLoopNMR_q(mpfr_floor, child_floorq, bigIntCheckVals);
checkAccuracyOuterLoop2NMR_q(mpfr_floor, child_floorq, stdCheckVals, 0);
checkAccuracyOuterLoop2NMR_q(mpfr_floor, child_floorq, bigIntCheckVals, 0);
checkAccuracyOuterLoopNMR_q(mpfr_floor, child_floorq, "1e-1", "1e+100", 1, 10 * NTEST, 0, 0);
checkResult(success, maxError);
fprintf(stderr, "ceilq : ");
maxError = 0;
cmpDenormOuterLoopNMR_q(mpfr_ceil, child_ceilq, stdCheckVals);
cmpDenormOuterLoopNMR_q(mpfr_ceil, child_ceilq, bigIntCheckVals);
checkAccuracyOuterLoop2NMR_q(mpfr_ceil, child_ceilq, stdCheckVals, 0);
checkAccuracyOuterLoop2NMR_q(mpfr_ceil, child_ceilq, bigIntCheckVals, 0);
checkAccuracyOuterLoopNMR_q(mpfr_ceil, child_ceilq, "1e-1", "1e+100", 1, 10 * NTEST, 0, 0);
checkResult(success, maxError);
fprintf(stderr, "roundq : ");
maxError = 0;
cmpDenormOuterLoopNMR_q(mpfr_round, child_roundq, stdCheckVals);
cmpDenormOuterLoopNMR_q(mpfr_round, child_roundq, bigIntCheckVals);
checkAccuracyOuterLoop2NMR_q(mpfr_round, child_roundq, stdCheckVals, 0);
checkAccuracyOuterLoop2NMR_q(mpfr_round, child_roundq, bigIntCheckVals, 0);
checkAccuracyOuterLoopNMR_q(mpfr_round, child_roundq, "1e-1", "1e+100", 1, 10 * NTEST, 0, 0);
checkResult(success, maxError);
fprintf(stderr, "rintq : ");
maxError = 0;
cmpDenormOuterLoop_q(mpfr_rint, child_rintq, stdCheckVals);
cmpDenormOuterLoop_q(mpfr_rint, child_rintq, bigIntCheckVals);
checkAccuracyOuterLoop2_q(mpfr_rint, child_rintq, stdCheckVals, 0);
checkAccuracyOuterLoop2_q(mpfr_rint, child_rintq, bigIntCheckVals, 0);
checkAccuracyOuterLoop_q(mpfr_rint, child_rintq, "1e-1", "1e+100", 1, 10 * NTEST, 0, 0);
checkResult(success, maxError);
//
if ((options & 2) != 0) {
fprintf(stderr, "strtoq : ");
for(int i=0;i<sizeof(stdCheckVals)/sizeof(char *);i++) {
Sleef_quad a0 = cast_q_str(stdCheckVals[i]);
Sleef_quad a1 = child_strtoq(stdCheckVals[i]);
if (memcmp(&a0, &a1, sizeof(Sleef_quad)) == 0) continue;
if (isnanf128(a0) && isnanf128(a1)) continue;
fprintf(stderr, "\narg = %s\ntest = %s\ncorrect = %s\n",
stdCheckVals[i], sprintf128(a1), sprintf128(a0));
success = 0;
break;
}
checkResult(success, maxError);
fprintf(stderr, "Sleef_snprintf %%.40Qg : ");
for(int i=0;i<sizeof(stdCheckVals)/sizeof(char *);i++) {
Sleef_quad a0 = cast_q_str(stdCheckVals[i]);
char s[100];
child_snprintf_40Qg(s, a0);
Sleef_quad a1 = cast_q_str(s);
if (memcmp(&a0, &a1, sizeof(Sleef_quad)) == 0) continue;
if (isnanf128(a0) && isnanf128(a1)) continue;
fprintf(stderr, "\narg = %s\nteststr = %s\ntest = %s\ncorrect = %s\n",
stdCheckVals[i], s, sprintf128(a0), sprintf128(a1));
success = 0;
break;
}
checkResult(success, maxError);
fprintf(stderr, "Sleef_snprintf %%Qa : ");
for(int i=0;i<sizeof(stdCheckVals)/sizeof(char *);i++) {
Sleef_quad a0 = cast_q_str(stdCheckVals[i]);
char s[100];
child_snprintf_Qa(s, a0);
Sleef_quad a1 = cast_q_str_hex(s);
if (memcmp(&a0, &a1, sizeof(Sleef_quad)) == 0) continue;
if (isnanf128(a0) && isnanf128(a1)) continue;
fprintf(stderr, "\narg = %s\nteststr = %s\ntest = %s\ncorrect = %s\n",
stdCheckVals[i], s, sprintf128(a0), sprintf128(a1));
success = 0;
break;
}
checkResult(success, maxError);
}
mpfr_clears(frw, frx, fry, frz, NULL);
}