Last active
February 26, 2021 12:16
-
-
Save rprichard/8a4e8c3edd73ffbceb187a9e8cb7e9ed to your computer and use it in GitHub Desktop.
scalbn and ldexp rounding edge cases
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <errno.h> | |
#include <fenv.h> | |
#include <float.h> | |
#include <math.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
const char* round_mode_to_str(int round_mode) { | |
switch (round_mode) { | |
case FE_TONEAREST: return "NEAR"; | |
case FE_UPWARD: return "UP__"; | |
case FE_DOWNWARD: return "DOWN"; | |
case FE_TOWARDZERO: return "ZERO"; | |
default: | |
fprintf(stderr, "unhandled mode: %d\n", round_mode); | |
abort(); | |
} | |
} | |
const char* errhandling_mode() { | |
#if defined(MATH_ERRNO) && defined(MATH_ERREXCEPT) | |
int mode = math_errhandling; | |
if (mode == MATH_ERRNO) return "errno"; | |
if (mode == MATH_ERREXCEPT) return "errexcept"; | |
if (mode == (MATH_ERRNO | MATH_ERREXCEPT)) return "errno|errexcept"; | |
static char buf[128]; | |
snprintf(buf, sizeof(buf), "[unknown:%d]", mode); | |
return buf; | |
#else | |
return "<MATH_ERRNO and/or MATH_ERREXCEPT not defined>"; | |
#endif | |
} | |
enum { | |
kExceptMask = FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | |
}; | |
char* except_to_str(int exc, char* buf) { | |
char* ptr = buf; | |
*ptr = '\0'; | |
if (exc & FE_DIVBYZERO) *ptr++ = '/'; | |
if (exc & FE_INEXACT) *ptr++ = '~'; | |
if (exc & FE_INVALID) *ptr++ = '!'; | |
if (exc & FE_OVERFLOW) *ptr++ = 'o'; | |
if (exc & FE_UNDERFLOW) *ptr++ = 'u'; | |
*ptr++ = '\0'; | |
return buf; | |
} | |
const char* err_to_str(int err) { | |
switch (err) { | |
case 0: return "0"; | |
case ERANGE: return "ERANGE"; | |
case EDOM: return "EDOM"; | |
default: return strerror(err); | |
} | |
} | |
static void dump_result(double result, int err, int exc) { | |
char exc_buf[42]; | |
printf("[%a errno=%s exc=%s]", result, err_to_str(err), except_to_str(exc, exc_buf)); | |
} | |
static void test_value(int round_mode, double x, int adj) { | |
fesetround(round_mode); | |
double result; | |
printf(" round_mode=%s, x=%a, adj=%d: ", round_mode_to_str(round_mode), x, adj); | |
feclearexcept(kExceptMask); | |
errno = 0; | |
double ldexp_result = ldexp(x, adj); | |
int ldexp_err = errno; | |
int ldexp_exc = fetestexcept(kExceptMask); | |
feclearexcept(kExceptMask); | |
errno = 0; | |
double scalbn_result = scalbn(x, adj); | |
int scalbn_err = errno; | |
int scalbn_exc = fetestexcept(kExceptMask); | |
if (scalbn_result == ldexp_result && scalbn_err == ldexp_err && scalbn_exc == ldexp_exc) { | |
printf("both:"); | |
dump_result(scalbn_result, scalbn_err, scalbn_exc); | |
} else { | |
printf("scalbn:"); | |
dump_result(scalbn_result, scalbn_err, scalbn_exc); | |
printf(" ldexp:"); | |
dump_result(ldexp_result, ldexp_err, ldexp_exc); | |
} | |
if (fegetround() != round_mode) { | |
printf("error: rounding mode changed to %d\n", fegetround()); | |
} | |
printf("\n"); | |
} | |
int main() { | |
printf("math_errhandling=%s\n", errhandling_mode()); | |
printf("normal to normal:\n"); | |
test_value(FE_TONEAREST, 1, 4); | |
printf("normal to subnormal (is errno set?):\n"); | |
test_value(FE_TONEAREST, DBL_MIN, -1); | |
printf("overflow:\n"); | |
test_value(FE_TONEAREST, DBL_MAX, 1); | |
test_value(FE_TONEAREST, -DBL_MAX, 1); | |
test_value(FE_DOWNWARD, DBL_MAX, 1); | |
test_value(FE_TOWARDZERO, DBL_MAX, 1); | |
test_value(FE_UPWARD, -DBL_MAX, 1); | |
test_value(FE_TOWARDZERO, -DBL_MAX, 1); | |
printf("underflow:\n"); | |
test_value(FE_TONEAREST, DBL_MIN, -100); | |
test_value(FE_TOWARDZERO, DBL_MIN, -100); | |
test_value(FE_DOWNWARD, DBL_MIN, -100); | |
test_value(FE_UPWARD, DBL_MIN, -100); | |
test_value(FE_TONEAREST, -DBL_MIN, -100); | |
test_value(FE_TOWARDZERO, -DBL_MIN, -100); | |
test_value(FE_UPWARD, -DBL_MIN, -100); | |
test_value(FE_DOWNWARD, -DBL_MIN, -100); | |
printf("subnormal -- not underflow, but rounds:\n"); | |
test_value(FE_TONEAREST, DBL_TRUE_MIN * 7.0, -1); | |
test_value(FE_UPWARD, DBL_TRUE_MIN * 7.0, -1); | |
test_value(FE_DOWNWARD, DBL_TRUE_MIN * 7.0, -1); | |
printf("subnormal rounding -- MSVC: scalbn rounds to nearest-even, ldexp rounds towards zero:\n"); | |
for (int sign = 1; sign >= -1; sign -= 2) { | |
for (int mult = 9; mult <= 13; mult += 2) { | |
test_value(FE_TONEAREST, DBL_TRUE_MIN * mult * sign, -1); | |
test_value(FE_UPWARD, DBL_TRUE_MIN * mult * sign, -1); | |
test_value(FE_DOWNWARD, DBL_TRUE_MIN * mult * sign, -1); | |
} | |
} | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
math_errhandling=errno|errexcept | |
normal to normal: | |
round_mode=NEAR, x=0x1p+0, adj=4: both:[0x1p+4 errno=0 exc=] | |
normal to subnormal (is errno set?): | |
round_mode=NEAR, x=0x1p-1022, adj=-1: both:[0x0.8p-1022 errno=0 exc=] | |
overflow: | |
round_mode=NEAR, x=0x1.fffffffffffffp+1023, adj=1: both:[inf errno=ERANGE exc=~o] | |
round_mode=NEAR, x=-0x1.fffffffffffffp+1023, adj=1: both:[-inf errno=ERANGE exc=~o] | |
round_mode=DOWN, x=0x1.fffffffffffffp+1023, adj=1: both:[0x1.fffffffffffffp+1023 errno=0 exc=~o] | |
round_mode=ZERO, x=0x1.fffffffffffffp+1023, adj=1: both:[0x1.fffffffffffffp+1023 errno=0 exc=~o] | |
round_mode=UP__, x=-0x1.fffffffffffffp+1023, adj=1: both:[-0x1.fffffffffffffp+1023 errno=0 exc=~o] | |
round_mode=ZERO, x=-0x1.fffffffffffffp+1023, adj=1: both:[-0x1.fffffffffffffp+1023 errno=0 exc=~o] | |
underflow: | |
round_mode=NEAR, x=0x1p-1022, adj=-100: both:[0x0p+0 errno=ERANGE exc=~u] | |
round_mode=ZERO, x=0x1p-1022, adj=-100: both:[0x0p+0 errno=ERANGE exc=~u] | |
round_mode=DOWN, x=0x1p-1022, adj=-100: both:[0x0p+0 errno=ERANGE exc=~u] | |
round_mode=UP__, x=0x1p-1022, adj=-100: both:[0x0.0000000000001p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=-0x1p-1022, adj=-100: both:[-0x0p+0 errno=ERANGE exc=~u] | |
round_mode=ZERO, x=-0x1p-1022, adj=-100: both:[-0x0p+0 errno=ERANGE exc=~u] | |
round_mode=UP__, x=-0x1p-1022, adj=-100: both:[-0x0p+0 errno=ERANGE exc=~u] | |
round_mode=DOWN, x=-0x1p-1022, adj=-100: both:[-0x0.0000000000001p-1022 errno=0 exc=~u] | |
subnormal -- not underflow, but rounds: | |
round_mode=NEAR, x=0x0.0000000000007p-1022, adj=-1: both:[0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=0x0.0000000000007p-1022, adj=-1: both:[0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=0x0.0000000000007p-1022, adj=-1: both:[0x0.0000000000003p-1022 errno=0 exc=~u] | |
subnormal rounding -- MSVC: scalbn rounds to nearest-even, ldexp rounds towards zero: | |
round_mode=NEAR, x=0x0.0000000000009p-1022, adj=-1: both:[0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=0x0.0000000000009p-1022, adj=-1: both:[0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=0x0.0000000000009p-1022, adj=-1: both:[0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=0x0.000000000000bp-1022, adj=-1: both:[0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=0x0.000000000000bp-1022, adj=-1: both:[0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=0x0.000000000000bp-1022, adj=-1: both:[0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=0x0.000000000000dp-1022, adj=-1: both:[0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=0x0.000000000000dp-1022, adj=-1: both:[0x0.0000000000007p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=0x0.000000000000dp-1022, adj=-1: both:[0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=-0x0.0000000000009p-1022, adj=-1: both:[-0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=-0x0.0000000000009p-1022, adj=-1: both:[-0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=-0x0.0000000000009p-1022, adj=-1: both:[-0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=-0x0.000000000000bp-1022, adj=-1: both:[-0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=-0x0.000000000000bp-1022, adj=-1: both:[-0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=-0x0.000000000000bp-1022, adj=-1: both:[-0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=-0x0.000000000000dp-1022, adj=-1: both:[-0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=-0x0.000000000000dp-1022, adj=-1: both:[-0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=-0x0.000000000000dp-1022, adj=-1: both:[-0x0.0000000000007p-1022 errno=0 exc=~u] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
math_errhandling=<MATH_ERRNO and/or MATH_ERREXCEPT not defined> | |
normal to normal: | |
round_mode=NEAR, x=0x1.0000000000000p+0, adj=4: both:[0x1.0000000000000p+4 errno=0 exc=] | |
normal to subnormal (is errno set?): | |
round_mode=NEAR, x=0x1.0000000000000p-1022, adj=-1: both:[0x0.8000000000000p-1022 errno=0 exc=] | |
overflow: | |
round_mode=NEAR, x=0x1.fffffffffffffp+1023, adj=1: scalbn:[inf errno=0 exc=~o] ldexp:[inf errno=ERANGE exc=~o] | |
round_mode=NEAR, x=-0x1.fffffffffffffp+1023, adj=1: scalbn:[-inf errno=0 exc=~o] ldexp:[-inf errno=ERANGE exc=~o] | |
round_mode=DOWN, x=0x1.fffffffffffffp+1023, adj=1: both:[0x1.fffffffffffffp+1023 errno=0 exc=~o] | |
round_mode=ZERO, x=0x1.fffffffffffffp+1023, adj=1: both:[0x1.fffffffffffffp+1023 errno=0 exc=~o] | |
round_mode=UP__, x=-0x1.fffffffffffffp+1023, adj=1: both:[-0x1.fffffffffffffp+1023 errno=0 exc=~o] | |
round_mode=ZERO, x=-0x1.fffffffffffffp+1023, adj=1: both:[-0x1.fffffffffffffp+1023 errno=0 exc=~o] | |
underflow: | |
round_mode=NEAR, x=0x1.0000000000000p-1022, adj=-100: scalbn:[0x0.0000000000000p+0 errno=0 exc=~u] ldexp:[0x0.0000000000000p+0 errno=ERANGE exc=~u] | |
round_mode=ZERO, x=0x1.0000000000000p-1022, adj=-100: scalbn:[0x0.0000000000000p+0 errno=0 exc=~u] ldexp:[0x0.0000000000000p+0 errno=ERANGE exc=~u] | |
round_mode=DOWN, x=0x1.0000000000000p-1022, adj=-100: scalbn:[0x0.0000000000000p+0 errno=0 exc=~u] ldexp:[0x0.0000000000000p+0 errno=ERANGE exc=~u] | |
round_mode=UP__, x=0x1.0000000000000p-1022, adj=-100: both:[0x0.0000000000001p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=-0x1.0000000000000p-1022, adj=-100: scalbn:[-0x0.0000000000000p+0 errno=0 exc=~u] ldexp:[-0x0.0000000000000p+0 errno=ERANGE exc=~u] | |
round_mode=ZERO, x=-0x1.0000000000000p-1022, adj=-100: scalbn:[-0x0.0000000000000p+0 errno=0 exc=~u] ldexp:[-0x0.0000000000000p+0 errno=ERANGE exc=~u] | |
round_mode=UP__, x=-0x1.0000000000000p-1022, adj=-100: scalbn:[-0x0.0000000000000p+0 errno=0 exc=~u] ldexp:[-0x0.0000000000000p+0 errno=ERANGE exc=~u] | |
round_mode=DOWN, x=-0x1.0000000000000p-1022, adj=-100: both:[-0x0.0000000000001p-1022 errno=0 exc=~u] | |
subnormal -- not underflow, but rounds: | |
round_mode=NEAR, x=0x0.0000000000007p-1022, adj=-1: both:[0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=0x0.0000000000007p-1022, adj=-1: both:[0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=0x0.0000000000007p-1022, adj=-1: both:[0x0.0000000000003p-1022 errno=0 exc=~u] | |
subnormal rounding -- MSVC: scalbn rounds to nearest-even, ldexp rounds towards zero: | |
round_mode=NEAR, x=0x0.0000000000009p-1022, adj=-1: both:[0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=0x0.0000000000009p-1022, adj=-1: both:[0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=0x0.0000000000009p-1022, adj=-1: both:[0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=0x0.000000000000bp-1022, adj=-1: both:[0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=0x0.000000000000bp-1022, adj=-1: both:[0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=0x0.000000000000bp-1022, adj=-1: both:[0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=0x0.000000000000dp-1022, adj=-1: both:[0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=0x0.000000000000dp-1022, adj=-1: both:[0x0.0000000000007p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=0x0.000000000000dp-1022, adj=-1: both:[0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=-0x0.0000000000009p-1022, adj=-1: both:[-0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=-0x0.0000000000009p-1022, adj=-1: both:[-0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=-0x0.0000000000009p-1022, adj=-1: both:[-0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=-0x0.000000000000bp-1022, adj=-1: both:[-0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=-0x0.000000000000bp-1022, adj=-1: both:[-0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=-0x0.000000000000bp-1022, adj=-1: both:[-0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=-0x0.000000000000dp-1022, adj=-1: both:[-0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=-0x0.000000000000dp-1022, adj=-1: both:[-0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=-0x0.000000000000dp-1022, adj=-1: both:[-0x0.0000000000007p-1022 errno=0 exc=~u] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
math_errhandling=errno|errexcept | |
normal to normal: | |
round_mode=NEAR, x=0x1.0000000000000p+0, adj=4: both:[0x1.0000000000000p+4 errno=0 exc=] | |
normal to subnormal (is errno set?): | |
round_mode=NEAR, x=0x1.0000000000000p-1022, adj=-1: scalbn:[0x0.8000000000000p-1022 errno=0 exc=] ldexp:[0x0.8000000000000p-1022 errno=0 exc=~u] | |
overflow: | |
round_mode=NEAR, x=0x1.fffffffffffffp+1023, adj=1: both:[inf errno=ERANGE exc=~o] | |
round_mode=NEAR, x=-0x1.fffffffffffffp+1023, adj=1: both:[-inf errno=ERANGE exc=~o] | |
round_mode=DOWN, x=0x1.fffffffffffffp+1023, adj=1: scalbn:[inf errno=ERANGE exc=~o] ldexp:[0x1.fffffffffffffp+1023 errno=ERANGE exc=~o] | |
round_mode=ZERO, x=0x1.fffffffffffffp+1023, adj=1: scalbn:[inf errno=ERANGE exc=~o] ldexp:[0x1.fffffffffffffp+1023 errno=ERANGE exc=~o] | |
round_mode=UP__, x=-0x1.fffffffffffffp+1023, adj=1: scalbn:[-inf errno=ERANGE exc=~o] ldexp:[-0x1.fffffffffffffp+1023 errno=ERANGE exc=~o] | |
round_mode=ZERO, x=-0x1.fffffffffffffp+1023, adj=1: scalbn:[-inf errno=ERANGE exc=~o] ldexp:[-0x1.fffffffffffffp+1023 errno=ERANGE exc=~o] | |
underflow: | |
round_mode=NEAR, x=0x1.0000000000000p-1022, adj=-100: scalbn:[0x0.0000000000000p+0 errno=ERANGE exc=~u] ldexp:[0x0.0000000000000p+0 errno=0 exc=~u] | |
round_mode=ZERO, x=0x1.0000000000000p-1022, adj=-100: scalbn:[0x0.0000000000000p+0 errno=ERANGE exc=~u] ldexp:[0x0.0000000000000p+0 errno=0 exc=~u] | |
round_mode=DOWN, x=0x1.0000000000000p-1022, adj=-100: scalbn:[0x0.0000000000000p+0 errno=ERANGE exc=~u] ldexp:[0x0.0000000000000p+0 errno=0 exc=~u] | |
round_mode=UP__, x=0x1.0000000000000p-1022, adj=-100: scalbn:[0x0.0000000000000p+0 errno=ERANGE exc=~u] ldexp:[0x0.0000000000000p+0 errno=0 exc=~u] | |
round_mode=NEAR, x=-0x1.0000000000000p-1022, adj=-100: scalbn:[-0x0.0000000000000p+0 errno=ERANGE exc=~u] ldexp:[-0x0.0000000000000p+0 errno=0 exc=~u] | |
round_mode=ZERO, x=-0x1.0000000000000p-1022, adj=-100: scalbn:[-0x0.0000000000000p+0 errno=ERANGE exc=~u] ldexp:[-0x0.0000000000000p+0 errno=0 exc=~u] | |
round_mode=UP__, x=-0x1.0000000000000p-1022, adj=-100: scalbn:[-0x0.0000000000000p+0 errno=ERANGE exc=~u] ldexp:[-0x0.0000000000000p+0 errno=0 exc=~u] | |
round_mode=DOWN, x=-0x1.0000000000000p-1022, adj=-100: scalbn:[-0x0.0000000000000p+0 errno=ERANGE exc=~u] ldexp:[-0x0.0000000000000p+0 errno=0 exc=~u] | |
subnormal -- not underflow, but rounds: | |
round_mode=NEAR, x=0x0.0000000000007p-1022, adj=-1: scalbn:[0x0.0000000000004p-1022 errno=0 exc=] ldexp:[0x0.0000000000003p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=0x0.0000000000007p-1022, adj=-1: scalbn:[0x0.0000000000004p-1022 errno=0 exc=] ldexp:[0x0.0000000000003p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=0x0.0000000000007p-1022, adj=-1: scalbn:[0x0.0000000000004p-1022 errno=0 exc=] ldexp:[0x0.0000000000003p-1022 errno=0 exc=~u] | |
subnormal rounding -- MSVC: scalbn rounds to nearest-even, ldexp rounds towards zero: | |
round_mode=NEAR, x=0x0.0000000000009p-1022, adj=-1: scalbn:[0x0.0000000000004p-1022 errno=0 exc=] ldexp:[0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=0x0.0000000000009p-1022, adj=-1: scalbn:[0x0.0000000000004p-1022 errno=0 exc=] ldexp:[0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=0x0.0000000000009p-1022, adj=-1: scalbn:[0x0.0000000000004p-1022 errno=0 exc=] ldexp:[0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=0x0.000000000000bp-1022, adj=-1: scalbn:[0x0.0000000000006p-1022 errno=0 exc=] ldexp:[0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=0x0.000000000000bp-1022, adj=-1: scalbn:[0x0.0000000000006p-1022 errno=0 exc=] ldexp:[0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=0x0.000000000000bp-1022, adj=-1: scalbn:[0x0.0000000000006p-1022 errno=0 exc=] ldexp:[0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=0x0.000000000000dp-1022, adj=-1: scalbn:[0x0.0000000000006p-1022 errno=0 exc=] ldexp:[0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=0x0.000000000000dp-1022, adj=-1: scalbn:[0x0.0000000000006p-1022 errno=0 exc=] ldexp:[0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=0x0.000000000000dp-1022, adj=-1: scalbn:[0x0.0000000000006p-1022 errno=0 exc=] ldexp:[0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=-0x0.0000000000009p-1022, adj=-1: scalbn:[-0x0.0000000000004p-1022 errno=0 exc=] ldexp:[-0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=-0x0.0000000000009p-1022, adj=-1: scalbn:[-0x0.0000000000004p-1022 errno=0 exc=] ldexp:[-0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=-0x0.0000000000009p-1022, adj=-1: scalbn:[-0x0.0000000000004p-1022 errno=0 exc=] ldexp:[-0x0.0000000000004p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=-0x0.000000000000bp-1022, adj=-1: scalbn:[-0x0.0000000000006p-1022 errno=0 exc=] ldexp:[-0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=-0x0.000000000000bp-1022, adj=-1: scalbn:[-0x0.0000000000006p-1022 errno=0 exc=] ldexp:[-0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=-0x0.000000000000bp-1022, adj=-1: scalbn:[-0x0.0000000000006p-1022 errno=0 exc=] ldexp:[-0x0.0000000000005p-1022 errno=0 exc=~u] | |
round_mode=NEAR, x=-0x0.000000000000dp-1022, adj=-1: scalbn:[-0x0.0000000000006p-1022 errno=0 exc=] ldexp:[-0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=UP__, x=-0x0.000000000000dp-1022, adj=-1: scalbn:[-0x0.0000000000006p-1022 errno=0 exc=] ldexp:[-0x0.0000000000006p-1022 errno=0 exc=~u] | |
round_mode=DOWN, x=-0x0.000000000000dp-1022, adj=-1: scalbn:[-0x0.0000000000006p-1022 errno=0 exc=] ldexp:[-0x0.0000000000006p-1022 errno=0 exc=~u] | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment