[reland][libc][NFC] Use user defined literals to build 128 and 256 bit constants (#81835)

This is a reland of #81746
This commit is contained in:
Guillaume Chatelet 2024-02-15 14:36:58 +01:00 committed by GitHub
parent 95e8a7c863
commit 513e4dc1af
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 2542 additions and 2508 deletions

View File

@ -22,19 +22,19 @@
namespace LIBC_NAMESPACE {
LIBC_INLINE constexpr uint8_t operator""_u8(unsigned long long value) {
return value;
return static_cast<uint8_t>(value);
}
LIBC_INLINE constexpr uint16_t operator""_u16(unsigned long long value) {
return value;
return static_cast<uint16_t>(value);
}
LIBC_INLINE constexpr uint32_t operator""_u32(unsigned long long value) {
return value;
return static_cast<uint32_t>(value);
}
LIBC_INLINE constexpr uint64_t operator""_u64(unsigned long long value) {
return value;
return static_cast<uint64_t>(value);
}
namespace internal {
@ -64,6 +64,7 @@ template <typename T, int base> struct DigitBuffer {
: 0;
LIBC_INLINE_VAR static constexpr size_t MAX_DIGITS =
sizeof(T) * CHAR_BIT / BITS_PER_DIGIT;
LIBC_INLINE_VAR static constexpr uint8_t INVALID_DIGIT = 255;
uint8_t digits[MAX_DIGITS] = {};
size_t size = 0;
@ -74,7 +75,7 @@ template <typename T, int base> struct DigitBuffer {
}
// Returns the digit for a particular character.
// Returns 255 if the character is invalid.
// Returns INVALID_DIGIT if the character is invalid.
LIBC_INLINE static constexpr uint8_t get_digit_value(const char c) {
const auto to_lower = [](char c) { return c | 32; };
const auto is_digit = [](char c) { return c >= '0' && c <= '9'; };
@ -82,10 +83,10 @@ template <typename T, int base> struct DigitBuffer {
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
};
if (is_digit(c))
return c - '0';
return static_cast<uint8_t>(c - '0');
if (base > 10 && is_alpha(c))
return to_lower(c) - 'a' + 10;
return 255;
return static_cast<uint8_t>(to_lower(c) - 'a' + 10);
return INVALID_DIGIT;
}
// Adds a single character to this buffer.
@ -93,7 +94,7 @@ template <typename T, int base> struct DigitBuffer {
if (c == '\'')
return; // ' is valid but not taken into account.
const uint8_t value = get_digit_value(c);
if (value == 255 || size >= MAX_DIGITS) {
if (value == INVALID_DIGIT || size >= MAX_DIGITS) {
// During constant evaluation `__builtin_unreachable` will halt the
// compiler as it is not executable. This is preferable over `assert` that
// will only trigger in debug mode. Also we can't use `static_assert`
@ -131,7 +132,7 @@ struct Parser<LIBC_NAMESPACE::cpp::BigInt<N, false, uint64_t>> {
// Fast path, we consume blocks of uint64_t and creates the BigInt's
// internal representation directly.
using U64ArrayT = cpp::array<uint64_t, UIntT::WORD_COUNT>;
U64ArrayT array;
U64ArrayT array = {};
size_t size = buffer.size;
const uint8_t *digit_ptr = buffer.digits + size;
for (size_t i = 0; i < array.size(); ++i) {

View File

@ -622,6 +622,8 @@ add_entrypoint_object(
DEPENDS
.common_constants
.explogxf
libc.include.errno
libc.include.math
libc.src.__support.CPP.bit
libc.src.__support.CPP.optional
libc.src.__support.FPUtil.dyadic_float
@ -632,10 +634,9 @@ add_entrypoint_object(
libc.src.__support.FPUtil.polyeval
libc.src.__support.FPUtil.rounding_mode
libc.src.__support.FPUtil.triple_double
libc.src.__support.integer_literals
libc.src.__support.macros.optimization
libc.include.errno
libc.src.errno.errno
libc.include.math
COMPILE_OPTIONS
-O3
)
@ -672,6 +673,8 @@ add_entrypoint_object(
DEPENDS
.common_constants
.explogxf
libc.include.errno
libc.include.math
libc.src.__support.CPP.bit
libc.src.__support.CPP.optional
libc.src.__support.FPUtil.dyadic_float
@ -682,10 +685,9 @@ add_entrypoint_object(
libc.src.__support.FPUtil.polyeval
libc.src.__support.FPUtil.rounding_mode
libc.src.__support.FPUtil.triple_double
libc.src.__support.integer_literals
libc.src.__support.macros.optimization
libc.include.errno
libc.src.errno.errno
libc.include.math
COMPILE_OPTIONS
-O3
)
@ -731,6 +733,8 @@ add_entrypoint_object(
DEPENDS
.common_constants
.explogxf
libc.include.errno
libc.include.math
libc.src.__support.CPP.bit
libc.src.__support.CPP.optional
libc.src.__support.FPUtil.dyadic_float
@ -741,10 +745,9 @@ add_entrypoint_object(
libc.src.__support.FPUtil.polyeval
libc.src.__support.FPUtil.rounding_mode
libc.src.__support.FPUtil.triple_double
libc.src.__support.integer_literals
libc.src.__support.macros.optimization
libc.include.errno
libc.src.errno.errno
libc.include.math
COMPILE_OPTIONS
-O3
)
@ -791,6 +794,8 @@ add_entrypoint_object(
DEPENDS
.common_constants
.explogxf
libc.include.errno
libc.include.math
libc.src.__support.CPP.bit
libc.src.__support.CPP.optional
libc.src.__support.FPUtil.dyadic_float
@ -801,10 +806,9 @@ add_entrypoint_object(
libc.src.__support.FPUtil.polyeval
libc.src.__support.FPUtil.rounding_mode
libc.src.__support.FPUtil.triple_double
libc.src.__support.integer_literals
libc.src.__support.macros.optimization
libc.include.errno
libc.src.errno.errno
libc.include.math
COMPILE_OPTIONS
-O3
)
@ -1074,12 +1078,13 @@ add_entrypoint_object(
DEPENDS
.common_constants
.log_range_reduction
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
libc.src.__support.FPUtil.multiply_add
libc.src.__support.FPUtil.polyeval
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.integer_literals
libc.src.__support.macros.optimization
COMPILE_OPTIONS
-O3
@ -1110,12 +1115,13 @@ add_entrypoint_object(
../log1p.h
DEPENDS
.common_constants
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
libc.src.__support.FPUtil.multiply_add
libc.src.__support.FPUtil.polyeval
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.integer_literals
libc.src.__support.macros.optimization
COMPILE_OPTIONS
-O3
@ -1148,12 +1154,13 @@ add_entrypoint_object(
DEPENDS
.common_constants
.log_range_reduction
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
libc.src.__support.FPUtil.multiply_add
libc.src.__support.FPUtil.polyeval
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.integer_literals
libc.src.__support.macros.optimization
COMPILE_OPTIONS
-O3
@ -1186,12 +1193,13 @@ add_entrypoint_object(
DEPENDS
.common_constants
.log_range_reduction
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
libc.src.__support.FPUtil.multiply_add
libc.src.__support.FPUtil.polyeval
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.integer_literals
libc.src.__support.macros.optimization
COMPILE_OPTIONS
-O3

View File

@ -21,6 +21,7 @@
#include "src/__support/FPUtil/rounding_mode.h"
#include "src/__support/FPUtil/triple_double.h"
#include "src/__support/common.h"
#include "src/__support/integer_literals.h"
#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY
#include <errno.h>
@ -31,6 +32,7 @@ using fputil::DoubleDouble;
using fputil::TripleDouble;
using Float128 = typename fputil::DyadicFloat<128>;
using Sign = fputil::Sign;
using LIBC_NAMESPACE::operator""_u128;
// log2(e)
constexpr double LOG2_E = 0x1.71547652b82fep+0;
@ -97,21 +99,15 @@ DoubleDouble poly_approx_dd(const DoubleDouble &dx) {
// For |dx| < 2^-13 + 2^-30:
// | output - exp(dx) | < 2^-126.
Float128 poly_approx_f128(const Float128 &dx) {
using MType = typename Float128::MantissaType;
constexpr Float128 COEFFS_128[]{
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
{Sign::POS, -128, MType({0, 0x8000000000000000})}, // 0.5
{Sign::POS, -130, MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/6
{Sign::POS, -132,
MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/24
{Sign::POS, -134,
MType({0x8888888888888889, 0x8888888888888888})}, // 1/120
{Sign::POS, -137,
MType({0x60b60b60b60b60b6, 0xb60b60b60b60b60b})}, // 1/720
{Sign::POS, -140,
MType({0x00d00d00d00d00d0, 0xd00d00d00d00d00d})}, // 1/5040
{Sign::POS, -127, 0x80000000'00000000'00000000'00000000_u128}, // 1.0
{Sign::POS, -127, 0x80000000'00000000'00000000'00000000_u128}, // 1.0
{Sign::POS, -128, 0x80000000'00000000'00000000'00000000_u128}, // 0.5
{Sign::POS, -130, 0xaaaaaaaa'aaaaaaaa'aaaaaaaa'aaaaaaab_u128}, // 1/6
{Sign::POS, -132, 0xaaaaaaaa'aaaaaaaa'aaaaaaaa'aaaaaaab_u128}, // 1/24
{Sign::POS, -134, 0x88888888'88888888'88888888'88888889_u128}, // 1/120
{Sign::POS, -137, 0xb60b60b6'0b60b60b'60b60b60'b60b60b6_u128}, // 1/720
{Sign::POS, -140, 0xd00d00d0'0d00d00d'00d00d00'd00d00d0_u128}, // 1/5040
};
Float128 p = fputil::polyeval(dx, COEFFS_128[0], COEFFS_128[1], COEFFS_128[2],

View File

@ -21,6 +21,7 @@
#include "src/__support/FPUtil/rounding_mode.h"
#include "src/__support/FPUtil/triple_double.h"
#include "src/__support/common.h"
#include "src/__support/integer_literals.h"
#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY
#include <errno.h>
@ -31,6 +32,7 @@ using fputil::DoubleDouble;
using fputil::TripleDouble;
using Float128 = typename fputil::DyadicFloat<128>;
using Sign = fputil::Sign;
using LIBC_NAMESPACE::operator""_u128;
// log2(10)
constexpr double LOG2_10 = 0x1.a934f0979a371p+1;
@ -99,17 +101,15 @@ DoubleDouble poly_approx_dd(const DoubleDouble &dx) {
// For |dx| < 2^-14:
// | output - 10^dx | < 1.5 * 2^-124.
Float128 poly_approx_f128(const Float128 &dx) {
using MType = typename Float128::MantissaType;
constexpr Float128 COEFFS_128[]{
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
{Sign::POS, -126, MType({0xea56d62b82d30a2d, 0x935d8dddaaa8ac16})},
{Sign::POS, -126, MType({0x80a99ce75f4d5bdb, 0xa9a92639e753443a})},
{Sign::POS, -126, MType({0x6a4f9d7dbf6c9635, 0x82382c8ef1652304})},
{Sign::POS, -124, MType({0x345787019216c7af, 0x12bd7609fd98c44c})},
{Sign::POS, -127, MType({0xcc41ed7e0d27aee5, 0x450a7ff47535d889})},
{Sign::POS, -130, MType({0x8326bb91a6e7601d, 0xd3f6b844702d636b})},
{Sign::POS, -130, MType({0xfa7b46df314112a9, 0x45b937f0d05bb1cd})},
{Sign::POS, -127, 0x80000000'00000000'00000000'00000000_u128}, // 1.0
{Sign::POS, -126, 0x935d8ddd'aaa8ac16'ea56d62b'82d30a2d_u128},
{Sign::POS, -126, 0xa9a92639'e753443a'80a99ce7'5f4d5bdb_u128},
{Sign::POS, -126, 0x82382c8e'f1652304'6a4f9d7d'bf6c9635_u128},
{Sign::POS, -124, 0x12bd7609'fd98c44c'34578701'9216c7af_u128},
{Sign::POS, -127, 0x450a7ff4'7535d889'cc41ed7e'0d27aee5_u128},
{Sign::POS, -130, 0xd3f6b844'702d636b'8326bb91'a6e7601d_u128},
{Sign::POS, -130, 0x45b937f0'd05bb1cd'fa7b46df'314112a9_u128},
};
Float128 p = fputil::polyeval(dx, COEFFS_128[0], COEFFS_128[1], COEFFS_128[2],

View File

@ -21,6 +21,7 @@
#include "src/__support/FPUtil/rounding_mode.h"
#include "src/__support/FPUtil/triple_double.h"
#include "src/__support/common.h"
#include "src/__support/integer_literals.h"
#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY
#include <errno.h>
@ -31,6 +32,7 @@ using fputil::DoubleDouble;
using fputil::TripleDouble;
using Float128 = typename fputil::DyadicFloat<128>;
using Sign = fputil::Sign;
using LIBC_NAMESPACE::operator""_u128;
// Error bounds:
// Errors when using double precision.
@ -88,17 +90,15 @@ DoubleDouble poly_approx_dd(const DoubleDouble &dx) {
// For |dx| < 2^-13 + 2^-30:
// | output - exp(dx) | < 2^-126.
Float128 poly_approx_f128(const Float128 &dx) {
using MType = typename Float128::MantissaType;
constexpr Float128 COEFFS_128[]{
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
{Sign::POS, -128, MType({0xc9e3b39803f2f6af, 0xb17217f7d1cf79ab})},
{Sign::POS, -128, MType({0xde2d60dd9c9a1d9f, 0x3d7f7bff058b1d50})},
{Sign::POS, -132, MType({0x9d3b15d9e7fb6897, 0xe35846b82505fc59})},
{Sign::POS, -134, MType({0x184462f6bcd2b9e7, 0x9d955b7dd273b94e})},
{Sign::POS, -137, MType({0x39ea1bb964c51a89, 0xaec3ff3c53398883})},
{Sign::POS, -138, MType({0x842c53418fa8ae61, 0x2861225f345c396a})},
{Sign::POS, -144, MType({0x7abeb5abd5ad2079, 0xffe5fe2d109a319d})},
{Sign::POS, -127, 0x80000000'00000000'00000000'00000000_u128}, // 1.0
{Sign::POS, -128, 0xb17217f7'd1cf79ab'c9e3b398'03f2f6af_u128},
{Sign::POS, -128, 0x3d7f7bff'058b1d50'de2d60dd'9c9a1d9f_u128},
{Sign::POS, -132, 0xe35846b8'2505fc59'9d3b15d9'e7fb6897_u128},
{Sign::POS, -134, 0x9d955b7d'd273b94e'184462f6'bcd2b9e7_u128},
{Sign::POS, -137, 0xaec3ff3c'53398883'39ea1bb9'64c51a89_u128},
{Sign::POS, -138, 0x2861225f'345c396a'842c5341'8fa8ae61_u128},
{Sign::POS, -144, 0xffe5fe2d'109a319d'7abeb5ab'd5ad2079_u128},
};
Float128 p = fputil::polyeval(dx, COEFFS_128[0], COEFFS_128[1], COEFFS_128[2],

View File

@ -22,6 +22,7 @@
#include "src/__support/FPUtil/rounding_mode.h"
#include "src/__support/FPUtil/triple_double.h"
#include "src/__support/common.h"
#include "src/__support/integer_literals.h"
#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY
#include <errno.h>
@ -39,6 +40,7 @@ using fputil::DoubleDouble;
using fputil::TripleDouble;
using Float128 = typename fputil::DyadicFloat<128>;
using Sign = fputil::Sign;
using LIBC_NAMESPACE::operator""_u128;
// log2(e)
constexpr double LOG2_E = 0x1.71547652b82fep+0;
@ -107,20 +109,14 @@ DoubleDouble poly_approx_dd(const DoubleDouble &dx) {
// For |dx| < 2^-13 + 2^-30:
// | output - exp(dx) | < 2^-126.
Float128 poly_approx_f128(const Float128 &dx) {
using MType = typename Float128::MantissaType;
constexpr Float128 COEFFS_128[]{
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
{Sign::POS, -128, MType({0, 0x8000000000000000})}, // 0.5
{Sign::POS, -130, MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/6
{Sign::POS, -132,
MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/24
{Sign::POS, -134,
MType({0x8888888888888889, 0x8888888888888888})}, // 1/120
{Sign::POS, -137,
MType({0x60b60b60b60b60b6, 0xb60b60b60b60b60b})}, // 1/720
{Sign::POS, -140,
MType({0x00d00d00d00d00d0, 0xd00d00d00d00d00d})}, // 1/5040
{Sign::POS, -127, 0x80000000'00000000'00000000'00000000_u128}, // 1.0
{Sign::POS, -128, 0x80000000'00000000'00000000'00000000_u128}, // 0.5
{Sign::POS, -130, 0xaaaaaaaa'aaaaaaaa'aaaaaaaa'aaaaaaab_u128}, // 1/6
{Sign::POS, -132, 0xaaaaaaaa'aaaaaaaa'aaaaaaaa'aaaaaaab_u128}, // 1/24
{Sign::POS, -134, 0x88888888'88888888'88888888'88888889_u128}, // 1/120
{Sign::POS, -137, 0xb60b60b6'0b60b60b'60b60b60'b60b60b6_u128}, // 1/720
{Sign::POS, -140, 0xd00d00d0'0d00d00d'00d00d00'd00d00d0_u128}, // 1/5040
};
Float128 p = fputil::polyeval(dx, COEFFS_128[0], COEFFS_128[1], COEFFS_128[2],
@ -146,7 +142,6 @@ std::ostream &operator<<(std::ostream &OS, const DoubleDouble &r) {
// TODO(lntue): investigate triple-double precision implementation for this
// step.
Float128 expm1_f128(double x, double kd, int idx1, int idx2) {
using MType = typename Float128::MantissaType;
// Recalculate dx:
double t1 = fputil::multiply_add(kd, MLOG_2_EXP2_M12_HI, x); // exact
@ -170,7 +165,8 @@ Float128 expm1_f128(double x, double kd, int idx1, int idx2) {
Float128 exp_mid = fputil::quick_mul(exp_mid1, exp_mid2);
int hi = static_cast<int>(kd) >> 12;
Float128 minus_one{Sign::NEG, -127 - hi, MType({0, 0x8000000000000000})};
Float128 minus_one{Sign::NEG, -127 - hi,
0x80000000'00000000'00000000'00000000_u128};
Float128 exp_mid_m1 = fputil::quick_add(exp_mid, minus_one);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -14,6 +14,7 @@
#include "src/__support/FPUtil/dyadic_float.h"
#include "src/__support/FPUtil/multiply_add.h"
#include "src/__support/common.h"
#include "src/__support/integer_literals.h"
#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY
#include "common_constants.h"
@ -22,19 +23,24 @@ namespace LIBC_NAMESPACE {
// 128-bit precision dyadic floating point numbers.
using Float128 = typename fputil::DyadicFloat<128>;
using MType = typename Float128::MantissaType;
using Sign = fputil::Sign;
using LIBC_NAMESPACE::operator""_u128;
namespace {
// Extra errors from P is from using x^2 to reduce evaluation latency.
constexpr double P_ERR = 0x1.0p-50;
// log(2) with 128-bit prepcision generated by SageMath with:
// sage: (s, m, e) = RealField(128)(2).log().sign_mantissa_exponent();
// sage: print("MType({", hex(m % 2^64), ",", hex((m >> 64) % 2^64), "})");
const Float128 LOG_2(Sign::POS, /*exponent=*/-128, /*mantissa=*/
MType({0xc9e3b39803f2f6af, 0xb17217f7d1cf79ab}));
// log(2) with 128-bit precision generated by SageMath with:
// def format_hex(value):
// l = hex(value)[2:]
// n = 8
// x = [l[i:i + n] for i in range(0, len(l), n)]
// return "0x" + "'".join(x) + "_u128"
// (s, m, e) = RealField(128)(2).log().sign_mantissa_exponent();
// print(format_hex(m));
constexpr Float128 LOG_2(Sign::POS, /*exponent=*/-128, /*mantissa=*/
0xb17217f7'd1cf79ab'c9e3b398'03f2f6af_u128);
// R1[i] = 2^-8 * nearestint( 2^8 / (1 + i * 2^-7) )
constexpr double R1[129] = {
@ -245,139 +251,137 @@ constexpr double P_COEFFS[6] = {-0x1p-1,
// for i in range(129):
// r = 2^-8 * round( 2^8 / (1 + i*2^(-7)) );
// s, m, e = RealField(128)(r).log().sign_mantissa_exponent();
// print("{Sign::POS,", e, ", MType({", hex(m % 2^64), ",", hex((m >> 64) %
// 2^64),
// "})},");
const Float128 LOG_R1[129] = {
{Sign::POS, 0, MType(0)},
{Sign::POS, -134, MType({0x662d417ced007a46, 0x8080abac46f38946})},
{Sign::POS, -133, MType({0x91d082dce3ddcd38, 0x8102b2c49ac23a4f})},
{Sign::POS, -133, MType({0xda5f3cc0b3251dbd, 0xc24929464655f45c})},
{Sign::POS, -132, MType({0xb9e3aea6c444ef07, 0x820aec4f3a222380})},
{Sign::POS, -132, MType({0x521016bd904dc968, 0xa33576a16f1f4c64})},
{Sign::POS, -132, MType({0x27cca0bcc06c2f92, 0xb3e4a796a5dac208})},
{Sign::POS, -132, MType({0xa9dda17056e45ed5, 0xd5779687d887e0d1})},
{Sign::POS, -132, MType({0x606d89093278a939, 0xf7518e0035c3dd83})},
{Sign::POS, -131, MType({0xa7c9859530a45153, 0x8cb9de8a32ab368a})},
{Sign::POS, -131, MType({0x976d3b5b45f6ca0b, 0x9defad3e8f73217a})},
{Sign::POS, -131, MType({0x3e858f08597b3a69, 0xa6988ae903f562ed})},
{Sign::POS, -131, MType({0x6a677b4c8bec22e1, 0xb8069857560707a3})},
{Sign::POS, -131, MType({0xeaf51f66692844ba, 0xc99af2eaca4c4570})},
{Sign::POS, -131, MType({0x46bbf837b4d320c6, 0xd273b2058de1bd49})},
{Sign::POS, -131, MType({0x196ab34ce0bccd12, 0xe442c00de2591b47})},
{Sign::POS, -131, MType({0x3f4e2e660317d55f, 0xed393b1c22351280})},
{Sign::POS, -131, MType({0xc17bd40d8d9291ec, 0xff4489cedeab2ca6})},
{Sign::POS, -130, MType({0x9c5a0fe396f40f1e, 0x88bc74113f23def1})},
{Sign::POS, -130, MType({0x88713268840cbcc0, 0x8d515bf11fb94f1c})},
{Sign::POS, -130, MType({0x65c0da506a088484, 0x968b08643409ceb6})},
{Sign::POS, -130, MType({0x411a5b944aca8708, 0x9b2fe580ac80b17d})},
{Sign::POS, -130, MType({0xa9fb6cf0ecb411b7, 0xa489ec199dab06f2})},
{Sign::POS, -130, MType({0xcad2fb8d48054ae0, 0xa93f2f250dac67d1})},
{Sign::POS, -130, MType({0x149767e410316d2c, 0xadfa035aa1ed8fdc})},
{Sign::POS, -130, MType({0x34c7bc3d32750fde, 0xb780945bab55dce4})},
{Sign::POS, -130, MType({0x8f6ebcfb2016a439, 0xbc4c6c2a226399ef})},
{Sign::POS, -130, MType({0xaa8b6997a402bf30, 0xc5f57f59c7f46155})},
{Sign::POS, -130, MType({0x2c507fb7a3d0bf6a, 0xcad2d6e7b80bf914})},
{Sign::POS, -130, MType({0xd0cb02f33f79c16c, 0xcfb6203844b3209a})},
{Sign::POS, -130, MType({0x58a98f2ad65bee9b, 0xd98ec2bade71e539})},
{Sign::POS, -130, MType({0x4d57da945b5d0aaa, 0xde8439c1dec56877})},
{Sign::POS, -130, MType({0x4e9a750b6b68781d, 0xe37fde37807b84e3})},
{Sign::POS, -130, MType({0xc524848e3443e040, 0xe881bf932af3dac0})},
{Sign::POS, -130, MType({0x3b020fa1820c9492, 0xf29877ff38809091})},
{Sign::POS, -130, MType({0x54d2238f75f969b1, 0xf7ad6f26e7ff2ef7})},
{Sign::POS, -130, MType({0xca0cdf301431b60f, 0xfcc8e3659d9bcbec})},
{Sign::POS, -129, MType({0xf5bd0b5b3479d5f4, 0x80f572b1363487b9})},
{Sign::POS, -129, MType({0x163ceae88f720f1e, 0x86216b3b0b17188b})},
{Sign::POS, -129, MType({0x9c5a0fe396f40f1e, 0x88bc74113f23def1})},
{Sign::POS, -129, MType({0xf7a5168126a58b9a, 0x8b5ae65d67db9acd})},
{Sign::POS, -129, MType({0x5147bdb6ddcaf59c, 0x8dfccb1ad35ca6ed})},
{Sign::POS, -129, MType({0xae91aeba609c8877, 0x90a22b6875c6a1f7})},
{Sign::POS, -129, MType({0xdf5bb3b60554e152, 0x934b1089a6dc93c1})},
{Sign::POS, -129, MType({0x4a5004f3ef063313, 0x95f783e6e49a9cfa})},
{Sign::POS, -129, MType({0xd878bbe3d392be25, 0x9b5b3bb5f088b766})},
{Sign::POS, -129, MType({0x5b035eae273a855f, 0x9e1293b9998c1daa})},
{Sign::POS, -129, MType({0xbb2438273918db7e, 0xa0cda11eaf46390d})},
{Sign::POS, -129, MType({0xf698298adddd7f32, 0xa38c6e138e20d831})},
{Sign::POS, -129, MType({0xe4f5275c2d15c21f, 0xa64f04f0b961df76})},
{Sign::POS, -129, MType({0x8164c759686a2209, 0xa9157039c51ebe70})},
{Sign::POS, -129, MType({0xf72ea07749ce6bd3, 0xabdfba9e468fd6f6})},
{Sign::POS, -129, MType({0x7dd6e688ebb13b03, 0xaeadeefacaf97d35})},
{Sign::POS, -129, MType({0x18ce51fff99479cd, 0xb1801859d56249dc})},
{Sign::POS, -129, MType({0x2756eba00bc33978, 0xb45641f4e350a0d3})},
{Sign::POS, -129, MType({0xbe1116c3466beb6d, 0xb730773578cb90b2})},
{Sign::POS, -129, MType({0x49dc60b2b059a60b, 0xba0ec3b633dd8b09})},
{Sign::POS, -129, MType({0x2efd17781bb3afec, 0xbcf13343e7d9ec7d})},
{Sign::POS, -129, MType({0x37eda996244bccb0, 0xbfd7d1dec0a8df6f})},
{Sign::POS, -129, MType({0x33337789d592e296, 0xc2c2abbb6e5fd56f})},
{Sign::POS, -129, MType({0x1a18fb8f9f9ef280, 0xc5b1cd44596fa51e})},
{Sign::POS, -129, MType({0x688ce7c1a75e341a, 0xc8a5431adfb44ca5})},
{Sign::POS, -129, MType({0x2d7e9307c70c0668, 0xcb9d1a189ab56e76})},
{Sign::POS, -129, MType({0x2d7e9307c70c0668, 0xcb9d1a189ab56e76})},
{Sign::POS, -129, MType({0xef2f3f4f861ad6a9, 0xce995f50af69d861})},
{Sign::POS, -129, MType({0x7f9d79f51dcc7301, 0xd19a201127d3c645})},
{Sign::POS, -129, MType({0x5f53bd2e406e66e7, 0xd49f69e456cf1b79})},
{Sign::POS, -129, MType({0xad88bba7d0cee8e0, 0xd7a94a92466e833a})},
{Sign::POS, -129, MType({0x96c20cca6efe2ac5, 0xdab7d02231484a92})},
{Sign::POS, -129, MType({0xf40a666c87842843, 0xddcb08dc0717d85b})},
{Sign::POS, -129, MType({0x7fe8e1802aba24d6, 0xe0e30349fd1cec80})},
{Sign::POS, -129, MType({0x7fe8e1802aba24d6, 0xe0e30349fd1cec80})},
{Sign::POS, -129, MType({0x3eadb651b49ac53a, 0xe3ffce3a2aa64922})},
{Sign::POS, -129, MType({0x304e1653e71d9973, 0xe72178c0323a1a0f})},
{Sign::POS, -129, MType({0xe9a767a80d6d97e8, 0xea481236f7d35baf})},
{Sign::POS, -129, MType({0x4f91cf4b33e42998, 0xed73aa4264b0ade9})},
{Sign::POS, -129, MType({0x4f91cf4b33e42998, 0xed73aa4264b0ade9})},
{Sign::POS, -129, MType({0xfc66eb6408ff6433, 0xf0a450d139366ca6})},
{Sign::POS, -129, MType({0xac8d42f78d3e65d3, 0xf3da161eed6b9aaf})},
{Sign::POS, -129, MType({0x5a470250d40ebe90, 0xf7150ab5a09f27f4})},
{Sign::POS, -129, MType({0x5a470250d40ebe90, 0xf7150ab5a09f27f4})},
{Sign::POS, -129, MType({0xb780a545a1b54dcf, 0xfa553f7018c966f2})},
{Sign::POS, -129, MType({0x8f05924d258c14c5, 0xfd9ac57bd244217e})},
{Sign::POS, -128, MType({0x89d1b09c70c4010a, 0x8072d72d903d588b})},
{Sign::POS, -128, MType({0x89d1b09c70c4010a, 0x8072d72d903d588b})},
{Sign::POS, -128, MType({0x30d58c3f7e2ea1f, 0x821b05f3b01d6774})},
{Sign::POS, -128, MType({0x20f6fafe8fbb68b9, 0x83c5f8299e2b4091})},
{Sign::POS, -128, MType({0xe21f9f89c1ab80b2, 0x8573b71682a7d21a})},
{Sign::POS, -128, MType({0xe21f9f89c1ab80b2, 0x8573b71682a7d21a})},
{Sign::POS, -128, MType({0x1e005d06dbfa8f8, 0x87244c308e670a66})},
{Sign::POS, -128, MType({0x223111a707b6de2c, 0x88d7c11e3ad53cdc})},
{Sign::POS, -128, MType({0x223111a707b6de2c, 0x88d7c11e3ad53cdc})},
{Sign::POS, -128, MType({0x2eb628dba173c82d, 0x8a8e1fb794b09134})},
{Sign::POS, -128, MType({0xbe2ad19415fe25a5, 0x8c47720791e53313})},
{Sign::POS, -128, MType({0xbe2ad19415fe25a5, 0x8c47720791e53313})},
{Sign::POS, -128, MType({0xbddae1ccce247838, 0x8e03c24d73003959})},
{Sign::POS, -128, MType({0x9b00bf167e95da67, 0x8fc31afe30b2c6de})},
{Sign::POS, -128, MType({0x9b00bf167e95da67, 0x8fc31afe30b2c6de})},
{Sign::POS, -128, MType({0x9b92199ed1a4bab1, 0x918586c5f5e4bf01})},
{Sign::POS, -128, MType({0xdf5bb3b60554e152, 0x934b1089a6dc93c1})},
{Sign::POS, -128, MType({0xdf5bb3b60554e152, 0x934b1089a6dc93c1})},
{Sign::POS, -128, MType({0xf3cbc416a2418012, 0x9513c36876083695})},
{Sign::POS, -128, MType({0xbe1188fbc94e2f15, 0x96dfaabd86fa1646})},
{Sign::POS, -128, MType({0xbe1188fbc94e2f15, 0x96dfaabd86fa1646})},
{Sign::POS, -128, MType({0x1d2f89321647b358, 0x98aed221a03458b6})},
{Sign::POS, -128, MType({0x1d2f89321647b358, 0x98aed221a03458b6})},
{Sign::POS, -128, MType({0xe549f9aaea3cb5e1, 0x9a81456cec642e0f})},
{Sign::POS, -128, MType({0xa2554b2dd4619e63, 0x9c5710b8cbb73a42})},
{Sign::POS, -128, MType({0xa2554b2dd4619e63, 0x9c5710b8cbb73a42})},
{Sign::POS, -128, MType({0x30603d87b6df81ad, 0x9e304061b5fda919})},
{Sign::POS, -128, MType({0x30603d87b6df81ad, 0x9e304061b5fda919})},
{Sign::POS, -128, MType({0x67879c5a30cd1242, 0xa00ce1092e5498c3})},
{Sign::POS, -128, MType({0x67879c5a30cd1242, 0xa00ce1092e5498c3})},
{Sign::POS, -128, MType({0xb7efae08e597e16, 0xa1ecff97c91e267b})},
{Sign::POS, -128, MType({0x83594fab088c0d65, 0xa3d0a93f45169a4a})},
{Sign::POS, -128, MType({0x83594fab088c0d65, 0xa3d0a93f45169a4a})},
{Sign::POS, -128, MType({0xaf6a62a0dec6e073, 0xa5b7eb7cb860fb88})},
{Sign::POS, -128, MType({0xaf6a62a0dec6e073, 0xa5b7eb7cb860fb88})},
{Sign::POS, -128, MType({0x49362382a768847a, 0xa7a2d41ad270c9d7})},
{Sign::POS, -128, MType({0x49362382a768847a, 0xa7a2d41ad270c9d7})},
{Sign::POS, -128, MType({0x8ba4aea614d05701, 0xa991713433c2b998})},
{Sign::POS, -128, MType({0x8ba4aea614d05701, 0xa991713433c2b998})},
{Sign::POS, -128, MType({0x7fe6607ba902ef3c, 0xab83d135dc633301})},
{Sign::POS, -128, MType({0x7fe6607ba902ef3c, 0xab83d135dc633301})},
{Sign::POS, -128, MType({0xd60864fd949b4bd3, 0xad7a02e1b24efd31})},
{Sign::POS, -128, MType({0xd60864fd949b4bd3, 0xad7a02e1b24efd31})},
{Sign::POS, -128, MType({0x66d235ee63073dd, 0xaf74155120c9011c})},
{Sign::POS, -128, MType({0x66d235ee63073dd, 0xaf74155120c9011c})},
{Sign::POS, 0, MType(0)},
// print("{Sign::POS,", e, ", format_hex(m), "},");
constexpr Float128 LOG_R1[129] = {
{Sign::POS, 0, 0_u128},
{Sign::POS, -134, 0x8080abac'46f38946'662d417c'ed007a46_u128},
{Sign::POS, -133, 0x8102b2c4'9ac23a4f'91d082dc'e3ddcd38_u128},
{Sign::POS, -133, 0xc2492946'4655f45c'da5f3cc0'b3251dbd_u128},
{Sign::POS, -132, 0x820aec4f'3a222380'b9e3aea6'c444ef07_u128},
{Sign::POS, -132, 0xa33576a1'6f1f4c64'521016bd'904dc968_u128},
{Sign::POS, -132, 0xb3e4a796'a5dac208'27cca0bc'c06c2f92_u128},
{Sign::POS, -132, 0xd5779687'd887e0d1'a9dda170'56e45ed5_u128},
{Sign::POS, -132, 0xf7518e00'35c3dd83'606d8909'3278a939_u128},
{Sign::POS, -131, 0x8cb9de8a'32ab368a'a7c98595'30a45153_u128},
{Sign::POS, -131, 0x9defad3e'8f73217a'976d3b5b'45f6ca0b_u128},
{Sign::POS, -131, 0xa6988ae9'03f562ed'3e858f08'597b3a69_u128},
{Sign::POS, -131, 0xb8069857'560707a3'6a677b4c'8bec22e1_u128},
{Sign::POS, -131, 0xc99af2ea'ca4c4570'eaf51f66'692844ba_u128},
{Sign::POS, -131, 0xd273b205'8de1bd49'46bbf837'b4d320c6_u128},
{Sign::POS, -131, 0xe442c00d'e2591b47'196ab34c'e0bccd12_u128},
{Sign::POS, -131, 0xed393b1c'22351280'3f4e2e66'0317d55f_u128},
{Sign::POS, -131, 0xff4489ce'deab2ca6'c17bd40d'8d9291ec_u128},
{Sign::POS, -130, 0x88bc7411'3f23def1'9c5a0fe3'96f40f1e_u128},
{Sign::POS, -130, 0x8d515bf1'1fb94f1c'88713268'840cbcc0_u128},
{Sign::POS, -130, 0x968b0864'3409ceb6'65c0da50'6a088484_u128},
{Sign::POS, -130, 0x9b2fe580'ac80b17d'411a5b94'4aca8708_u128},
{Sign::POS, -130, 0xa489ec19'9dab06f2'a9fb6cf0'ecb411b7_u128},
{Sign::POS, -130, 0xa93f2f25'0dac67d1'cad2fb8d'48054ae0_u128},
{Sign::POS, -130, 0xadfa035a'a1ed8fdc'149767e4'10316d2c_u128},
{Sign::POS, -130, 0xb780945b'ab55dce4'34c7bc3d'32750fde_u128},
{Sign::POS, -130, 0xbc4c6c2a'226399ef'8f6ebcfb'2016a439_u128},
{Sign::POS, -130, 0xc5f57f59'c7f46155'aa8b6997'a402bf30_u128},
{Sign::POS, -130, 0xcad2d6e7'b80bf914'2c507fb7'a3d0bf6a_u128},
{Sign::POS, -130, 0xcfb62038'44b3209a'd0cb02f3'3f79c16c_u128},
{Sign::POS, -130, 0xd98ec2ba'de71e539'58a98f2a'd65bee9b_u128},
{Sign::POS, -130, 0xde8439c1'dec56877'4d57da94'5b5d0aaa_u128},
{Sign::POS, -130, 0xe37fde37'807b84e3'4e9a750b'6b68781d_u128},
{Sign::POS, -130, 0xe881bf93'2af3dac0'c524848e'3443e040_u128},
{Sign::POS, -130, 0xf29877ff'38809091'3b020fa1'820c9492_u128},
{Sign::POS, -130, 0xf7ad6f26'e7ff2ef7'54d2238f'75f969b1_u128},
{Sign::POS, -130, 0xfcc8e365'9d9bcbec'ca0cdf30'1431b60f_u128},
{Sign::POS, -129, 0x80f572b1'363487b9'f5bd0b5b'3479d5f4_u128},
{Sign::POS, -129, 0x86216b3b'0b17188b'163ceae8'8f720f1e_u128},
{Sign::POS, -129, 0x88bc7411'3f23def1'9c5a0fe3'96f40f1e_u128},
{Sign::POS, -129, 0x8b5ae65d'67db9acd'f7a51681'26a58b9a_u128},
{Sign::POS, -129, 0x8dfccb1a'd35ca6ed'5147bdb6'ddcaf59c_u128},
{Sign::POS, -129, 0x90a22b68'75c6a1f7'ae91aeba'609c8877_u128},
{Sign::POS, -129, 0x934b1089'a6dc93c1'df5bb3b6'0554e152_u128},
{Sign::POS, -129, 0x95f783e6'e49a9cfa'4a5004f3'ef063313_u128},
{Sign::POS, -129, 0x9b5b3bb5'f088b766'd878bbe3'd392be25_u128},
{Sign::POS, -129, 0x9e1293b9'998c1daa'5b035eae'273a855f_u128},
{Sign::POS, -129, 0xa0cda11e'af46390d'bb243827'3918db7e_u128},
{Sign::POS, -129, 0xa38c6e13'8e20d831'f698298a'dddd7f32_u128},
{Sign::POS, -129, 0xa64f04f0'b961df76'e4f5275c'2d15c21f_u128},
{Sign::POS, -129, 0xa9157039'c51ebe70'8164c759'686a2209_u128},
{Sign::POS, -129, 0xabdfba9e'468fd6f6'f72ea077'49ce6bd3_u128},
{Sign::POS, -129, 0xaeadeefa'caf97d35'7dd6e688'ebb13b03_u128},
{Sign::POS, -129, 0xb1801859'd56249dc'18ce51ff'f99479cd_u128},
{Sign::POS, -129, 0xb45641f4'e350a0d3'2756eba0'0bc33978_u128},
{Sign::POS, -129, 0xb7307735'78cb90b2'be1116c3'466beb6d_u128},
{Sign::POS, -129, 0xba0ec3b6'33dd8b09'49dc60b2'b059a60b_u128},
{Sign::POS, -129, 0xbcf13343'e7d9ec7d'2efd1778'1bb3afec_u128},
{Sign::POS, -129, 0xbfd7d1de'c0a8df6f'37eda996'244bccb0_u128},
{Sign::POS, -129, 0xc2c2abbb'6e5fd56f'33337789'd592e296_u128},
{Sign::POS, -129, 0xc5b1cd44'596fa51e'1a18fb8f'9f9ef280_u128},
{Sign::POS, -129, 0xc8a5431a'dfb44ca5'688ce7c1'a75e341a_u128},
{Sign::POS, -129, 0xcb9d1a18'9ab56e76'2d7e9307'c70c0668_u128},
{Sign::POS, -129, 0xcb9d1a18'9ab56e76'2d7e9307'c70c0668_u128},
{Sign::POS, -129, 0xce995f50'af69d861'ef2f3f4f'861ad6a9_u128},
{Sign::POS, -129, 0xd19a2011'27d3c645'7f9d79f5'1dcc7301_u128},
{Sign::POS, -129, 0xd49f69e4'56cf1b79'5f53bd2e'406e66e7_u128},
{Sign::POS, -129, 0xd7a94a92'466e833a'ad88bba7'd0cee8e0_u128},
{Sign::POS, -129, 0xdab7d022'31484a92'96c20cca'6efe2ac5_u128},
{Sign::POS, -129, 0xddcb08dc'0717d85b'f40a666c'87842843_u128},
{Sign::POS, -129, 0xe0e30349'fd1cec80'7fe8e180'2aba24d6_u128},
{Sign::POS, -129, 0xe0e30349'fd1cec80'7fe8e180'2aba24d6_u128},
{Sign::POS, -129, 0xe3ffce3a'2aa64922'3eadb651'b49ac53a_u128},
{Sign::POS, -129, 0xe72178c0'323a1a0f'304e1653'e71d9973_u128},
{Sign::POS, -129, 0xea481236'f7d35baf'e9a767a8'0d6d97e8_u128},
{Sign::POS, -129, 0xed73aa42'64b0ade9'4f91cf4b'33e42998_u128},
{Sign::POS, -129, 0xed73aa42'64b0ade9'4f91cf4b'33e42998_u128},
{Sign::POS, -129, 0xf0a450d1'39366ca6'fc66eb64'08ff6433_u128},
{Sign::POS, -129, 0xf3da161e'ed6b9aaf'ac8d42f7'8d3e65d3_u128},
{Sign::POS, -129, 0xf7150ab5'a09f27f4'5a470250'd40ebe90_u128},
{Sign::POS, -129, 0xf7150ab5'a09f27f4'5a470250'd40ebe90_u128},
{Sign::POS, -129, 0xfa553f70'18c966f2'b780a545'a1b54dcf_u128},
{Sign::POS, -129, 0xfd9ac57b'd244217e'8f05924d'258c14c5_u128},
{Sign::POS, -128, 0x8072d72d'903d588b'89d1b09c'70c4010a_u128},
{Sign::POS, -128, 0x8072d72d'903d588b'89d1b09c'70c4010a_u128},
{Sign::POS, -128, 0x821b05f3'b01d6774'030d58c3'f7e2ea1f_u128},
{Sign::POS, -128, 0x83c5f829'9e2b4091'20f6fafe'8fbb68b9_u128},
{Sign::POS, -128, 0x8573b716'82a7d21a'e21f9f89'c1ab80b2_u128},
{Sign::POS, -128, 0x8573b716'82a7d21a'e21f9f89'c1ab80b2_u128},
{Sign::POS, -128, 0x87244c30'8e670a66'01e005d0'6dbfa8f8_u128},
{Sign::POS, -128, 0x88d7c11e'3ad53cdc'223111a7'07b6de2c_u128},
{Sign::POS, -128, 0x88d7c11e'3ad53cdc'223111a7'07b6de2c_u128},
{Sign::POS, -128, 0x8a8e1fb7'94b09134'2eb628db'a173c82d_u128},
{Sign::POS, -128, 0x8c477207'91e53313'be2ad194'15fe25a5_u128},
{Sign::POS, -128, 0x8c477207'91e53313'be2ad194'15fe25a5_u128},
{Sign::POS, -128, 0x8e03c24d'73003959'bddae1cc'ce247838_u128},
{Sign::POS, -128, 0x8fc31afe'30b2c6de'9b00bf16'7e95da67_u128},
{Sign::POS, -128, 0x8fc31afe'30b2c6de'9b00bf16'7e95da67_u128},
{Sign::POS, -128, 0x918586c5'f5e4bf01'9b92199e'd1a4bab1_u128},
{Sign::POS, -128, 0x934b1089'a6dc93c1'df5bb3b6'0554e152_u128},
{Sign::POS, -128, 0x934b1089'a6dc93c1'df5bb3b6'0554e152_u128},
{Sign::POS, -128, 0x9513c368'76083695'f3cbc416'a2418012_u128},
{Sign::POS, -128, 0x96dfaabd'86fa1646'be1188fb'c94e2f15_u128},
{Sign::POS, -128, 0x96dfaabd'86fa1646'be1188fb'c94e2f15_u128},
{Sign::POS, -128, 0x98aed221'a03458b6'1d2f8932'1647b358_u128},
{Sign::POS, -128, 0x98aed221'a03458b6'1d2f8932'1647b358_u128},
{Sign::POS, -128, 0x9a81456c'ec642e0f'e549f9aa'ea3cb5e1_u128},
{Sign::POS, -128, 0x9c5710b8'cbb73a42'a2554b2d'd4619e63_u128},
{Sign::POS, -128, 0x9c5710b8'cbb73a42'a2554b2d'd4619e63_u128},
{Sign::POS, -128, 0x9e304061'b5fda919'30603d87'b6df81ad_u128},
{Sign::POS, -128, 0x9e304061'b5fda919'30603d87'b6df81ad_u128},
{Sign::POS, -128, 0xa00ce109'2e5498c3'67879c5a'30cd1242_u128},
{Sign::POS, -128, 0xa00ce109'2e5498c3'67879c5a'30cd1242_u128},
{Sign::POS, -128, 0xa1ecff97'c91e267b'0b7efae0'8e597e16_u128},
{Sign::POS, -128, 0xa3d0a93f'45169a4a'83594fab'088c0d65_u128},
{Sign::POS, -128, 0xa3d0a93f'45169a4a'83594fab'088c0d65_u128},
{Sign::POS, -128, 0xa5b7eb7c'b860fb88'af6a62a0'dec6e073_u128},
{Sign::POS, -128, 0xa5b7eb7c'b860fb88'af6a62a0'dec6e073_u128},
{Sign::POS, -128, 0xa7a2d41a'd270c9d7'49362382'a768847a_u128},
{Sign::POS, -128, 0xa7a2d41a'd270c9d7'49362382'a768847a_u128},
{Sign::POS, -128, 0xa9917134'33c2b998'8ba4aea6'14d05701_u128},
{Sign::POS, -128, 0xa9917134'33c2b998'8ba4aea6'14d05701_u128},
{Sign::POS, -128, 0xab83d135'dc633301'7fe6607b'a902ef3c_u128},
{Sign::POS, -128, 0xab83d135'dc633301'7fe6607b'a902ef3c_u128},
{Sign::POS, -128, 0xad7a02e1'b24efd31'd60864fd'949b4bd3_u128},
{Sign::POS, -128, 0xad7a02e1'b24efd31'd60864fd'949b4bd3_u128},
{Sign::POS, -128, 0xaf741551'20c9011c'066d235e'e63073dd_u128},
{Sign::POS, -128, 0xaf741551'20c9011c'066d235e'e63073dd_u128},
{Sign::POS, 0, 0_u128},
};
// Logarithm range reduction - Step 2:
@ -431,196 +435,196 @@ constexpr double S2[198] = {
// r = 2^-18 * round( 2^18 / (1 + i*2^(-14)) );
// s, m, e = RealField(128)(r).log().sign_mantissa_exponent();
// print("{Sign::POS," if (s == -1) else "{Sign::NEG,", e, ",
// MType({", hex(m % 2^64), ",", hex((m >> 64) % 2^64), "})},");
const Float128 LOG_R2[198] = {
{Sign::NEG, -135, MType({0xa0e061c5f7431c5e, 0xb67dab2a1a5742a4})},
{Sign::NEG, -135, MType({0x5d5bfe7b969ed6ec, 0xb4807f24af682939})},
{Sign::NEG, -135, MType({0x4d08702ddfabc23f, 0xb2834b35b4d54d5f})},
{Sign::NEG, -135, MType({0xd4d366508b9953df, 0xb0860f5ceba9be95})},
{Sign::NEG, -135, MType({0xac18a289f8f214a9, 0xae68f71aa09e8847})},
{Sign::NEG, -135, MType({0xd5b42054abb88c45, 0xac6baaeed676e8f1})},
{Sign::NEG, -135, MType({0x9809d58ee484964, 0xaa6e56d87cd632d6})},
{Sign::NEG, -135, MType({0xb9e6fc7c72f06d73, 0xa870fad754bb8791})},
{Sign::NEG, -135, MType({0x6f78d6d0105c00e2, 0xa67396eb1f231892})},
{Sign::NEG, -135, MType({0x28f712629209148, 0xa4762b139d0626e7})},
{Sign::NEG, -135, MType({0xc98d898ef172df02, 0xa258dfd10aedaa67})},
{Sign::NEG, -135, MType({0xfcc37c3c3062bfa1, 0xa05b63a373e60a83})},
{Sign::NEG, -135, MType({0x3eb450db05763c36, 0x9e5ddf89cf42f501})},
{Sign::NEG, -135, MType({0x7146a86fd458b775, 0x9c605383ddf1b88c})},
{Sign::NEG, -135, MType({0xc20a0c9281474436, 0x9a62bf9160dcb286})},
{Sign::NEG, -135, MType({0xcdc57316ec4aebc3, 0x986523b218eb4ed6})},
{Sign::NEG, -135, MType({0xc060dad74cef4273, 0x96677fe5c70207b9})},
{Sign::NEG, -135, MType({0xed8def1a3e433499, 0x9449f92d2ff44633})},
{Sign::NEG, -135, MType({0x3ce7a1f85c27b4fc, 0x924c45073220b5e0})},
{Sign::NEG, -135, MType({0xf2ca893449f7f2cb, 0x904e88f368fea63f})},
{Sign::NEG, -135, MType({0x8d77d9fabd2853cf, 0x8e50c4f1956699ed})},
{Sign::NEG, -135, MType({0x93e828d75b58ded4, 0x8c52f901782e20ec})},
{Sign::NEG, -135, MType({0x9f9605b053c5acf0, 0x8a552522d227d87a})},
{Sign::NEG, -135, MType({0x62a149393bca7241, 0x8857495564236ae0})},
{Sign::NEG, -135, MType({0xaea6b56ce89203d4, 0x86398719b66bac7c})},
{Sign::NEG, -135, MType({0x242bd86d00609b2, 0x843b9aef044e4dcc})},
{Sign::NEG, -135, MType({0xdaabf92774bac84e, 0x823da6d4c89c6927})},
{Sign::NEG, -135, MType({0xa1c6f3fc242ef8d0, 0x803faacac419abf2})},
{Sign::NEG, -136, MType({0xa225ebc02e6d9dd4, 0xfc834da16f0d9f57})},
{Sign::NEG, -136, MType({0xc33f6ad340ae18a9, 0xf88735ccc7433381})},
{Sign::NEG, -136, MType({0x70b2a4d38a242244, 0xf48b0e171249b6bc})},
{Sign::NEG, -136, MType({0x1d54819048b811b0, 0xf08ed67fd190e280})},
{Sign::NEG, -136, MType({0x9c21b650afe9ede0, 0xec52ca07ed95f236})},
{Sign::NEG, -136, MType({0x935519c96d30e463, 0xe85671adecd28aac})},
{Sign::NEG, -136, MType({0xba88f6f2e2672cfe, 0xe45a0970dc912ca7})},
{Sign::NEG, -136, MType({0xb1a8b84657ae069, 0xe05d91503e298bc8})},
{Sign::NEG, -136, MType({0xea3bff8d197b20a1, 0xdc61094b92ed70ef})},
{Sign::NEG, -136, MType({0xcdbb931d6fecc249, 0xd86471625c28b9e5})},
{Sign::NEG, -136, MType({0xd971d560d5f00820, 0xd467c9941b2158f5})},
{Sign::NEG, -136, MType({0x75563561244c090b, 0xd06b11e051175493})},
{Sign::NEG, -136, MType({0xdc393c9a3f3b380f, 0xcc6e4a467f44c6fa})},
{Sign::NEG, -136, MType({0xe6abe6e9e4ee2096, 0xc831a4c6f6fa709d})},
{Sign::NEG, -136, MType({0x3ce3c8228583a66e, 0xc434bc6124a0f16e})},
{Sign::NEG, -136, MType({0xb96a79f5c5a4963a, 0xc037c413c61bfd93})},
{Sign::NEG, -136, MType({0xaaef27337008679f, 0xbc3abbde5c8d9bde})},
{Sign::NEG, -136, MType({0xa49a3fcaddc8bc5a, 0xb83da3c06911e509})},
{Sign::NEG, -136, MType({0xe0254feb785362fa, 0xb4407bb96cbf035a})},
{Sign::NEG, -136, MType({0x9893a4e25ab9dc95, 0xb04343c8e8a53245})},
{Sign::NEG, -136, MType({0x5d8b0f40a3708915, 0xac45fbee5dcebe0b})},
{Sign::NEG, -136, MType({0x5f4c11c2c7a58c69, 0xa848a4294d40035d})},
{Sign::NEG, -136, MType({0xb348cc5df706ffba, 0xa44b3c7937f76efd})},
{Sign::NEG, -136, MType({0x9159f2c55a18befd, 0xa04dc4dd9eed7d60})},
{Sign::NEG, -136, MType({0xbdfdee41fe6a5a02, 0x9c1064563058bef3})},
{Sign::NEG, -136, MType({0x4580ddf89853254d, 0x9812cbe346475a24})},
{Sign::NEG, -136, MType({0xac75e10d61fc3ee8, 0x9415238353489ffb})},
{Sign::NEG, -136, MType({0xcad9b30b29736155, 0x90176b35d83ce8e2})},
{Sign::NEG, -136, MType({0x6f881deb98fc45f3, 0x8c19a2fa55fe9b14})},
{Sign::NEG, -136, MType({0x70a04b63b7248c96, 0x881bcad04d622a3e})},
{Sign::NEG, -136, MType({0xb4823fb48035eddd, 0x841de2b73f361722})},
{Sign::NEG, -136, MType({0x3364ccb5b13cd47f, 0x801feaaeac42ef38})},
{Sign::NEG, -137, MType({0xe306977b049f0ad5, 0xf843c56c2a969897})},
{Sign::NEG, -137, MType({0xe3c4d9e9619bc045, 0xf0479599f617a843})},
{Sign::NEG, -137, MType({0x4356d525b5e6432d, 0xe84b45e5bc76702c})},
{Sign::NEG, -137, MType({0x7839dcd7989339ab, 0xe04ed64e7f14697a})},
{Sign::NEG, -137, MType({0x4e21f045ecb76f23, 0xd85246d33f47230b})},
{Sign::NEG, -137, MType({0x902e248dd4ba9b28, 0xd0559772fe5840b0})},
{Sign::NEG, -137, MType({0xa44449067ef92e01, 0xc858c82cbd857a72})},
{Sign::NEG, -137, MType({0x17926207cc22e4e6, 0xc05bd8ff7e009bd2})},
{Sign::NEG, -137, MType({0x1c349622f3fa5d82, 0xb85ec9ea40ef8309})},
{Sign::NEG, -137, MType({0x97fa2fd0c9dc723e, 0xafe1c6ece1a058dd})},
{Sign::NEG, -137, MType({0x983e80897cf1e60f, 0xa7e47606048b1a65})},
{Sign::NEG, -137, MType({0x7199cd06ae5d39b3, 0x9fe705341d236102})},
{Sign::NEG, -137, MType({0x43cd18a72a051a96, 0x97e974762c5e8f58})},
{Sign::NEG, -137, MType({0x7b6d1248c3e1fd40, 0x8febc3cb332616ff})},
{Sign::NEG, -137, MType({0xf5572a8814c703af, 0x87edf332325777c5})},
{Sign::NEG, -138, MType({0x26828c92649a3a39, 0xffe0055455887de0})},
{Sign::NEG, -138, MType({0x82c550bd1216d82a, 0xefe3e4643a640cf3})},
{Sign::NEG, -138, MType({0xda6959f7f0e01bf0, 0xdfe7839214b4e8ae})},
{Sign::NEG, -138, MType({0xda93e2fa85a8f214, 0xcfeae2dbe5d6736d})},
{Sign::NEG, -138, MType({0xb47505bfa5a03b06, 0xbfee023faf0c2480})},
{Sign::NEG, -138, MType({0xb1475a5180a43520, 0xaff0e1bb718186ad})},
{Sign::NEG, -138, MType({0xa8740b91c95df537, 0x9ff3814d2e4a36b2})},
{Sign::NEG, -138, MType({0x57d895d35921b59c, 0x8ff5e0f2e661e1c6})},
{Sign::NEG, -139, MType({0x3c56c598c659c2a3, 0xfff0015535588833})},
{Sign::NEG, -139, MType({0x2ef8ec33ed9d782a, 0xdff3c0e497ea4eb1})},
{Sign::NEG, -139, MType({0x379eba7e6465ff63, 0xbff7008ff5e0c257})},
{Sign::NEG, -139, MType({0x3f972b783fcab757, 0x9ff9c0535073a370})},
{Sign::NEG, -140, MType({0xde026e271ee0549d, 0xfff8005551558885})},
{Sign::NEG, -140, MType({0xeceb47ea01f6c632, 0xbffb8023febc0c25})},
{Sign::NEG, -141, MType({0x7333c57857e1ed52, 0xfffc001554d55888})},
{Sign::NEG, -142, MType({0x87dde026fa704374, 0xfffe000555455588})},
{Sign::POS, 0, MType({0x0, 0x0})},
{Sign::POS, -141, MType({0x44999abe2fe2cc65, 0x80010002aab2aac4})},
{Sign::POS, -140, MType({0x4eef381581464ccb, 0x8002000aaaeaac44})},
{Sign::POS, -140, MType({0xdfeb485085f6f454, 0xc004802401440c26})},
{Sign::POS, -139, MType({0x99abe3be3a1c6e93, 0x8004002aacaac445})},
{Sign::POS, -139, MType({0x6bc1e20eac8448b4, 0xa00640535a37a37a})},
{Sign::POS, -139, MType({0x979eedc064c242fd, 0xc00900900a20c275})},
{Sign::POS, -139, MType({0xc72446cc1bf728bd, 0xe00c40e4bd6e4efd})},
{Sign::POS, -138, MType({0xf381b821bbb569e5, 0x800800aabaac446e})},
{Sign::POS, -138, MType({0x569b26aaa485ea5c, 0x900a20f319a3e273})},
{Sign::POS, -138, MType({0x2dcf56c83c80b028, 0xa00c814d7c6a37f8})},
{Sign::POS, -138, MType({0x5f69768284463b9b, 0xb00f21bbe3e388ee})},
{Sign::POS, -138, MType({0xb48ea6c05e2773a1, 0xc0120240510c284c})},
{Sign::POS, -138, MType({0x14d9d76196d8043a, 0xd01522dcc4f87991})},
{Sign::POS, -138, MType({0xe016a611a4415d72, 0xe018839340d4f241})},
{Sign::POS, -138, MType({0x661e135f49a47c40, 0xf01c2465c5e61b6f})},
{Sign::POS, -137, MType({0xbe6bf0fa435e8383, 0x801002ab2ac4499a})},
{Sign::POS, -137, MType({0x9a31ba0cbc030353, 0x881213337898871e})},
{Sign::POS, -137, MType({0x54b57dfe0c4c840f, 0x901443cccd362c9f})},
{Sign::POS, -137, MType({0x7ad1e9c315328f7e, 0x98169478296fad41})},
{Sign::POS, -137, MType({0x1f3f686cf3d6be22, 0xa01905368e2389b3})},
{Sign::POS, -137, MType({0xf105b66ec4703ede, 0xa81b9608fc3c50ec})},
{Sign::POS, -137, MType({0x610848c68df4d233, 0xb01e46f074b0a0f3})},
{Sign::POS, -137, MType({0x2e0efddf33a20464, 0xb7a0e9ed7613acb0})},
{Sign::POS, -137, MType({0xc2cdb3c750f127b4, 0xbfa3d9008e042ffb})},
{Sign::POS, -137, MType({0xbd9533786d3f4c49, 0xc7a6e82ba36a7073})},
{Sign::POS, -137, MType({0x82e237c9a4d450e3, 0xcfaa176fb76c8eb1})},
{Sign::POS, -137, MType({0xc00b46a4d0e3dfd0, 0xd7ad66cdcb3cbe14})},
{Sign::POS, -137, MType({0xea999c0df8546710, 0xdfb0d646e0194584})},
{Sign::POS, -137, MType({0xcec6c2a9ad974f4f, 0xe7b465dbf74c8032})},
{Sign::POS, -137, MType({0x2d2045da1570a07c, 0xefb8158e122cde5a})},
{Sign::POS, -137, MType({0x6752e9b2381e3edc, 0xf7bbe55e321ce603})},
{Sign::POS, -137, MType({0x3c1ed52728e00e40, 0xffbfd54d588b33c5})},
{Sign::POS, -136, MType({0x493b0d873fb9a340, 0x83e1f2ae43793dc3})},
{Sign::POS, -136, MType({0x29e38750c9d26893, 0x87e40ac65f6cc4a0})},
{Sign::POS, -136, MType({0xaab9e8327258ac3f, 0x8be632ef80e9a0df})},
{Sign::POS, -136, MType({0x28bc403d8a5f3c63, 0x8fe86b2a28bf51b3})},
{Sign::POS, -136, MType({0xf720c1c97227fcdc, 0x93eab376d7c36377})},
{Sign::POS, -136, MType({0x6ad9a3e3d11b66c1, 0x97ed0bd60ed17018})},
{Sign::POS, -136, MType({0xedb27b79c90b4019, 0x9bef74484ecb1f6c})},
{Sign::POS, -136, MType({0xa092a0d7ab21722a, 0x9fb1c4cd27012e19})},
{Sign::POS, -136, MType({0x535d52f0939a4d02, 0xa3b44c65b71c2d85})},
{Sign::POS, -136, MType({0x90a57e11edc1864e, 0xa7b6e412cadcb3dc})},
{Sign::POS, -136, MType({0x68e9c90160031159, 0xabb98bd4e33c4381})},
{Sign::POS, -136, MType({0xbf60594f929adeb8, 0xafbc43ac813a6ea3})},
{Sign::POS, -136, MType({0x8a42158886775205, 0xb3bf0b9a25dcd7a2})},
{Sign::POS, -136, MType({0x1ab45417663dee9e, 0xb7c1e39e522f316d})},
{Sign::POS, -136, MType({0x6c51ae3ce1aea68a, 0xbbc4cbb987433fe4})},
{Sign::POS, -136, MType({0x7c52ae8b40ebabb7, 0xbfc7c3ec4630d83c})},
{Sign::POS, -136, MType({0xa857126f7cfaaa67, 0xc3cacc371015e15d})},
{Sign::POS, -136, MType({0x14d05662cd29464a, 0xc7cde49a66165446})},
{Sign::POS, -136, MType({0x8379db06ef3cd6bb, 0xcb90da1644d29bb7})},
{Sign::POS, -136, MType({0x9025f4c67dd38bb6, 0xcf9411aa99ddb7de})},
{Sign::POS, -136, MType({0xd6f8a61c892032ee, 0xd3975958f681086d})},
{Sign::POS, -136, MType({0x9a2f20b4e2332d47, 0xd79ab121dbf8714c})},
{Sign::POS, -136, MType({0x3c767d61f51d375b, 0xdb9e1905cb85ea59})},
{Sign::POS, -136, MType({0xd4b2bd65bb25493c, 0xdfa1910546717fca})},
{Sign::POS, -136, MType({0xc96c1254a30ef91f, 0xe3a51920ce095292})},
{Sign::POS, -136, MType({0x73e324ce0946b214, 0xe7a8b158e3a198be})},
{Sign::POS, -136, MType({0xcacd125a12bac62c, 0xebac59ae08949dd8})},
{Sign::POS, -136, MType({0xcafdc27227b71eaa, 0xef6fd620b2b7a503})},
{Sign::POS, -136, MType({0x688d4282f6026aa3, 0xf3739daf959aaafc})},
{Sign::POS, -136, MType({0xe54e9e3804464cdd, 0xf777755d03f4e0b6})},
{Sign::POS, -136, MType({0xcb78b383f4b59dce, 0xfb7b5d297f388a12})},
{Sign::POS, -136, MType({0xee055fc515062c04, 0xff7f551588de024f})},
{Sign::POS, -135, MType({0x207812b43382acdd, 0x81c1ae90d131de38})},
{Sign::POS, -135, MType({0xdc90c4c4b61f3a87, 0x83c3baa726a721cc})},
{Sign::POS, -135, MType({0x1a03f13fb2c978b1, 0x85c5cece05941dbc})},
{Sign::POS, -135, MType({0xb36f282e83a7dc36, 0x87c7eb05aec1304f})},
{Sign::POS, -135, MType({0xd82a46616d4c393f, 0x89a9eccd56a980c0})},
{Sign::POS, -135, MType({0xbc6ff84713c9babd, 0x8bac18a640185360})},
{Sign::POS, -135, MType({0x9f7942a516fc2d8a, 0x8dae4c90b22574f4})},
{Sign::POS, -135, MType({0x15e50cfd9b29b427, 0x8fb0888ceda546ab})},
{Sign::POS, -135, MType({0x9f465296ae7dd49a, 0x91b2cc9b336f3718})},
{Sign::POS, -135, MType({0xb49c1eb9b348e6e4, 0x93b518bbc45dc268})},
{Sign::POS, -135, MType({0xdaa320cd64c9d9c7, 0x95b76ceee14e728e})},
{Sign::POS, -135, MType({0x75a91950ffe1e3b5, 0x9799a333de49b963})},
{Sign::POS, -135, MType({0x5c6abcbf43f03f14, 0x999c070ba32068cd})},
{Sign::POS, -135, MType({0x5a9e7f265d1ed157, 0x9b9e72f6b295ad4f})},
{Sign::POS, -135, MType({0xefeb98d02a195c17, 0x9da0e6f54d9318fd})},
{Sign::POS, -135, MType({0x2aa503a3110ab5a7, 0x9fa36307b5054ca8})},
{Sign::POS, -135, MType({0xd0fe7e05869eb825, 0xa1a5e72e29dbf808})},
{Sign::POS, -135, MType({0xe80a28f4e1e500d2, 0xa3884a68a750cb10})},
{Sign::POS, -135, MType({0x531064151ca6e30b, 0xa58ade36aeef9f0b})},
{Sign::POS, -135, MType({0x27c01ffa8e2e3c4b, 0xa78d7a1982c4b08f})},
{Sign::POS, -135, MType({0x7ba9408dc857d568, 0xa9901e1163cbbbf5})},
{Sign::POS, -135, MType({0x104d1e3331d3b4fa, 0xab92ca1e93038d76})},
{Sign::POS, -135, MType({0x9343c846fcdf9137, 0xad957e41516e0158})},
{Sign::POS, -135, MType({0x3977e89aec59bfa2, 0xaf780e79b2514889})},
{Sign::POS, -135, MType({0x913d4e3dc55c3e6e, 0xb17ad246ef3713bc})},
{Sign::POS, -135, MType({0x777b52a9e70d8bcc, 0xb37d9e2a7a56b09d})},
{Sign::POS, -135, MType({0x55de916fd30591de, 0xb580722494be0c91})},
{Sign::POS, -135, MType({0xe79cfb37be2861e4, 0xb7834e357f7e2600})},
{Sign::POS, -135, MType({0x90983104d3805389, 0xb986325d7bab0c89})},
{Sign::POS, -135, MType({0x59e3b2ec71ce64f4, 0xbb68ef9c254aa378})},
{Sign::POS, -135, MType({0xe83183bf3dd612ef, 0xbd6be3718c77636f})},
{Sign::POS, -135, MType({0xc4e3b0ac2fd52b7f, 0xbf6edf5ec44d9d35})},
// format_hex(m), "},");
constexpr Float128 LOG_R2[198] = {
{Sign::NEG, -135, 0xb67dab2a'1a5742a4'a0e061c5'f7431c5e_u128},
{Sign::NEG, -135, 0xb4807f24'af682939'5d5bfe7b'969ed6ec_u128},
{Sign::NEG, -135, 0xb2834b35'b4d54d5f'4d08702d'dfabc23f_u128},
{Sign::NEG, -135, 0xb0860f5c'eba9be95'd4d36650'8b9953df_u128},
{Sign::NEG, -135, 0xae68f71a'a09e8847'ac18a289'f8f214a9_u128},
{Sign::NEG, -135, 0xac6baaee'd676e8f1'd5b42054'abb88c45_u128},
{Sign::NEG, -135, 0xaa6e56d8'7cd632d6'09809d58'ee484964_u128},
{Sign::NEG, -135, 0xa870fad7'54bb8791'b9e6fc7c'72f06d73_u128},
{Sign::NEG, -135, 0xa67396eb'1f231892'6f78d6d0'105c00e2_u128},
{Sign::NEG, -135, 0xa4762b13'9d0626e7'028f7126'29209148_u128},
{Sign::NEG, -135, 0xa258dfd1'0aedaa67'c98d898e'f172df02_u128},
{Sign::NEG, -135, 0xa05b63a3'73e60a83'fcc37c3c'3062bfa1_u128},
{Sign::NEG, -135, 0x9e5ddf89'cf42f501'3eb450db'05763c36_u128},
{Sign::NEG, -135, 0x9c605383'ddf1b88c'7146a86f'd458b775_u128},
{Sign::NEG, -135, 0x9a62bf91'60dcb286'c20a0c92'81474436_u128},
{Sign::NEG, -135, 0x986523b2'18eb4ed6'cdc57316'ec4aebc3_u128},
{Sign::NEG, -135, 0x96677fe5'c70207b9'c060dad7'4cef4273_u128},
{Sign::NEG, -135, 0x9449f92d'2ff44633'ed8def1a'3e433499_u128},
{Sign::NEG, -135, 0x924c4507'3220b5e0'3ce7a1f8'5c27b4fc_u128},
{Sign::NEG, -135, 0x904e88f3'68fea63f'f2ca8934'49f7f2cb_u128},
{Sign::NEG, -135, 0x8e50c4f1'956699ed'8d77d9fa'bd2853cf_u128},
{Sign::NEG, -135, 0x8c52f901'782e20ec'93e828d7'5b58ded4_u128},
{Sign::NEG, -135, 0x8a552522'd227d87a'9f9605b0'53c5acf0_u128},
{Sign::NEG, -135, 0x88574955'64236ae0'62a14939'3bca7241_u128},
{Sign::NEG, -135, 0x86398719'b66bac7c'aea6b56c'e89203d4_u128},
{Sign::NEG, -135, 0x843b9aef'044e4dcc'0242bd86'd00609b2_u128},
{Sign::NEG, -135, 0x823da6d4'c89c6927'daabf927'74bac84e_u128},
{Sign::NEG, -135, 0x803faaca'c419abf2'a1c6f3fc'242ef8d0_u128},
{Sign::NEG, -136, 0xfc834da1'6f0d9f57'a225ebc0'2e6d9dd4_u128},
{Sign::NEG, -136, 0xf88735cc'c7433381'c33f6ad3'40ae18a9_u128},
{Sign::NEG, -136, 0xf48b0e17'1249b6bc'70b2a4d3'8a242244_u128},
{Sign::NEG, -136, 0xf08ed67f'd190e280'1d548190'48b811b0_u128},
{Sign::NEG, -136, 0xec52ca07'ed95f236'9c21b650'afe9ede0_u128},
{Sign::NEG, -136, 0xe85671ad'ecd28aac'935519c9'6d30e463_u128},
{Sign::NEG, -136, 0xe45a0970'dc912ca7'ba88f6f2'e2672cfe_u128},
{Sign::NEG, -136, 0xe05d9150'3e298bc8'0b1a8b84'657ae069_u128},
{Sign::NEG, -136, 0xdc61094b'92ed70ef'ea3bff8d'197b20a1_u128},
{Sign::NEG, -136, 0xd8647162'5c28b9e5'cdbb931d'6fecc249_u128},
{Sign::NEG, -136, 0xd467c994'1b2158f5'd971d560'd5f00820_u128},
{Sign::NEG, -136, 0xd06b11e0'51175493'75563561'244c090b_u128},
{Sign::NEG, -136, 0xcc6e4a46'7f44c6fa'dc393c9a'3f3b380f_u128},
{Sign::NEG, -136, 0xc831a4c6'f6fa709d'e6abe6e9'e4ee2096_u128},
{Sign::NEG, -136, 0xc434bc61'24a0f16e'3ce3c822'8583a66e_u128},
{Sign::NEG, -136, 0xc037c413'c61bfd93'b96a79f5'c5a4963a_u128},
{Sign::NEG, -136, 0xbc3abbde'5c8d9bde'aaef2733'7008679f_u128},
{Sign::NEG, -136, 0xb83da3c0'6911e509'a49a3fca'ddc8bc5a_u128},
{Sign::NEG, -136, 0xb4407bb9'6cbf035a'e0254feb'785362fa_u128},
{Sign::NEG, -136, 0xb04343c8'e8a53245'9893a4e2'5ab9dc95_u128},
{Sign::NEG, -136, 0xac45fbee'5dcebe0b'5d8b0f40'a3708915_u128},
{Sign::NEG, -136, 0xa848a429'4d40035d'5f4c11c2'c7a58c69_u128},
{Sign::NEG, -136, 0xa44b3c79'37f76efd'b348cc5d'f706ffba_u128},
{Sign::NEG, -136, 0xa04dc4dd'9eed7d60'9159f2c5'5a18befd_u128},
{Sign::NEG, -136, 0x9c106456'3058bef3'bdfdee41'fe6a5a02_u128},
{Sign::NEG, -136, 0x9812cbe3'46475a24'4580ddf8'9853254d_u128},
{Sign::NEG, -136, 0x94152383'53489ffb'ac75e10d'61fc3ee8_u128},
{Sign::NEG, -136, 0x90176b35'd83ce8e2'cad9b30b'29736155_u128},
{Sign::NEG, -136, 0x8c19a2fa'55fe9b14'6f881deb'98fc45f3_u128},
{Sign::NEG, -136, 0x881bcad0'4d622a3e'70a04b63'b7248c96_u128},
{Sign::NEG, -136, 0x841de2b7'3f361722'b4823fb4'8035eddd_u128},
{Sign::NEG, -136, 0x801feaae'ac42ef38'3364ccb5'b13cd47f_u128},
{Sign::NEG, -137, 0xf843c56c'2a969897'e306977b'049f0ad5_u128},
{Sign::NEG, -137, 0xf0479599'f617a843'e3c4d9e9'619bc045_u128},
{Sign::NEG, -137, 0xe84b45e5'bc76702c'4356d525'b5e6432d_u128},
{Sign::NEG, -137, 0xe04ed64e'7f14697a'7839dcd7'989339ab_u128},
{Sign::NEG, -137, 0xd85246d3'3f47230b'4e21f045'ecb76f23_u128},
{Sign::NEG, -137, 0xd0559772'fe5840b0'902e248d'd4ba9b28_u128},
{Sign::NEG, -137, 0xc858c82c'bd857a72'a4444906'7ef92e01_u128},
{Sign::NEG, -137, 0xc05bd8ff'7e009bd2'17926207'cc22e4e6_u128},
{Sign::NEG, -137, 0xb85ec9ea'40ef8309'1c349622'f3fa5d82_u128},
{Sign::NEG, -137, 0xafe1c6ec'e1a058dd'97fa2fd0'c9dc723e_u128},
{Sign::NEG, -137, 0xa7e47606'048b1a65'983e8089'7cf1e60f_u128},
{Sign::NEG, -137, 0x9fe70534'1d236102'7199cd06'ae5d39b3_u128},
{Sign::NEG, -137, 0x97e97476'2c5e8f58'43cd18a7'2a051a96_u128},
{Sign::NEG, -137, 0x8febc3cb'332616ff'7b6d1248'c3e1fd40_u128},
{Sign::NEG, -137, 0x87edf332'325777c5'f5572a88'14c703af_u128},
{Sign::NEG, -138, 0xffe00554'55887de0'26828c92'649a3a39_u128},
{Sign::NEG, -138, 0xefe3e464'3a640cf3'82c550bd'1216d82a_u128},
{Sign::NEG, -138, 0xdfe78392'14b4e8ae'da6959f7'f0e01bf0_u128},
{Sign::NEG, -138, 0xcfeae2db'e5d6736d'da93e2fa'85a8f214_u128},
{Sign::NEG, -138, 0xbfee023f'af0c2480'b47505bf'a5a03b06_u128},
{Sign::NEG, -138, 0xaff0e1bb'718186ad'b1475a51'80a43520_u128},
{Sign::NEG, -138, 0x9ff3814d'2e4a36b2'a8740b91'c95df537_u128},
{Sign::NEG, -138, 0x8ff5e0f2'e661e1c6'57d895d3'5921b59c_u128},
{Sign::NEG, -139, 0xfff00155'35588833'3c56c598'c659c2a3_u128},
{Sign::NEG, -139, 0xdff3c0e4'97ea4eb1'2ef8ec33'ed9d782a_u128},
{Sign::NEG, -139, 0xbff7008f'f5e0c257'379eba7e'6465ff63_u128},
{Sign::NEG, -139, 0x9ff9c053'5073a370'3f972b78'3fcab757_u128},
{Sign::NEG, -140, 0xfff80055'51558885'de026e27'1ee0549d_u128},
{Sign::NEG, -140, 0xbffb8023'febc0c25'eceb47ea'01f6c632_u128},
{Sign::NEG, -141, 0xfffc0015'54d55888'7333c578'57e1ed52_u128},
{Sign::NEG, -142, 0xfffe0005'55455588'87dde026'fa704374_u128},
{Sign::POS, 0, 0_u128},
{Sign::POS, -141, 0x80010002'aab2aac4'44999abe'2fe2cc65_u128},
{Sign::POS, -140, 0x8002000a'aaeaac44'4eef3815'81464ccb_u128},
{Sign::POS, -140, 0xc0048024'01440c26'dfeb4850'85f6f454_u128},
{Sign::POS, -139, 0x8004002a'acaac445'99abe3be'3a1c6e93_u128},
{Sign::POS, -139, 0xa0064053'5a37a37a'6bc1e20e'ac8448b4_u128},
{Sign::POS, -139, 0xc0090090'0a20c275'979eedc0'64c242fd_u128},
{Sign::POS, -139, 0xe00c40e4'bd6e4efd'c72446cc'1bf728bd_u128},
{Sign::POS, -138, 0x800800aa'baac446e'f381b821'bbb569e5_u128},
{Sign::POS, -138, 0x900a20f3'19a3e273'569b26aa'a485ea5c_u128},
{Sign::POS, -138, 0xa00c814d'7c6a37f8'2dcf56c8'3c80b028_u128},
{Sign::POS, -138, 0xb00f21bb'e3e388ee'5f697682'84463b9b_u128},
{Sign::POS, -138, 0xc0120240'510c284c'b48ea6c0'5e2773a1_u128},
{Sign::POS, -138, 0xd01522dc'c4f87991'14d9d761'96d8043a_u128},
{Sign::POS, -138, 0xe0188393'40d4f241'e016a611'a4415d72_u128},
{Sign::POS, -138, 0xf01c2465'c5e61b6f'661e135f'49a47c40_u128},
{Sign::POS, -137, 0x801002ab'2ac4499a'be6bf0fa'435e8383_u128},
{Sign::POS, -137, 0x88121333'7898871e'9a31ba0c'bc030353_u128},
{Sign::POS, -137, 0x901443cc'cd362c9f'54b57dfe'0c4c840f_u128},
{Sign::POS, -137, 0x98169478'296fad41'7ad1e9c3'15328f7e_u128},
{Sign::POS, -137, 0xa0190536'8e2389b3'1f3f686c'f3d6be22_u128},
{Sign::POS, -137, 0xa81b9608'fc3c50ec'f105b66e'c4703ede_u128},
{Sign::POS, -137, 0xb01e46f0'74b0a0f3'610848c6'8df4d233_u128},
{Sign::POS, -137, 0xb7a0e9ed'7613acb0'2e0efddf'33a20464_u128},
{Sign::POS, -137, 0xbfa3d900'8e042ffb'c2cdb3c7'50f127b4_u128},
{Sign::POS, -137, 0xc7a6e82b'a36a7073'bd953378'6d3f4c49_u128},
{Sign::POS, -137, 0xcfaa176f'b76c8eb1'82e237c9'a4d450e3_u128},
{Sign::POS, -137, 0xd7ad66cd'cb3cbe14'c00b46a4'd0e3dfd0_u128},
{Sign::POS, -137, 0xdfb0d646'e0194584'ea999c0d'f8546710_u128},
{Sign::POS, -137, 0xe7b465db'f74c8032'cec6c2a9'ad974f4f_u128},
{Sign::POS, -137, 0xefb8158e'122cde5a'2d2045da'1570a07c_u128},
{Sign::POS, -137, 0xf7bbe55e'321ce603'6752e9b2'381e3edc_u128},
{Sign::POS, -137, 0xffbfd54d'588b33c5'3c1ed527'28e00e40_u128},
{Sign::POS, -136, 0x83e1f2ae'43793dc3'493b0d87'3fb9a340_u128},
{Sign::POS, -136, 0x87e40ac6'5f6cc4a0'29e38750'c9d26893_u128},
{Sign::POS, -136, 0x8be632ef'80e9a0df'aab9e832'7258ac3f_u128},
{Sign::POS, -136, 0x8fe86b2a'28bf51b3'28bc403d'8a5f3c63_u128},
{Sign::POS, -136, 0x93eab376'd7c36377'f720c1c9'7227fcdc_u128},
{Sign::POS, -136, 0x97ed0bd6'0ed17018'6ad9a3e3'd11b66c1_u128},
{Sign::POS, -136, 0x9bef7448'4ecb1f6c'edb27b79'c90b4019_u128},
{Sign::POS, -136, 0x9fb1c4cd'27012e19'a092a0d7'ab21722a_u128},
{Sign::POS, -136, 0xa3b44c65'b71c2d85'535d52f0'939a4d02_u128},
{Sign::POS, -136, 0xa7b6e412'cadcb3dc'90a57e11'edc1864e_u128},
{Sign::POS, -136, 0xabb98bd4'e33c4381'68e9c901'60031159_u128},
{Sign::POS, -136, 0xafbc43ac'813a6ea3'bf60594f'929adeb8_u128},
{Sign::POS, -136, 0xb3bf0b9a'25dcd7a2'8a421588'86775205_u128},
{Sign::POS, -136, 0xb7c1e39e'522f316d'1ab45417'663dee9e_u128},
{Sign::POS, -136, 0xbbc4cbb9'87433fe4'6c51ae3c'e1aea68a_u128},
{Sign::POS, -136, 0xbfc7c3ec'4630d83c'7c52ae8b'40ebabb7_u128},
{Sign::POS, -136, 0xc3cacc37'1015e15d'a857126f'7cfaaa67_u128},
{Sign::POS, -136, 0xc7cde49a'66165446'14d05662'cd29464a_u128},
{Sign::POS, -136, 0xcb90da16'44d29bb7'8379db06'ef3cd6bb_u128},
{Sign::POS, -136, 0xcf9411aa'99ddb7de'9025f4c6'7dd38bb6_u128},
{Sign::POS, -136, 0xd3975958'f681086d'd6f8a61c'892032ee_u128},
{Sign::POS, -136, 0xd79ab121'dbf8714c'9a2f20b4'e2332d47_u128},
{Sign::POS, -136, 0xdb9e1905'cb85ea59'3c767d61'f51d375b_u128},
{Sign::POS, -136, 0xdfa19105'46717fca'd4b2bd65'bb25493c_u128},
{Sign::POS, -136, 0xe3a51920'ce095292'c96c1254'a30ef91f_u128},
{Sign::POS, -136, 0xe7a8b158'e3a198be'73e324ce'0946b214_u128},
{Sign::POS, -136, 0xebac59ae'08949dd8'cacd125a'12bac62c_u128},
{Sign::POS, -136, 0xef6fd620'b2b7a503'cafdc272'27b71eaa_u128},
{Sign::POS, -136, 0xf3739daf'959aaafc'688d4282'f6026aa3_u128},
{Sign::POS, -136, 0xf777755d'03f4e0b6'e54e9e38'04464cdd_u128},
{Sign::POS, -136, 0xfb7b5d29'7f388a12'cb78b383'f4b59dce_u128},
{Sign::POS, -136, 0xff7f5515'88de024f'ee055fc5'15062c04_u128},
{Sign::POS, -135, 0x81c1ae90'd131de38'207812b4'3382acdd_u128},
{Sign::POS, -135, 0x83c3baa7'26a721cc'dc90c4c4'b61f3a87_u128},
{Sign::POS, -135, 0x85c5cece'05941dbc'1a03f13f'b2c978b1_u128},
{Sign::POS, -135, 0x87c7eb05'aec1304f'b36f282e'83a7dc36_u128},
{Sign::POS, -135, 0x89a9eccd'56a980c0'd82a4661'6d4c393f_u128},
{Sign::POS, -135, 0x8bac18a6'40185360'bc6ff847'13c9babd_u128},
{Sign::POS, -135, 0x8dae4c90'b22574f4'9f7942a5'16fc2d8a_u128},
{Sign::POS, -135, 0x8fb0888c'eda546ab'15e50cfd'9b29b427_u128},
{Sign::POS, -135, 0x91b2cc9b'336f3718'9f465296'ae7dd49a_u128},
{Sign::POS, -135, 0x93b518bb'c45dc268'b49c1eb9'b348e6e4_u128},
{Sign::POS, -135, 0x95b76cee'e14e728e'daa320cd'64c9d9c7_u128},
{Sign::POS, -135, 0x9799a333'de49b963'75a91950'ffe1e3b5_u128},
{Sign::POS, -135, 0x999c070b'a32068cd'5c6abcbf'43f03f14_u128},
{Sign::POS, -135, 0x9b9e72f6'b295ad4f'5a9e7f26'5d1ed157_u128},
{Sign::POS, -135, 0x9da0e6f5'4d9318fd'efeb98d0'2a195c17_u128},
{Sign::POS, -135, 0x9fa36307'b5054ca8'2aa503a3'110ab5a7_u128},
{Sign::POS, -135, 0xa1a5e72e'29dbf808'd0fe7e05'869eb825_u128},
{Sign::POS, -135, 0xa3884a68'a750cb10'e80a28f4'e1e500d2_u128},
{Sign::POS, -135, 0xa58ade36'aeef9f0b'53106415'1ca6e30b_u128},
{Sign::POS, -135, 0xa78d7a19'82c4b08f'27c01ffa'8e2e3c4b_u128},
{Sign::POS, -135, 0xa9901e11'63cbbbf5'7ba9408d'c857d568_u128},
{Sign::POS, -135, 0xab92ca1e'93038d76'104d1e33'31d3b4fa_u128},
{Sign::POS, -135, 0xad957e41'516e0158'9343c846'fcdf9137_u128},
{Sign::POS, -135, 0xaf780e79'b2514889'3977e89a'ec59bfa2_u128},
{Sign::POS, -135, 0xb17ad246'ef3713bc'913d4e3d'c55c3e6e_u128},
{Sign::POS, -135, 0xb37d9e2a'7a56b09d'777b52a9'e70d8bcc_u128},
{Sign::POS, -135, 0xb5807224'94be0c91'55de916f'd30591de_u128},
{Sign::POS, -135, 0xb7834e35'7f7e2600'e79cfb37'be2861e4_u128},
{Sign::POS, -135, 0xb986325d'7bab0c89'90983104'd3805389_u128},
{Sign::POS, -135, 0xbb68ef9c'254aa378'59e3b2ec'71ce64f4_u128},
{Sign::POS, -135, 0xbd6be371'8c77636f'e83183bf'3dd612ef_u128},
{Sign::POS, -135, 0xbf6edf5e'c44d9d35'c4e3b0ac'2fd52b7f_u128},
};
// Logarithm range reduction - Step 3:
@ -660,147 +664,147 @@ constexpr double S3[139] = {
// r = 2^-21 * round( 2^21 / (1 + i*2^(-21)) );
// s, m, e = RealField(128)(r).log().sign_mantissa_exponent();
// print("{Sign::POS," if (s == -1) else "{Sign::NEG,", e, ",
// MType({", hex(m % 2^64), ",", hex((m >> 64) % 2^64), "})},");
const Float128 LOG_R3[139] = {
{Sign::NEG, -142, MType({0xe39d3faf42340ed7, 0x89ff6b38d5de2622})},
{Sign::NEG, -142, MType({0x7ff3326682c02485, 0x87ff6f80ccb40f16})},
{Sign::NEG, -142, MType({0x5caf4fbe343cf928, 0x85ff73b8c3cdf731})},
{Sign::NEG, -142, MType({0xcdb6e554348f7fe8, 0x83ff77e0bb2ade79})},
{Sign::NEG, -142, MType({0xef009c2457de25d, 0x81ff7bf8b2c9c4f6})},
{Sign::NEG, -143, MType({0x8883333c57b57c74, 0xffff000155535558})},
{Sign::NEG, -143, MType({0xf32668f39c70d183, 0xfbff07f145931f44})},
{Sign::NEG, -143, MType({0x459a73c6a6486fe3, 0xf7ff0fc13650e7bd})},
{Sign::NEG, -143, MType({0x37b18cca7dd3a29f, 0xf3ff1771278aaecd})},
{Sign::NEG, -143, MType({0x513f610d21bcfc78, 0xefff1f01193e7480})},
{Sign::NEG, -143, MType({0xea190b95c0690b7b, 0xebff26710b6a38e1})},
{Sign::NEG, -143, MType({0x2a150f64f0ad1743, 0xe7ff2dc0fe0bfbfd})},
{Sign::NEG, -143, MType({0x90b5174e995e9d1, 0xe3ff34f0f121bddd})},
{Sign::NEG, -143, MType({0x4ed512b9b93ea2bf, 0xdfff3c00e4a97e8c})},
{Sign::NEG, -143, MType({0x934cea217ab794a2, 0xdbff42f0d8a13e15})},
{Sign::NEG, -143, MType({0x3e4ebe948afd2c76, 0xd7ff49c0cd06fc83})},
{Sign::NEG, -143, MType({0x87b7c0f5bcfee2e1, 0xd3ff5070c1d8b9df})},
{Sign::NEG, -143, MType({0x776666228cb6371b, 0xcfff5700b7147634})},
{Sign::NEG, -143, MType({0xe53a60f3514db358, 0xcbff5d70acb8318b})},
{Sign::NEG, -143, MType({0x79149c3b6e57fa86, 0xc7ff63c0a2c1ebef})},
{Sign::NEG, -143, MType({0xaad734c98416df2a, 0xc3ff69f0992fa568})},
{Sign::NEG, -143, MType({0xc26573679ed28334, 0xbfff70008fff5e00})},
{Sign::NEG, -143, MType({0xd7a3c6db6540809f, 0xbbff75f0872f15c0})},
{Sign::NEG, -143, MType({0xd277bde645fb1aad, 0xb7ff7bc07ebcccb1})},
{Sign::NEG, -143, MType({0x6ac80145a4087793, 0xb3ff817076a682dc})},
{Sign::NEG, -143, MType({0x287c4db30271e265, 0xafff87006eea3849})},
{Sign::NEG, -143, MType({0x637d6de42eeb151e, 0xabff8c706785ed00})},
{Sign::NEG, -143, MType({0x43b5348b6b898a8c, 0xa7ff91c06077a10a})},
{Sign::NEG, -143, MType({0xc10e7657978bd7f6, 0xa3ff96f059bd546e})},
{Sign::NEG, -143, MType({0xa37503f457310e59, 0x9fff9c0053550735})},
{Sign::NEG, -143, MType({0x82d5a40a3aa022ff, 0x9bffa0f04d3cb966})},
{Sign::NEG, -143, MType({0xc71e0d3ee3df5f4d, 0x97ffa5c047726b08})},
{Sign::NEG, -143, MType({0xa83ce0352bdbd79b, 0x93ffaa7041f41c23})},
{Sign::NEG, -143, MType({0x2e21a18d4680e8e4, 0x8fffaf003cbfccbe})},
{Sign::NEG, -143, MType({0x30bcb3e4e5dfbd28, 0x8bffb37037d37cdf})},
{Sign::NEG, -143, MType({0x57ff51d75c66d64a, 0x87ffb7c0332d2c8d})},
{Sign::NEG, -143, MType({0x1bdb87fdbe299f43, 0x83ffbbf02ecadbcf})},
{Sign::NEG, -144, MType({0x88885dde02700703, 0xffff800055551555})},
{Sign::NEG, -144, MType({0xd259ca803a0c1870, 0xf7ff87e04d94724c})},
{Sign::NEG, -144, MType({0xe514130851c7070a, 0xefff8f80464fce8f})},
{Sign::NEG, -144, MType({0x30a16898f3073a64, 0xe7ff96e03f832a2a})},
{Sign::NEG, -144, MType({0xc4ed64517b2949ce, 0xdfff9e00392a8526})},
{Sign::NEG, -144, MType({0x51e4fb4e32cf6350, 0xd7ffa4e03341df90})},
{Sign::NEG, -144, MType({0x277672a88350bcce, 0xcfffab802dc53971})},
{Sign::NEG, -144, MType({0x359153772a490f06, 0xc7ffb1e028b092d3})},
{Sign::NEG, -144, MType({0xc265ece6b481a0e, 0xbfffb80023ffebc0})},
{Sign::NEG, -144, MType({0xdb2781c03fa132f6, 0xb7ffbde01faf4440})},
{Sign::NEG, -144, MType({0x7287c95c845ada33, 0xafffc3801bba9c5e})},
{Sign::NEG, -144, MType({0x423b56b1263e5a77, 0xa7ffc8e0181df421})},
{Sign::NEG, -144, MType({0x5a3752ca4c076fa3, 0x9fffce0014d54b91})},
{Sign::NEG, -144, MType({0x6a71e2b27eb3f573, 0x97ffd2e011dca2b6})},
{Sign::NEG, -144, MType({0xc2e21b72cff39d8f, 0x8fffd7800f2ff997})},
{Sign::NEG, -144, MType({0x537ff612feb7ac9e, 0x87ffdbe00ccb503c})},
{Sign::NEG, -145, MType({0x5888873333c57c18, 0xffffc00015554d55})},
{Sign::NEG, -145, MType({0xfa51421842311c42, 0xefffc7c01193f9d1})},
{Sign::NEG, -145, MType({0x2c4ed6de475b942c, 0xdfffcf000e4aa5fa})},
{Sign::NEG, -145, MType({0xce77678cbb6fcb88, 0xcfffd5c00b7151d8})},
{Sign::NEG, -145, MType({0xc26629a679ed3b, 0xbfffdc0008fffd78})},
{Sign::NEG, -145, MType({0x23287cb9d3072728, 0xafffe1c006eea8e1})},
{Sign::NEG, -145, MType({0xd5a37540fd057315, 0x9fffe7000535541c})},
{Sign::NEG, -145, MType({0xf82e21c1fce36810, 0x8fffebc003cbff32})},
{Sign::NEG, -146, MType({0x5588887ddde02702, 0xffffe00005555455})},
{Sign::NEG, -146, MType({0x9ac4ed72adf5b295, 0xdfffe7800392aa14})},
{Sign::NEG, -146, MType({0xc26648066b482, 0xbfffee00023fffaf})},
{Sign::NEG, -146, MType({0x455a3754b292c077, 0x9ffff380014d552e})},
{Sign::NEG, -147, MType({0x5558888833333c58, 0xfffff00001555535})},
{Sign::NEG, -147, MType({0xe000c2665736679f, 0xbffff700008ffff5})},
{Sign::NEG, -148, MType({0x5555888885ddde02, 0xfffff80000555551})},
{Sign::NEG, -149, MType({0xd555588888733334, 0xfffffc0000155554})},
{Sign::POS, 0, MType({0x0, 0x0})},
{Sign::POS, -148, MType({0xeaaaac44444eeeef, 0x80000200000aaaaa})},
{Sign::POS, -147, MType({0xaaaac444459999ac, 0x80000400002aaaac})},
{Sign::POS, -147, MType({0x2000c2667596679f, 0xc00009000090000a})},
{Sign::POS, -146, MType({0xaaac44446eeef381, 0x8000080000aaaaba})},
{Sign::POS, -146, MType({0x655a3755f81815cc, 0xa0000c80014d557c})},
{Sign::POS, -146, MType({0xc26684c66b482, 0xc000120002400051})},
{Sign::POS, -146, MType({0xbac4ed7c40fb07eb, 0xe00018800392ab40})},
{Sign::POS, -145, MType({0xaac44449999abe2c, 0x8000100002aaab2a})},
{Sign::POS, -145, MType({0x82e21d79cbb6812, 0x9000144003cc00cd})},
{Sign::POS, -145, MType({0xd5a37569adb01dc3, 0xa00019000535568d})},
{Sign::POS, -145, MType({0x33287d01e8c9d1d9, 0xb0001e4006eeac74})},
{Sign::POS, -145, MType({0xc266a32679ed48, 0xc000240009000288})},
{Sign::POS, -145, MType({0xde77685122b2764b, 0xd0002a400b7158d1})},
{Sign::POS, -145, MType({0x2c4ed810a8063f03, 0xe00031000e4aaf5b})},
{Sign::POS, -145, MType({0xa5143e7be891c8f, 0xf00038401194062e})},
{Sign::POS, -144, MType({0xac4444eeef3813a1, 0x800020000aaaaeaa})},
{Sign::POS, -144, MType({0x5b7ff7fe1339025b, 0x880024200ccb5a6e})},
{Sign::POS, -144, MType({0x42e21e26caf39e33, 0x900028800f300668})},
{Sign::POS, -144, MType({0xf271e66fa5554bc6, 0x98002d2011dcb29e})},
{Sign::POS, -144, MType({0x5a3757e0615cc676, 0xa000320014d55f19})},
{Sign::POS, -144, MType({0xca3b5d8210ca5cab, 0xa8003720181e0bde})},
{Sign::POS, -144, MType({0xf287d25f3cb032bb, 0xb0003c801bbab8f6})},
{Sign::POS, -144, MType({0xe3278d840be28cdb, 0xb80042201faf6669})},
{Sign::POS, -144, MType({0xc266dfe6b482076, 0xc000480024001440})},
{Sign::POS, -144, MType({0x3d9166de380a6d3d, 0xc8004e2028b0c282})},
{Sign::POS, -144, MType({0xa7768b356ba61e4b, 0xd00054802dc57139})},
{Sign::POS, -144, MType({0xd9e51a1849db73c1, 0xd8005b203342206f})},
{Sign::POS, -144, MType({0xc4ed8a9d907eb521, 0xe0006200392ad02e})},
{Sign::POS, -144, MType({0xb8a197dea928acd7, 0xe80069203f838080})},
{Sign::POS, -144, MType({0x65144cf7dcc72d3b, 0xf000708046503170})},
{Sign::POS, -144, MType({0xda5a1108890d9f6a, 0xf80078204d94e308})},
{Sign::POS, -143, MType({0xc4445999abe2ce2c, 0x800040002aaacaaa})},
{Sign::POS, -143, MType({0x1fdbbb4f3bffc832, 0x840044102ecb2431})},
{Sign::POS, -143, MType({0x97ff8f39ec91b4ee, 0x88004840332d7e1d})},
{Sign::POS, -143, MType({0x74bcfcf0b3f0a95d, 0x8c004c9037d3d876})},
{Sign::POS, -143, MType({0x2e21f80ca6813aff, 0x900051003cc03342})},
{Sign::POS, -143, MType({0x6c3d4629170ce87f, 0x9400559041f48e87})},
{Sign::POS, -143, MType({0x71e84e3b80a8881, 0x98005a404772ea4d})},
{Sign::POS, -143, MType({0x6d62fdcbdd6bec3, 0x9c005f104d3d469a})},
{Sign::POS, -143, MType({0xa375a6b701dc77c0, 0xa00064005355a375})},
{Sign::POS, -143, MType({0x450f331826ad6b05, 0xa400691059be00e7})},
{Sign::POS, -143, MType({0x83b60ea8bd0aa459, 0xa8006e4060785ef6})},
{Sign::POS, -143, MType({0x277e691469dd13f5, 0xac0073906786bdab})},
{Sign::POS, -143, MType({0x287d6e0a0d1e25eb, 0xb00079006eeb1d0d})},
{Sign::POS, -143, MType({0xaec94b3be9b060f5, 0xb4007e9076a77d24})},
{Sign::POS, -143, MType({0x1279365fce280cce, 0xb80084407ebdddfa})},
{Sign::POS, -143, MType({0xdba5732f3e83e04a, 0xbc008a1087303f95})},
{Sign::POS, -143, MType({0xc26759679ed5b754, 0xc00090009000a200})},
{Sign::POS, -143, MType({0xaed95aca5edb5109, 0xc400961099310543})},
{Sign::POS, -143, MType({0xb917091d2687160f, 0xc8009c40a2c36967})},
{Sign::POS, -143, MType({0x293d1c2a0378e75d, 0xcc00a290acb9ce76})},
{Sign::POS, -143, MType({0x776977bf9766f5a7, 0xd000a900b7163478})},
{Sign::POS, -143, MType({0x4bbb31b14776a18b, 0xd400af90c1da9b78})},
{Sign::POS, -143, MType({0x7e5297d76c8564ba, 0xd800b640cd09037f})},
{Sign::POS, -143, MType({0x1751360f8461c447, 0xdc00bd10d8a36c98})},
{Sign::POS, -143, MType({0x4ed9dc3c63f44c41, 0xe000c400e4abd6cc})},
{Sign::POS, -143, MType({0x8d10a4466a5894d5, 0xe400cb10f1244226})},
{Sign::POS, -143, MType({0x6a1af81bb4e6510e, 0xe800d240fe0eaeb1})},
{Sign::POS, -143, MType({0xae1f97b0542a677a, 0xec00d9910b6d1c77})},
{Sign::POS, -143, MType({0x51469efe81d014cc, 0xf000e10119418b84})},
{Sign::POS, -143, MType({0x7bb98c06d77a18b4, 0xf400e891278dfbe2})},
{Sign::POS, -143, MType({0x85a344d0868bed17, 0xf800f04136546d9d})},
{Sign::POS, -143, MType({0xf7301d6990e307cc, 0xfc00f8114596e0c0})},
{Sign::POS, -142, MType({0x4446eef38140138f, 0x80008000aaabaaac})},
{Sign::POS, -142, MType({0x10f5e43296105497, 0x82008408b2cbe5b8})},
{Sign::POS, -142, MType({0xedbd4f83ef63f730, 0x84008820bb2d2189})},
{Sign::POS, -142, MType({0xfeb654fd541c638e, 0x86008c48c3d05e27})},
{Sign::POS, -142, MType({0x7ffadeb8882f7674, 0x88009080ccb69b98})},
{Sign::POS, -142, MType({0xc5a59fd36bd44397, 0x8a0094c8d5e0d9e1})},
// format_hex(m), "},");
constexpr Float128 LOG_R3[139] = {
{Sign::NEG, -142, 0x89ff6b38'd5de2622'e39d3faf'42340ed7_u128},
{Sign::NEG, -142, 0x87ff6f80'ccb40f16'7ff33266'82c02485_u128},
{Sign::NEG, -142, 0x85ff73b8'c3cdf731'5caf4fbe'343cf928_u128},
{Sign::NEG, -142, 0x83ff77e0'bb2ade79'cdb6e554'348f7fe8_u128},
{Sign::NEG, -142, 0x81ff7bf8'b2c9c4f6'0ef009c2'457de25d_u128},
{Sign::NEG, -143, 0xffff0001'55535558'8883333c'57b57c74_u128},
{Sign::NEG, -143, 0xfbff07f1'45931f44'f32668f3'9c70d183_u128},
{Sign::NEG, -143, 0xf7ff0fc1'3650e7bd'459a73c6'a6486fe3_u128},
{Sign::NEG, -143, 0xf3ff1771'278aaecd'37b18cca'7dd3a29f_u128},
{Sign::NEG, -143, 0xefff1f01'193e7480'513f610d'21bcfc78_u128},
{Sign::NEG, -143, 0xebff2671'0b6a38e1'ea190b95'c0690b7b_u128},
{Sign::NEG, -143, 0xe7ff2dc0'fe0bfbfd'2a150f64'f0ad1743_u128},
{Sign::NEG, -143, 0xe3ff34f0'f121bddd'090b5174'e995e9d1_u128},
{Sign::NEG, -143, 0xdfff3c00'e4a97e8c'4ed512b9'b93ea2bf_u128},
{Sign::NEG, -143, 0xdbff42f0'd8a13e15'934cea21'7ab794a2_u128},
{Sign::NEG, -143, 0xd7ff49c0'cd06fc83'3e4ebe94'8afd2c76_u128},
{Sign::NEG, -143, 0xd3ff5070'c1d8b9df'87b7c0f5'bcfee2e1_u128},
{Sign::NEG, -143, 0xcfff5700'b7147634'77666622'8cb6371b_u128},
{Sign::NEG, -143, 0xcbff5d70'acb8318b'e53a60f3'514db358_u128},
{Sign::NEG, -143, 0xc7ff63c0'a2c1ebef'79149c3b'6e57fa86_u128},
{Sign::NEG, -143, 0xc3ff69f0'992fa568'aad734c9'8416df2a_u128},
{Sign::NEG, -143, 0xbfff7000'8fff5e00'c2657367'9ed28334_u128},
{Sign::NEG, -143, 0xbbff75f0'872f15c0'd7a3c6db'6540809f_u128},
{Sign::NEG, -143, 0xb7ff7bc0'7ebcccb1'd277bde6'45fb1aad_u128},
{Sign::NEG, -143, 0xb3ff8170'76a682dc'6ac80145'a4087793_u128},
{Sign::NEG, -143, 0xafff8700'6eea3849'287c4db3'0271e265_u128},
{Sign::NEG, -143, 0xabff8c70'6785ed00'637d6de4'2eeb151e_u128},
{Sign::NEG, -143, 0xa7ff91c0'6077a10a'43b5348b'6b898a8c_u128},
{Sign::NEG, -143, 0xa3ff96f0'59bd546e'c10e7657'978bd7f6_u128},
{Sign::NEG, -143, 0x9fff9c00'53550735'a37503f4'57310e59_u128},
{Sign::NEG, -143, 0x9bffa0f0'4d3cb966'82d5a40a'3aa022ff_u128},
{Sign::NEG, -143, 0x97ffa5c0'47726b08'c71e0d3e'e3df5f4d_u128},
{Sign::NEG, -143, 0x93ffaa70'41f41c23'a83ce035'2bdbd79b_u128},
{Sign::NEG, -143, 0x8fffaf00'3cbfccbe'2e21a18d'4680e8e4_u128},
{Sign::NEG, -143, 0x8bffb370'37d37cdf'30bcb3e4'e5dfbd28_u128},
{Sign::NEG, -143, 0x87ffb7c0'332d2c8d'57ff51d7'5c66d64a_u128},
{Sign::NEG, -143, 0x83ffbbf0'2ecadbcf'1bdb87fd'be299f43_u128},
{Sign::NEG, -144, 0xffff8000'55551555'88885dde'02700703_u128},
{Sign::NEG, -144, 0xf7ff87e0'4d94724c'd259ca80'3a0c1870_u128},
{Sign::NEG, -144, 0xefff8f80'464fce8f'e5141308'51c7070a_u128},
{Sign::NEG, -144, 0xe7ff96e0'3f832a2a'30a16898'f3073a64_u128},
{Sign::NEG, -144, 0xdfff9e00'392a8526'c4ed6451'7b2949ce_u128},
{Sign::NEG, -144, 0xd7ffa4e0'3341df90'51e4fb4e'32cf6350_u128},
{Sign::NEG, -144, 0xcfffab80'2dc53971'277672a8'8350bcce_u128},
{Sign::NEG, -144, 0xc7ffb1e0'28b092d3'35915377'2a490f06_u128},
{Sign::NEG, -144, 0xbfffb800'23ffebc0'0c265ece'6b481a0e_u128},
{Sign::NEG, -144, 0xb7ffbde0'1faf4440'db2781c0'3fa132f6_u128},
{Sign::NEG, -144, 0xafffc380'1bba9c5e'7287c95c'845ada33_u128},
{Sign::NEG, -144, 0xa7ffc8e0'181df421'423b56b1'263e5a77_u128},
{Sign::NEG, -144, 0x9fffce00'14d54b91'5a3752ca'4c076fa3_u128},
{Sign::NEG, -144, 0x97ffd2e0'11dca2b6'6a71e2b2'7eb3f573_u128},
{Sign::NEG, -144, 0x8fffd780'0f2ff997'c2e21b72'cff39d8f_u128},
{Sign::NEG, -144, 0x87ffdbe0'0ccb503c'537ff612'feb7ac9e_u128},
{Sign::NEG, -145, 0xffffc000'15554d55'58888733'33c57c18_u128},
{Sign::NEG, -145, 0xefffc7c0'1193f9d1'fa514218'42311c42_u128},
{Sign::NEG, -145, 0xdfffcf00'0e4aa5fa'2c4ed6de'475b942c_u128},
{Sign::NEG, -145, 0xcfffd5c0'0b7151d8'ce77678c'bb6fcb88_u128},
{Sign::NEG, -145, 0xbfffdc00'08fffd78'00c26629'a679ed3b_u128},
{Sign::NEG, -145, 0xafffe1c0'06eea8e1'23287cb9'd3072728_u128},
{Sign::NEG, -145, 0x9fffe700'0535541c'd5a37540'fd057315_u128},
{Sign::NEG, -145, 0x8fffebc0'03cbff32'f82e21c1'fce36810_u128},
{Sign::NEG, -146, 0xffffe000'05555455'5588887d'dde02702_u128},
{Sign::NEG, -146, 0xdfffe780'0392aa14'9ac4ed72'adf5b295_u128},
{Sign::NEG, -146, 0xbfffee00'023fffaf'000c2664'8066b482_u128},
{Sign::NEG, -146, 0x9ffff380'014d552e'455a3754'b292c077_u128},
{Sign::NEG, -147, 0xfffff000'01555535'55588888'33333c58_u128},
{Sign::NEG, -147, 0xbffff700'008ffff5'e000c266'5736679f_u128},
{Sign::NEG, -148, 0xfffff800'00555551'55558888'85ddde02_u128},
{Sign::NEG, -149, 0xfffffc00'00155554'd5555888'88733334_u128},
{Sign::POS, 0, 0_u128},
{Sign::POS, -148, 0x80000200'000aaaaa'eaaaac44'444eeeef_u128},
{Sign::POS, -147, 0x80000400'002aaaac'aaaac444'459999ac_u128},
{Sign::POS, -147, 0xc0000900'0090000a'2000c266'7596679f_u128},
{Sign::POS, -146, 0x80000800'00aaaaba'aaac4444'6eeef381_u128},
{Sign::POS, -146, 0xa0000c80'014d557c'655a3755'f81815cc_u128},
{Sign::POS, -146, 0xc0001200'02400051'000c2668'4c66b482_u128},
{Sign::POS, -146, 0xe0001880'0392ab40'bac4ed7c'40fb07eb_u128},
{Sign::POS, -145, 0x80001000'02aaab2a'aac44449'999abe2c_u128},
{Sign::POS, -145, 0x90001440'03cc00cd'082e21d7'9cbb6812_u128},
{Sign::POS, -145, 0xa0001900'0535568d'd5a37569'adb01dc3_u128},
{Sign::POS, -145, 0xb0001e40'06eeac74'33287d01'e8c9d1d9_u128},
{Sign::POS, -145, 0xc0002400'09000288'00c266a3'2679ed48_u128},
{Sign::POS, -145, 0xd0002a40'0b7158d1'de776851'22b2764b_u128},
{Sign::POS, -145, 0xe0003100'0e4aaf5b'2c4ed810'a8063f03_u128},
{Sign::POS, -145, 0xf0003840'1194062e'0a5143e7'be891c8f_u128},
{Sign::POS, -144, 0x80002000'0aaaaeaa'ac4444ee'ef3813a1_u128},
{Sign::POS, -144, 0x88002420'0ccb5a6e'5b7ff7fe'1339025b_u128},
{Sign::POS, -144, 0x90002880'0f300668'42e21e26'caf39e33_u128},
{Sign::POS, -144, 0x98002d20'11dcb29e'f271e66f'a5554bc6_u128},
{Sign::POS, -144, 0xa0003200'14d55f19'5a3757e0'615cc676_u128},
{Sign::POS, -144, 0xa8003720'181e0bde'ca3b5d82'10ca5cab_u128},
{Sign::POS, -144, 0xb0003c80'1bbab8f6'f287d25f'3cb032bb_u128},
{Sign::POS, -144, 0xb8004220'1faf6669'e3278d84'0be28cdb_u128},
{Sign::POS, -144, 0xc0004800'24001440'0c266dfe'6b482076_u128},
{Sign::POS, -144, 0xc8004e20'28b0c282'3d9166de'380a6d3d_u128},
{Sign::POS, -144, 0xd0005480'2dc57139'a7768b35'6ba61e4b_u128},
{Sign::POS, -144, 0xd8005b20'3342206f'd9e51a18'49db73c1_u128},
{Sign::POS, -144, 0xe0006200'392ad02e'c4ed8a9d'907eb521_u128},
{Sign::POS, -144, 0xe8006920'3f838080'b8a197de'a928acd7_u128},
{Sign::POS, -144, 0xf0007080'46503170'65144cf7'dcc72d3b_u128},
{Sign::POS, -144, 0xf8007820'4d94e308'da5a1108'890d9f6a_u128},
{Sign::POS, -143, 0x80004000'2aaacaaa'c4445999'abe2ce2c_u128},
{Sign::POS, -143, 0x84004410'2ecb2431'1fdbbb4f'3bffc832_u128},
{Sign::POS, -143, 0x88004840'332d7e1d'97ff8f39'ec91b4ee_u128},
{Sign::POS, -143, 0x8c004c90'37d3d876'74bcfcf0'b3f0a95d_u128},
{Sign::POS, -143, 0x90005100'3cc03342'2e21f80c'a6813aff_u128},
{Sign::POS, -143, 0x94005590'41f48e87'6c3d4629'170ce87f_u128},
{Sign::POS, -143, 0x98005a40'4772ea4d'071e84e3'b80a8881_u128},
{Sign::POS, -143, 0x9c005f10'4d3d469a'06d62fdc'bdd6bec3_u128},
{Sign::POS, -143, 0xa0006400'5355a375'a375a6b7'01dc77c0_u128},
{Sign::POS, -143, 0xa4006910'59be00e7'450f3318'26ad6b05_u128},
{Sign::POS, -143, 0xa8006e40'60785ef6'83b60ea8'bd0aa459_u128},
{Sign::POS, -143, 0xac007390'6786bdab'277e6914'69dd13f5_u128},
{Sign::POS, -143, 0xb0007900'6eeb1d0d'287d6e0a'0d1e25eb_u128},
{Sign::POS, -143, 0xb4007e90'76a77d24'aec94b3b'e9b060f5_u128},
{Sign::POS, -143, 0xb8008440'7ebdddfa'1279365f'ce280cce_u128},
{Sign::POS, -143, 0xbc008a10'87303f95'dba5732f'3e83e04a_u128},
{Sign::POS, -143, 0xc0009000'9000a200'c2675967'9ed5b754_u128},
{Sign::POS, -143, 0xc4009610'99310543'aed95aca'5edb5109_u128},
{Sign::POS, -143, 0xc8009c40'a2c36967'b917091d'2687160f_u128},
{Sign::POS, -143, 0xcc00a290'acb9ce76'293d1c2a'0378e75d_u128},
{Sign::POS, -143, 0xd000a900'b7163478'776977bf'9766f5a7_u128},
{Sign::POS, -143, 0xd400af90'c1da9b78'4bbb31b1'4776a18b_u128},
{Sign::POS, -143, 0xd800b640'cd09037f'7e5297d7'6c8564ba_u128},
{Sign::POS, -143, 0xdc00bd10'd8a36c98'1751360f'8461c447_u128},
{Sign::POS, -143, 0xe000c400'e4abd6cc'4ed9dc3c'63f44c41_u128},
{Sign::POS, -143, 0xe400cb10'f1244226'8d10a446'6a5894d5_u128},
{Sign::POS, -143, 0xe800d240'fe0eaeb1'6a1af81b'b4e6510e_u128},
{Sign::POS, -143, 0xec00d991'0b6d1c77'ae1f97b0'542a677a_u128},
{Sign::POS, -143, 0xf000e101'19418b84'51469efe'81d014cc_u128},
{Sign::POS, -143, 0xf400e891'278dfbe2'7bb98c06'd77a18b4_u128},
{Sign::POS, -143, 0xf800f041'36546d9d'85a344d0'868bed17_u128},
{Sign::POS, -143, 0xfc00f811'4596e0c0'f7301d69'90e307cc_u128},
{Sign::POS, -142, 0x80008000'aaabaaac'4446eef3'8140138f_u128},
{Sign::POS, -142, 0x82008408'b2cbe5b8'10f5e432'96105497_u128},
{Sign::POS, -142, 0x84008820'bb2d2189'edbd4f83'ef63f730_u128},
{Sign::POS, -142, 0x86008c48'c3d05e27'feb654fd'541c638e_u128},
{Sign::POS, -142, 0x88009080'ccb69b98'7ffadeb8'882f7674_u128},
{Sign::POS, -142, 0x8a0094c8'd5e0d9e1'c5a59fd3'6bd44397_u128},
};
// Minimax polynomial generated by Sollya with:
@ -809,11 +813,11 @@ const Float128 LOG_R3[139] = {
// > P;
// > dirtyinfnorm(log(1 + x)/x - 1 - x*P, [-0x1.01928p-22 , 0x1p-22]);
// 0x1.ce1e...p-116
const Float128 BIG_COEFFS[4]{
{Sign::POS, -130, MType({0x7ed78465d460315b, 0xccccccd74818e397})},
{Sign::NEG, -129, MType({0xc6388a23871ce156, 0x80000000000478b0})},
{Sign::POS, -129, MType({0xaa807bd867763262, 0xaaaaaaaaaaaaaaaa})},
{Sign::NEG, -128, MType({0x0, 0x8000000000000000})},
constexpr Float128 BIG_COEFFS[4]{
{Sign::POS, -130, 0xccccccd7'4818e397'7ed78465'd460315b_u128},
{Sign::NEG, -129, 0x80000000'000478b0'c6388a23'871ce156_u128},
{Sign::POS, -129, 0xaaaaaaaa'aaaaaaaa'aa807bd8'67763262_u128},
{Sign::NEG, -128, 0x80000000'00000000'00000000'00000000_u128},
};
LIBC_INLINE double log1p_accurate(int e_x, int index,

File diff suppressed because it is too large Load Diff

View File

@ -55,6 +55,7 @@ add_libc_test(
str_to_double_test.cpp
str_to_long_double_test.cpp
DEPENDS
libc.src.__support.integer_literals
libc.src.__support.str_to_float
libc.src.__support.uint128
libc.src.errno.errno
@ -67,8 +68,9 @@ add_libc_test(
SRCS
integer_to_string_test.cpp
DEPENDS
libc.src.__support.integer_to_string
libc.src.__support.CPP.string_view
libc.src.__support.integer_literals
libc.src.__support.integer_to_string
libc.src.__support.uint
libc.src.__support.uint128
)

View File

@ -452,7 +452,7 @@ TEST(LlvmLibcFPBitsTest, X86LongDoubleType) {
EXPECT_TRUE(negzero.is_neg());
EXPECT_EQ(negzero.get_biased_exponent(), 0_u16);
EXPECT_EQ(negzero.get_mantissa(), 0_u128);
EXPECT_EQ(negzero.uintval(), 0x80000000000000000000_u128);
EXPECT_EQ(negzero.uintval(), 0x8000'00000000'00000000_u128);
EXPECT_STREQ(
LIBC_NAMESPACE::str(negzero).c_str(),
"0x00000000000080000000000000000000 = "
@ -462,7 +462,7 @@ TEST(LlvmLibcFPBitsTest, X86LongDoubleType) {
EXPECT_TRUE(one.is_pos());
EXPECT_EQ(one.get_biased_exponent(), 0x3FFF_u16);
EXPECT_EQ(one.get_mantissa(), 0_u128);
EXPECT_EQ(one.uintval(), 0x3FFF8000000000000000_u128);
EXPECT_EQ(one.uintval(), 0x3FFF'80000000'00000000_u128);
EXPECT_STREQ(
LIBC_NAMESPACE::str(one).c_str(),
"0x0000000000003FFF8000000000000000 = "
@ -472,7 +472,7 @@ TEST(LlvmLibcFPBitsTest, X86LongDoubleType) {
EXPECT_TRUE(negone.is_neg());
EXPECT_EQ(negone.get_biased_exponent(), 0x3FFF_u16);
EXPECT_EQ(negone.get_mantissa(), 0_u128);
EXPECT_EQ(negone.uintval(), 0xBFFF8000000000000000_u128);
EXPECT_EQ(negone.uintval(), 0xBFFF'80000000'00000000_u128);
EXPECT_STREQ(
LIBC_NAMESPACE::str(negone).c_str(),
"0x000000000000BFFF8000000000000000 = "
@ -481,8 +481,8 @@ TEST(LlvmLibcFPBitsTest, X86LongDoubleType) {
LongDoubleBits num(1.125l);
EXPECT_TRUE(num.is_pos());
EXPECT_EQ(num.get_biased_exponent(), 0x3FFF_u16);
EXPECT_EQ(num.get_mantissa(), 0x1000000000000000_u128);
EXPECT_EQ(num.uintval(), 0x3FFF9000000000000000_u128);
EXPECT_EQ(num.get_mantissa(), 0x10000000'00000000_u128);
EXPECT_EQ(num.uintval(), 0x3FFF'90000000'00000000_u128);
EXPECT_STREQ(
LIBC_NAMESPACE::str(num).c_str(),
"0x0000000000003FFF9000000000000000 = "
@ -491,8 +491,8 @@ TEST(LlvmLibcFPBitsTest, X86LongDoubleType) {
LongDoubleBits negnum(-1.125l);
EXPECT_TRUE(negnum.is_neg());
EXPECT_EQ(negnum.get_biased_exponent(), 0x3FFF_u16);
EXPECT_EQ(negnum.get_mantissa(), 0x1000000000000000_u128);
EXPECT_EQ(negnum.uintval(), 0xBFFF9000000000000000_u128);
EXPECT_EQ(negnum.get_mantissa(), 0x10000000'00000000_u128);
EXPECT_EQ(negnum.uintval(), 0xBFFF'90000000'00000000_u128);
EXPECT_STREQ(
LIBC_NAMESPACE::str(negnum).c_str(),
"0x000000000000BFFF9000000000000000 = "
@ -528,7 +528,7 @@ TEST(LlvmLibcFPBitsTest, LongDoubleType) {
EXPECT_TRUE(negzero.is_neg());
EXPECT_EQ(negzero.get_biased_exponent(), 0_u16);
EXPECT_EQ(negzero.get_mantissa(), 0_u128);
EXPECT_EQ(negzero.uintval(), 0x80000000000000000000000000000000_u128);
EXPECT_EQ(negzero.uintval(), 0x80000000'00000000'00000000'00000000_u128);
EXPECT_STREQ(LIBC_NAMESPACE::str(negzero).c_str(),
"0x80000000000000000000000000000000 = "
"(S: 1, E: 0x0000, M: 0x00000000000000000000000000000000)");
@ -537,7 +537,7 @@ TEST(LlvmLibcFPBitsTest, LongDoubleType) {
EXPECT_TRUE(one.is_pos());
EXPECT_EQ(one.get_biased_exponent(), 0x3FFF_u16);
EXPECT_EQ(one.get_mantissa(), 0_u128);
EXPECT_EQ(one.uintval(), 0x3FFF0000000000000000000000000000_u128);
EXPECT_EQ(one.uintval(), 0x3FFF0000'00000000'00000000'00000000_u128);
EXPECT_STREQ(LIBC_NAMESPACE::str(one).c_str(),
"0x3FFF0000000000000000000000000000 = "
"(S: 0, E: 0x3FFF, M: 0x00000000000000000000000000000000)");
@ -546,7 +546,7 @@ TEST(LlvmLibcFPBitsTest, LongDoubleType) {
EXPECT_TRUE(negone.is_neg());
EXPECT_EQ(negone.get_biased_exponent(), 0x3FFF_u16);
EXPECT_EQ(negone.get_mantissa(), 0_u128);
EXPECT_EQ(negone.uintval(), 0xBFFF0000000000000000000000000000_u128);
EXPECT_EQ(negone.uintval(), 0xBFFF0000'00000000'00000000'00000000_u128);
EXPECT_STREQ(LIBC_NAMESPACE::str(negone).c_str(),
"0xBFFF0000000000000000000000000000 = "
"(S: 1, E: 0x3FFF, M: 0x00000000000000000000000000000000)");
@ -554,8 +554,8 @@ TEST(LlvmLibcFPBitsTest, LongDoubleType) {
LongDoubleBits num(1.125l);
EXPECT_TRUE(num.is_pos());
EXPECT_EQ(num.get_biased_exponent(), 0x3FFF_u16);
EXPECT_EQ(num.get_mantissa(), 0x2000000000000000000000000000_u128);
EXPECT_EQ(num.uintval(), 0x3FFF2000000000000000000000000000_u128);
EXPECT_EQ(num.get_mantissa(), 0x2000'00000000'00000000'00000000_u128);
EXPECT_EQ(num.uintval(), 0x3FFF2000'00000000'00000000'00000000_u128);
EXPECT_STREQ(LIBC_NAMESPACE::str(num).c_str(),
"0x3FFF2000000000000000000000000000 = "
"(S: 0, E: 0x3FFF, M: 0x00002000000000000000000000000000)");
@ -563,8 +563,8 @@ TEST(LlvmLibcFPBitsTest, LongDoubleType) {
LongDoubleBits negnum(-1.125l);
EXPECT_TRUE(negnum.is_neg());
EXPECT_EQ(negnum.get_biased_exponent(), 0x3FFF_u16);
EXPECT_EQ(negnum.get_mantissa(), 0x2000000000000000000000000000_u128);
EXPECT_EQ(negnum.uintval(), 0xBFFF2000000000000000000000000000_u128);
EXPECT_EQ(negnum.get_mantissa(), 0x2000'00000000'00000000'00000000_u128);
EXPECT_EQ(negnum.uintval(), 0xBFFF2000'00000000'00000000'00000000_u128);
EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(),
"0xBFFF2000000000000000000000000000 = "
"(S: 1, E: 0x3FFF, M: 0x00002000000000000000000000000000)");
@ -599,7 +599,7 @@ TEST(LlvmLibcFPBitsTest, Float128Type) {
EXPECT_TRUE(negzero.is_neg());
EXPECT_EQ(negzero.get_biased_exponent(), 0_u16);
EXPECT_EQ(negzero.get_mantissa(), 0_u128);
EXPECT_EQ(negzero.uintval(), 0x80000000000000000000000000000000_u128);
EXPECT_EQ(negzero.uintval(), 0x80000000'00000000'00000000'00000000_u128);
EXPECT_STREQ(LIBC_NAMESPACE::str(negzero).c_str(),
"0x80000000000000000000000000000000 = "
"(S: 1, E: 0x0000, M: 0x00000000000000000000000000000000)");
@ -608,7 +608,7 @@ TEST(LlvmLibcFPBitsTest, Float128Type) {
EXPECT_TRUE(one.is_pos());
EXPECT_EQ(one.get_biased_exponent(), 0x3FFF_u16);
EXPECT_EQ(one.get_mantissa(), 0_u128);
EXPECT_EQ(one.uintval(), 0x3FFF0000000000000000000000000000_u128);
EXPECT_EQ(one.uintval(), 0x3FFF0000'00000000'00000000'00000000_u128);
EXPECT_STREQ(LIBC_NAMESPACE::str(one).c_str(),
"0x3FFF0000000000000000000000000000 = "
"(S: 0, E: 0x3FFF, M: 0x00000000000000000000000000000000)");
@ -617,7 +617,7 @@ TEST(LlvmLibcFPBitsTest, Float128Type) {
EXPECT_TRUE(negone.is_neg());
EXPECT_EQ(negone.get_biased_exponent(), 0x3FFF_u16);
EXPECT_EQ(negone.get_mantissa(), 0_u128);
EXPECT_EQ(negone.uintval(), 0xBFFF0000000000000000000000000000_u128);
EXPECT_EQ(negone.uintval(), 0xBFFF0000'00000000'00000000'00000000_u128);
EXPECT_STREQ(LIBC_NAMESPACE::str(negone).c_str(),
"0xBFFF0000000000000000000000000000 = "
"(S: 1, E: 0x3FFF, M: 0x00000000000000000000000000000000)");
@ -625,8 +625,8 @@ TEST(LlvmLibcFPBitsTest, Float128Type) {
Float128Bits num(float128(1.125));
EXPECT_TRUE(num.is_pos());
EXPECT_EQ(num.get_biased_exponent(), 0x3FFF_u16);
EXPECT_EQ(num.get_mantissa(), 0x2000000000000000000000000000_u128);
EXPECT_EQ(num.uintval(), 0x3FFF2000000000000000000000000000_u128);
EXPECT_EQ(num.get_mantissa(), 0x2000'00000000'00000000'00000000_u128);
EXPECT_EQ(num.uintval(), 0x3FFF2000'00000000'00000000'00000000_u128);
EXPECT_STREQ(LIBC_NAMESPACE::str(num).c_str(),
"0x3FFF2000000000000000000000000000 = "
"(S: 0, E: 0x3FFF, M: 0x00002000000000000000000000000000)");
@ -634,8 +634,8 @@ TEST(LlvmLibcFPBitsTest, Float128Type) {
Float128Bits negnum(float128(-1.125));
EXPECT_TRUE(negnum.is_neg());
EXPECT_EQ(negnum.get_biased_exponent(), 0x3FFF_u16);
EXPECT_EQ(negnum.get_mantissa(), 0x2000000000000000000000000000_u128);
EXPECT_EQ(negnum.uintval(), 0xBFFF2000000000000000000000000000_u128);
EXPECT_EQ(negnum.get_mantissa(), 0x2000'00000000'00000000'00000000_u128);
EXPECT_EQ(negnum.uintval(), 0xBFFF2000'00000000'00000000'00000000_u128);
EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(),
"0xBFFF2000000000000000000000000000 = "
"(S: 1, E: 0x3FFF, M: 0x00002000000000000000000000000000)");

View File

@ -10,6 +10,7 @@
#include "src/__support/CPP/string_view.h"
#include "src/__support/UInt.h"
#include "src/__support/UInt128.h"
#include "src/__support/integer_literals.h"
#include "src/__support/integer_to_string.h"
#include "test/UnitTest/Test.h"
@ -24,6 +25,8 @@ using LIBC_NAMESPACE::radix::Custom;
using LIBC_NAMESPACE::radix::Dec;
using LIBC_NAMESPACE::radix::Hex;
using LIBC_NAMESPACE::radix::Oct;
using LIBC_NAMESPACE::operator""_u128;
using LIBC_NAMESPACE::operator""_u256;
#define EXPECT(type, value, string_value) \
{ \
@ -204,11 +207,11 @@ TEST(LlvmLibcIntegerToStringTest, UINT128_Base_16) {
using type = IntegerToString<UInt128, Hex::WithWidth<32>>;
EXPECT(type, 0, "00000000000000000000000000000000");
EXPECT(type, 0x12345, "00000000000000000000000000012345");
EXPECT(type, static_cast<UInt128>(0x1234) << 112,
EXPECT(type, 0x12340000'00000000'00000000'00000000_u128,
"12340000000000000000000000000000");
EXPECT(type, static_cast<UInt128>(0x1234) << 48,
EXPECT(type, 0x00000000'00000000'12340000'00000000_u128,
"00000000000000001234000000000000");
EXPECT(type, static_cast<UInt128>(0x1234) << 52,
EXPECT(type, 0x00000000'00000001'23400000'00000000_u128,
"00000000000000012340000000000000");
}
@ -227,16 +230,26 @@ TEST(LlvmLibcIntegerToStringTest, UINT64_Base_36) {
TEST(LlvmLibcIntegerToStringTest, UINT256_Base_16) {
using UInt256 = LIBC_NAMESPACE::cpp::UInt<256>;
using type = IntegerToString<UInt256, Hex::WithWidth<64>>;
EXPECT(type, static_cast<UInt256>(0),
"0000000000000000000000000000000000000000000000000000000000000000");
EXPECT(type, static_cast<UInt256>(0x12345),
"0000000000000000000000000000000000000000000000000000000000012345");
EXPECT(type, static_cast<UInt256>(0x1234) << 112,
"0000000000000000000000000000000012340000000000000000000000000000");
EXPECT(type, static_cast<UInt256>(0x1234) << 116,
"0000000000000000000000000000000123400000000000000000000000000000");
EXPECT(type, static_cast<UInt256>(0x1234) << 240,
"1234000000000000000000000000000000000000000000000000000000000000");
EXPECT(
type,
0x0000000000000000000000000000000000000000000000000000000000000000_u256,
"0000000000000000000000000000000000000000000000000000000000000000");
EXPECT(
type,
0x0000000000000000000000000000000000000000000000000000000000012345_u256,
"0000000000000000000000000000000000000000000000000000000000012345");
EXPECT(
type,
0x0000000000000000000000000000000012340000000000000000000000000000_u256,
"0000000000000000000000000000000012340000000000000000000000000000");
EXPECT(
type,
0x0000000000000000000000000000000123400000000000000000000000000000_u256,
"0000000000000000000000000000000123400000000000000000000000000000");
EXPECT(
type,
0x1234000000000000000000000000000000000000000000000000000000000000_u256,
"1234000000000000000000000000000000000000000000000000000000000000");
}
TEST(LlvmLibcIntegerToStringTest, NegativeInterpretedAsPositive) {

View File

@ -1,8 +1,11 @@
#include "str_to_fp_test.h"
#include "src/__support/integer_literals.h"
namespace LIBC_NAMESPACE {
using LlvmLibcStrToLongDblTest = LlvmLibcStrToFloatTest<long double>;
using LIBC_NAMESPACE::operator""_u128;
#if defined(LIBC_LONG_DOUBLE_IS_FLOAT64)
@ -18,15 +21,12 @@ TEST_F(LlvmLibcStrToLongDblTest, EiselLemireFloat80Simple) {
}
TEST_F(LlvmLibcStrToLongDblTest, EiselLemireFloat80LongerMantissa) {
eisel_lemire_test((UInt128(0x1234567812345678) << 64) +
UInt128(0x1234567812345678),
0, 0x91a2b3c091a2b3c1, 16507);
eisel_lemire_test((UInt128(0x1234567812345678) << 64) +
UInt128(0x1234567812345678),
300, 0xd97757de56adb65c, 17503);
eisel_lemire_test((UInt128(0x1234567812345678) << 64) +
UInt128(0x1234567812345678),
-300, 0xc30feb9a7618457d, 15510);
eisel_lemire_test(0x12345678'12345678'12345678'12345678_u128, 0,
0x91a2b3c091a2b3c1, 16507);
eisel_lemire_test(0x12345678'12345678'12345678'12345678_u128, 300,
0xd97757de56adb65c, 17503);
eisel_lemire_test(0x12345678'12345678'12345678'12345678_u128, -300,
0xc30feb9a7618457d, 15510);
}
// These tests check numbers at the edge of the DETAILED_POWERS_OF_TEN table.
@ -57,30 +57,24 @@ TEST_F(LlvmLibcStrToLongDblTest, EiselLemireFloat80Fallback) {
#else // Quad precision long double
TEST_F(LlvmLibcStrToLongDblTest, EiselLemireFloat128Simple) {
eisel_lemire_test(123, 0, (UInt128(0x1ec0000000000) << 64), 16389);
eisel_lemire_test(
12345678901234568192u, 0,
(UInt128(0x156a95319d63e) << 64) + UInt128(0x1800000000000000), 16446);
eisel_lemire_test(123, 0, 0x1ec00'00000000'00000000'00000000_u128, 16389);
eisel_lemire_test(12345678901234568192u, 0,
0x156a9'5319d63e'18000000'00000000_u128, 16446);
}
TEST_F(LlvmLibcStrToLongDblTest, EiselLemireFloat128LongerMantissa) {
eisel_lemire_test(
(UInt128(0x1234567812345678) << 64) + UInt128(0x1234567812345678), 0,
(UInt128(0x1234567812345) << 64) + UInt128(0x6781234567812345), 16507);
eisel_lemire_test(
(UInt128(0x1234567812345678) << 64) + UInt128(0x1234567812345678), 300,
(UInt128(0x1b2eeafbcad5b) << 64) + UInt128(0x6cb8b4451dfcde19), 17503);
eisel_lemire_test(
(UInt128(0x1234567812345678) << 64) + UInt128(0x1234567812345678), -300,
(UInt128(0x1861fd734ec30) << 64) + UInt128(0x8afa7189f0f7595f), 15510);
eisel_lemire_test(0x12345678'12345678'12345678'12345678_u128, 0,
0x12345'67812345'67812345'67812345_u128, 16507);
eisel_lemire_test(0x12345678'12345678'12345678'12345678_u128, 300,
0x1b2ee'afbcad5b'6cb8b445'1dfcde19_u128, 17503);
eisel_lemire_test(0x12345678'12345678'12345678'12345678_u128, -300,
0x1861f'd734ec30'8afa7189'f0f7595f_u128, 15510);
}
TEST_F(LlvmLibcStrToLongDblTest, EiselLemireFloat128Fallback) {
ASSERT_FALSE(
internal::eisel_lemire<long double>(
{(UInt128(0x5ce0e9a56015fec5) << 64) + UInt128(0xaadfa328ae39b333),
1})
.has_value());
ASSERT_FALSE(internal::eisel_lemire<long double>(
{0x5ce0e9a5'6015fec5'aadfa328'ae39b333_u128, 1})
.has_value());
}
#endif

View File

@ -1292,6 +1292,7 @@ libc_math_function(
":__support_fputil_polyeval",
":__support_fputil_rounding_mode",
":__support_fputil_triple_double",
":__support_integer_literals",
":__support_macros_optimization",
":common_constants",
":explogxf",
@ -1322,6 +1323,7 @@ libc_math_function(
":__support_fputil_polyeval",
":__support_fputil_rounding_mode",
":__support_fputil_triple_double",
":__support_integer_literals",
":__support_macros_optimization",
":common_constants",
":explogxf",
@ -1351,6 +1353,7 @@ libc_math_function(
":__support_fputil_polyeval",
":__support_fputil_rounding_mode",
":__support_fputil_triple_double",
":__support_integer_literals",
":__support_macros_optimization",
":common_constants",
":explogxf",
@ -1374,6 +1377,7 @@ libc_math_function(
":__support_fputil_polyeval",
":__support_fputil_rounding_mode",
":__support_fputil_triple_double",
":__support_integer_literals",
":__support_macros_optimization",
":common_constants",
":explogxf",
@ -1437,11 +1441,12 @@ libc_math_function(
libc_math_function(
name = "log",
additional_deps = [
":__support_fputil_double_double",
":__support_fputil_dyadic_float",
":__support_fputil_fma",
":__support_fputil_multiply_add",
":__support_fputil_polyeval",
":__support_fputil_double_double",
":__support_fputil_dyadic_float",
":__support_integer_literals",
":__support_macros_optimization",
":__support_macros_properties_cpu_features",
":common_constants",
@ -1452,11 +1457,12 @@ libc_math_function(
libc_math_function(
name = "log2",
additional_deps = [
":__support_fputil_double_double",
":__support_fputil_dyadic_float",
":__support_fputil_fma",
":__support_fputil_multiply_add",
":__support_fputil_polyeval",
":__support_fputil_double_double",
":__support_fputil_dyadic_float",
":__support_integer_literals",
":__support_macros_optimization",
":__support_macros_properties_cpu_features",
":common_constants",
@ -1467,11 +1473,12 @@ libc_math_function(
libc_math_function(
name = "log10",
additional_deps = [
":__support_fputil_double_double",
":__support_fputil_dyadic_float",
":__support_fputil_fma",
":__support_fputil_multiply_add",
":__support_fputil_polyeval",
":__support_fputil_double_double",
":__support_fputil_dyadic_float",
":__support_integer_literals",
":__support_macros_optimization",
":__support_macros_properties_cpu_features",
":common_constants",
@ -1482,11 +1489,12 @@ libc_math_function(
libc_math_function(
name = "log1p",
additional_deps = [
":__support_fputil_double_double",
":__support_fputil_dyadic_float",
":__support_fputil_fma",
":__support_fputil_multiply_add",
":__support_fputil_polyeval",
":__support_fputil_double_double",
":__support_fputil_dyadic_float",
":__support_integer_literals",
":__support_macros_optimization",
":__support_macros_properties_cpu_features",
":common_constants",

View File

@ -50,6 +50,7 @@ libc_test(
],
deps = [
"//libc:__support_fputil_fp_bits",
"//libc:__support_integer_literals",
"//libc:__support_str_to_float",
"//libc:__support_uint128",
],
@ -61,6 +62,7 @@ libc_test(
deps = [
"//libc:__support_cpp_span",
"//libc:__support_cpp_string_view",
"//libc:__support_integer_literals",
"//libc:__support_integer_to_string",
"//libc:__support_uint",
"//libc:__support_uint128",