Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[libm] Add 3.5-ULP hyperbolic functions #192

Merged
merged 3 commits into from
May 18, 2018
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions src/libm-tester/iut.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,21 @@ int main(int argc, char **argv) {
sscanf(buf, "tanh %" PRIx64, &u);
u = d2u(xtanh(u2d(u)));
printf("%" PRIx64 "\n", u);
} else if (startsWith(buf, "sinh_u35 ")) {
uint64_t u;
sscanf(buf, "sinh_u35 %" PRIx64, &u);
u = d2u(xsinh_u35(u2d(u)));
printf("%" PRIx64 "\n", u);
} else if (startsWith(buf, "cosh_u35 ")) {
uint64_t u;
sscanf(buf, "cosh_u35 %" PRIx64, &u);
u = d2u(xcosh_u35(u2d(u)));
printf("%" PRIx64 "\n", u);
} else if (startsWith(buf, "tanh_u35 ")) {
uint64_t u;
sscanf(buf, "tanh_u35 %" PRIx64, &u);
u = d2u(xtanh_u35(u2d(u)));
printf("%" PRIx64 "\n", u);
} else if (startsWith(buf, "asinh ")) {
uint64_t u;
sscanf(buf, "asinh %" PRIx64, &u);
Expand Down Expand Up @@ -454,6 +469,21 @@ int main(int argc, char **argv) {
sscanf(buf, "tanhf %x", &u);
u = f2u(xtanhf(u2f(u)));
printf("%x\n", u);
} else if (startsWith(buf, "sinhf_u35 ")) {
uint32_t u;
sscanf(buf, "sinhf_u35 %x", &u);
u = f2u(xsinhf_u35(u2f(u)));
printf("%x\n", u);
} else if (startsWith(buf, "coshf_u35 ")) {
uint32_t u;
sscanf(buf, "coshf_u35 %x", &u);
u = f2u(xcoshf_u35(u2f(u)));
printf("%x\n", u);
} else if (startsWith(buf, "tanhf_u35 ")) {
uint32_t u;
sscanf(buf, "tanhf_u35 %x", &u);
u = f2u(xtanhf_u35(u2f(u)));
printf("%x\n", u);
} else if (startsWith(buf, "asinhf ")) {
uint32_t u;
sscanf(buf, "asinhf %x", &u);
Expand Down
6 changes: 6 additions & 0 deletions src/libm-tester/iutsimd.c
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,9 @@ int do_test(int argc, char **argv) {
func_d_d("sinh", xsinh);
func_d_d("cosh", xcosh);
func_d_d("tanh", xtanh);
func_d_d("sinh_u35", xsinh_u35);
func_d_d("cosh_u35", xcosh_u35);
func_d_d("tanh_u35", xtanh_u35);
func_d_d("asinh", xasinh);
func_d_d("acosh", xacosh);
func_d_d("atanh", xatanh);
Expand Down Expand Up @@ -496,6 +499,9 @@ int do_test(int argc, char **argv) {
func_f_f("sinhf", xsinhf);
func_f_f("coshf", xcoshf);
func_f_f("tanhf", xtanhf);
func_f_f("sinhf_u35", xsinhf_u35);
func_f_f("coshf_u35", xcoshf_u35);
func_f_f("tanhf_u35", xtanhf_u35);
func_f_f("asinhf", xasinhf);
func_f_f("acoshf", xacoshf);
func_f_f("atanhf", xatanhf);
Expand Down
106 changes: 106 additions & 0 deletions src/libm-tester/tester.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,9 @@ double child_sqrt_u35(double x) { child_d_d("sqrt_u35", x); }
double child_sinh(double x) { child_d_d("sinh", x); }
double child_cosh(double x) { child_d_d("cosh", x); }
double child_tanh(double x) { child_d_d("tanh", x); }
double child_sinh_u35(double x) { child_d_d("sinh_u35", x); }
double child_cosh_u35(double x) { child_d_d("cosh_u35", x); }
double child_tanh_u35(double x) { child_d_d("tanh_u35", x); }
double child_asinh(double x) { child_d_d("asinh", x); }
double child_acosh(double x) { child_d_d("acosh", x); }
double child_atanh(double x) { child_d_d("atanh", x); }
Expand Down Expand Up @@ -285,6 +288,9 @@ float child_sqrtf_u35(float x) { child_f_f("sqrtf_u35", x); }
float child_sinhf(float x) { child_f_f("sinhf", x); }
float child_coshf(float x) { child_f_f("coshf", x); }
float child_tanhf(float x) { child_f_f("tanhf", x); }
float child_sinhf_u35(float x) { child_f_f("sinhf_u35", x); }
float child_coshf_u35(float x) { child_f_f("coshf_u35", x); }
float child_tanhf_u35(float x) { child_f_f("tanhf_u35", x); }
float child_asinhf(float x) { child_f_f("asinhf", x); }
float child_acoshf(float x) { child_f_f("acoshf", x); }
float child_atanhf(float x) { child_f_f("atanhf", x); }
Expand Down Expand Up @@ -2402,6 +2408,27 @@ void do_test() {
showResult(success);
}

{
fprintf(stderr, "sinh_u35 denormal/nonnumber test : ");
double xa[] = { +0.0, -0.0, +1, -1, +1e+10, -1e+10, DBL_MAX, -DBL_MAX, DBL_MIN, -DBL_MIN, POSITIVE_INFINITY, NEGATIVE_INFINITY, NAN };
for(i=0;i<sizeof(xa)/sizeof(double) && success;i++) cmpDenorm_d(mpfr_sinh, child_sinh_u35, xa[i]);
showResult(success);
}

{
fprintf(stderr, "cosh_u35 denormal/nonnumber test : ");
double xa[] = { +0.0, -0.0, +1, -1, +1e+10, -1e+10, DBL_MAX, -DBL_MAX, DBL_MIN, -DBL_MIN, POSITIVE_INFINITY, NEGATIVE_INFINITY, NAN };
for(i=0;i<sizeof(xa)/sizeof(double) && success;i++) cmpDenorm_d(mpfr_cosh, child_cosh_u35, xa[i]);
showResult(success);
}

{
fprintf(stderr, "tanh_u35 denormal/nonnumber test : ");
double xa[] = { +0.0, -0.0, +1, -1, +1e+10, -1e+10, DBL_MAX, -DBL_MAX, DBL_MIN, -DBL_MIN, POSITIVE_INFINITY, NEGATIVE_INFINITY, NAN };
for(i=0;i<sizeof(xa)/sizeof(double) && success;i++) cmpDenorm_d(mpfr_tanh, child_tanh_u35, xa[i]);
showResult(success);
}

{
fprintf(stderr, "asinh denormal/nonnumber test : ");
double xa[] = { +0.0, -0.0, +1, -1, +1e+10, -1e+10, DBL_MIN, -DBL_MIN, POSITIVE_INFINITY, NEGATIVE_INFINITY, NAN };
Expand Down Expand Up @@ -2930,6 +2957,37 @@ void do_test() {
showResult(success);
}

{
fprintf(stderr, "sinhf_u35 denormal/nonnumber test : ");
if (enableFlushToZero) {
float xa[] = { +0.0, -0.0, +1, -1, +1e+7, -1e+7, FLT_MAX, -FLT_MAX, POSITIVE_INFINITYf, NEGATIVE_INFINITYf, NAN };
for(i=0;i<sizeof(xa)/sizeof(float) && success;i++) cmpDenorm_f(mpfr_sinh, child_sinhf_u35, xa[i]);
} else {
float xa[] = { +0.0, -0.0, +1, -1, +1e+7, -1e+7, FLT_MAX, -FLT_MAX, FLT_MIN, -FLT_MIN, POSITIVE_INFINITYf, NEGATIVE_INFINITYf, NAN };
for(i=0;i<sizeof(xa)/sizeof(float) && success;i++) cmpDenorm_f(mpfr_sinh, child_sinhf_u35, xa[i]);
}
showResult(success);
}

{
fprintf(stderr, "coshf_u35 denormal/nonnumber test : ");
float xa[] = { +0.0, -0.0, +1, -1, +1e+7, -1e+7, FLT_MAX, -FLT_MAX, FLT_MIN, -FLT_MIN, POSITIVE_INFINITYf, NEGATIVE_INFINITYf, NAN };
for(i=0;i<sizeof(xa)/sizeof(float) && success;i++) cmpDenorm_f(mpfr_cosh, child_coshf_u35, xa[i]);
showResult(success);
}

{
fprintf(stderr, "tanhf_u35 denormal/nonnumber test : ");
if (enableFlushToZero) {
float xa[] = { +0.0, -0.0, +1, -1, +1e+7, -1e+7, FLT_MAX, -FLT_MAX, POSITIVE_INFINITYf, NEGATIVE_INFINITYf, NAN };
for(i=0;i<sizeof(xa)/sizeof(float) && success;i++) cmpDenorm_f(mpfr_tanh, child_tanhf_u35, xa[i]);
} else {
float xa[] = { +0.0, -0.0, +1, -1, +1e+7, -1e+7, FLT_MAX, -FLT_MAX, FLT_MIN, -FLT_MIN, POSITIVE_INFINITYf, NEGATIVE_INFINITYf, NAN };
for(i=0;i<sizeof(xa)/sizeof(float) && success;i++) cmpDenorm_f(mpfr_tanh, child_tanhf_u35, xa[i]);
}
showResult(success);
}

{
fprintf(stderr, "asinhf denormal/nonnumber test : ");
if (enableFlushToZero) {
Expand Down Expand Up @@ -3817,6 +3875,27 @@ void do_test() {

//

fprintf(stderr, "sinh_u35 : ");
for(d = -10;d < 10 && success;d += 0.002) checkAccuracy_d(mpfr_sinh, child_sinh_u35, d, 3.5);
for(d = -709;d < 709 && success;d += 0.2) checkAccuracy_d(mpfr_sinh, child_sinh_u35, d, 3.5);
showResult(success);

//

fprintf(stderr, "cosh_u35 : ");
for(d = -10;d < 10 && success;d += 0.002) checkAccuracy_d(mpfr_cosh, child_cosh_u35, d, 3.5);
for(d = -709;d < 709 && success;d += 0.2) checkAccuracy_d(mpfr_cosh, child_cosh_u35, d, 3.5);
showResult(success);

//

fprintf(stderr, "tanh_u35 : ");
for(d = -10;d < 10 && success;d += 0.002) checkAccuracy_d(mpfr_tanh, child_tanh_u35, d, 3.5);
for(d = -1000;d < 1000 && success;d += 0.2) checkAccuracy_d(mpfr_tanh, child_tanh_u35, d, 3.5);
showResult(success);

//

fprintf(stderr, "asinh : ");
for(d = -10;d < 10 && success;d += 0.002) checkAccuracy_d(mpfr_asinh, child_asinh, d, 1.0);
for(d = -1000;d < 1000 && success;d += 0.2) checkAccuracy_d(mpfr_asinh, child_asinh, d, 1.0);
Expand Down Expand Up @@ -4561,6 +4640,33 @@ void do_test() {

//

fprintf(stderr, "sinhf_u35 : ");
for(d = -10;d < 10 && success;d += 0.002) checkAccuracy_f(mpfr_sinh, child_sinhf_u35, d, 3.5);
if (!enableFlushToZero) {
for(d = -88;d < 88 && success;d += 0.2) checkAccuracy_f(mpfr_sinh, child_sinhf_u35, d, 3.5);
}
showResult(success);

//

fprintf(stderr, "coshf_u35 : ");
for(d = -10;d < 10 && success;d += 0.002) checkAccuracy_f(mpfr_cosh, child_coshf_u35, d, 3.5);
if (!enableFlushToZero) {
for(d = -88;d < 88 && success;d += 0.2) checkAccuracy_f(mpfr_cosh, child_coshf_u35, d, 3.5);
}
showResult(success);

//

fprintf(stderr, "tanhf_u35 : ");
for(d = -10;d < 10 && success;d += 0.002) checkAccuracy_f(mpfr_tanh, child_tanhf_u35, d, 3.5);
if (!enableFlushToZero) {
for(d = -1000;d < 1000 && success;d += 0.2) checkAccuracy_f(mpfr_tanh, child_tanhf_u35, d, 3.5);
}
showResult(success);

//

fprintf(stderr, "asinhf : ");
for(d = -10;d < 10 && success;d += 0.002) checkAccuracy_f(mpfr_asinh, child_asinhf, d, 1.0);
if (!enableFlushToZero) {
Expand Down
38 changes: 38 additions & 0 deletions src/libm-tester/tester2dp.c
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,44 @@ int main(int argc,char **argv)
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
mpfr_sinh(frx, frx, GMP_RNDN);

double u0 = countULPdp(t = xsinh_u35(d), frx);

if ((fabs(d) <= 709 && u0 > 3.5) ||
(d > 709 && !(u0 <= 3.5 || (isinf(t) && t > 0))) ||
(d < -709 && !(u0 <= 3.5 || (isinf(t) && t < 0)))) {
printf("Pure C sinh_u35 arg=%.20g ulp=%.20g\n", d, u0);
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
mpfr_cosh(frx, frx, GMP_RNDN);

double u0 = countULPdp(t = xcosh_u35(d), frx);

if ((fabs(d) <= 709 && u0 > 3.5) || !(u0 <= 3.5 || (isinf(t) && t > 0))) {
printf("Pure C cosh_u35 arg=%.20g ulp=%.20g\n", d, u0);
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
mpfr_tanh(frx, frx, GMP_RNDN);

double u0 = countULPdp(t = xtanh_u35(d), frx);

if (u0 > 3.5) {
printf("Pure C tanh_u35 arg=%.20g ulp=%.20g\n", d, u0);
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
Expand Down
41 changes: 41 additions & 0 deletions src/libm-tester/tester2simddp.c
Original file line number Diff line number Diff line change
Expand Up @@ -677,6 +677,47 @@ int main(int argc,char **argv)
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
mpfr_sinh(frx, frx, GMP_RNDN);

double u0 = countULPdp(t = vget(xsinh_u35(vd), e), frx);

if ((fabs(d) <= 709 && u0 > 3.5) ||
(d > 709 && !(u0 <= 3.5 || (isinf(t) && t > 0))) ||
(d < -709 && !(u0 <= 3.5 || (isinf(t) && t < 0)))) {
printf(ISANAME " sinh_u35 arg=%.20g ulp=%.20g\n", d, u0);
printf("correct = %.20g, test = %.20g\n", mpfr_get_d(frx, GMP_RNDN), t);
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
mpfr_cosh(frx, frx, GMP_RNDN);

double u0 = countULPdp(t = vget(xcosh_u35(vd), e), frx);

if ((fabs(d) <= 709 && u0 > 3.5) || !(u0 <= 3.5 || (isinf(t) && t > 0))) {
printf(ISANAME " cosh_u35 arg=%.20g ulp=%.20g\n", d, u0);
printf("correct = %.20g, test = %.20g\n", mpfr_get_d(frx, GMP_RNDN), t);
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
mpfr_tanh(frx, frx, GMP_RNDN);

double u0 = countULPdp(t = vget(xtanh_u35(vd), e), frx);

if (u0 > 3.5) {
printf(ISANAME " tanh_u35 arg=%.20g ulp=%.20g\n", d, u0);
printf("correct = %.20g, test = %.20g\n", mpfr_get_d(frx, GMP_RNDN), t);
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
Expand Down
38 changes: 38 additions & 0 deletions src/libm-tester/tester2simdsp.c
Original file line number Diff line number Diff line change
Expand Up @@ -643,6 +643,44 @@ int main(int argc,char **argv)
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
mpfr_sinh(frx, frx, GMP_RNDN);

double u0 = countULPsp(t = vget(xsinhf_u35(vd), e), frx);

if ((fabs(d) <= 88 && u0 > 3.5) ||
(d > 88 && !(u0 <= 3.5 || (isinf(t) && t > 0))) ||
(d < -88 && !(u0 <= 3.5 || (isinf(t) && t < 0)))) {
printf(ISANAME " sinhf_u35 arg=%.20g ulp=%.20g\n", d, u0);
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
mpfr_cosh(frx, frx, GMP_RNDN);

double u0 = countULPsp(t = vget(xcoshf_u35(vd), e), frx);

if ((fabs(d) <= 88 && u0 > 3.5) || !(u0 <= 3.5 || (isinf(t) && t > 0))) {
printf(ISANAME " coshf_u35 arg=%.20g ulp=%.20g\n", d, u0);
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
mpfr_tanh(frx, frx, GMP_RNDN);

double u0 = countULPsp(t = vget(xtanhf_u35(vd), e), frx);

if (u0 > 3.5) {
printf(ISANAME " tanhf_u35 arg=%.20g ulp=%.20g\n", d, u0);
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
mpfr_asinh(frx, frx, GMP_RNDN);
Expand Down
38 changes: 38 additions & 0 deletions src/libm-tester/tester2sp.c
Original file line number Diff line number Diff line change
Expand Up @@ -538,6 +538,44 @@ int main(int argc,char **argv)
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
mpfr_sinh(frx, frx, GMP_RNDN);

double u0 = countULPsp(t = xsinhf_u35(d), frx);

if ((fabs(d) <= 88 && u0 > 3.5) ||
(d > 88 && !(u0 <= 3.5 || (isinf(t) && t > 0))) ||
(d < -88 && !(u0 <= 3.5 || (isinf(t) && t < 0)))) {
printf("Pure C sinhf_u35 arg=%.20g ulp=%.20g\n", d, u0);
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
mpfr_cosh(frx, frx, GMP_RNDN);

double u0 = countULPsp(t = xcoshf_u35(d), frx);

if ((fabs(d) <= 88 && u0 > 3.5) || !(u0 <= 3.5 || (isinf(t) && t > 0))) {
printf("Pure C coshf_u35 arg=%.20g ulp=%.20g\n", d, u0);
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
mpfr_tanh(frx, frx, GMP_RNDN);

double u0 = countULPsp(t = xtanhf_u35(d), frx);

if (u0 > 3.5) {
printf("Pure C tanhf_u35 arg=%.20g ulp=%.20g\n", d, u0);
fflush(stdout); ecnt++;
}
}

{
mpfr_set_d(frx, d, GMP_RNDN);
Expand Down
Loading