Skip to content

Instantly share code, notes, and snippets.

@rprichard
Last active February 26, 2021 12:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rprichard/8a4e8c3edd73ffbceb187a9e8cb7e9ed to your computer and use it in GitHub Desktop.
Save rprichard/8a4e8c3edd73ffbceb187a9e8cb7e9ed to your computer and use it in GitHub Desktop.
scalbn and ldexp rounding edge cases
#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;
}
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]
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]
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