[libc-commits] [libc] [llvm] [libc][math] Refactor log10, log1p, log2 implementation to header-only in src/__support/math folder. (PR #176089)
Muhammad Bassiouni via libc-commits
libc-commits at lists.llvm.org
Thu Jan 15 22:58:19 PST 2026
================
@@ -0,0 +1,1068 @@
+//===-- Double-precision log1p(x) function --------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_LOG1P_H
+#define LLVM_LIBC_SRC___SUPPORT_MATH_LOG1P_H
+
+#include "common_constants.h"
+#include "src/__support/FPUtil/FEnvImpl.h"
+#include "src/__support/FPUtil/FPBits.h"
+#include "src/__support/FPUtil/PolyEval.h"
+#include "src/__support/FPUtil/double_double.h"
+#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/config.h"
+#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY
+
+namespace LIBC_NAMESPACE_DECL {
+
+namespace math {
+namespace log1p_internal {
+// 128-bit precision dyadic floating point numbers.
+using Float128 = typename fputil::DyadicFloat<128>;
+
+using LIBC_NAMESPACE::operator""_u128;
+
+using namespace common_constants_internal;
+
+// R1[i] = 2^-8 * nearestint( 2^8 / (1 + i * 2^-7) )
+constexpr double R1[129] = {
+ 0x1p0, 0x1.fcp-1, 0x1.f8p-1, 0x1.f4p-1, 0x1.fp-1, 0x1.ecp-1, 0x1.eap-1,
+ 0x1.e6p-1, 0x1.e2p-1, 0x1.dep-1, 0x1.dap-1, 0x1.d8p-1, 0x1.d4p-1, 0x1.dp-1,
+ 0x1.cep-1, 0x1.cap-1, 0x1.c8p-1, 0x1.c4p-1, 0x1.cp-1, 0x1.bep-1, 0x1.bap-1,
+ 0x1.b8p-1, 0x1.b4p-1, 0x1.b2p-1, 0x1.bp-1, 0x1.acp-1, 0x1.aap-1, 0x1.a6p-1,
+ 0x1.a4p-1, 0x1.a2p-1, 0x1.9ep-1, 0x1.9cp-1, 0x1.9ap-1, 0x1.98p-1, 0x1.94p-1,
+ 0x1.92p-1, 0x1.9p-1, 0x1.8ep-1, 0x1.8ap-1, 0x1.88p-1, 0x1.86p-1, 0x1.84p-1,
+ 0x1.82p-1, 0x1.8p-1, 0x1.7ep-1, 0x1.7ap-1, 0x1.78p-1, 0x1.76p-1, 0x1.74p-1,
+ 0x1.72p-1, 0x1.7p-1, 0x1.6ep-1, 0x1.6cp-1, 0x1.6ap-1, 0x1.68p-1, 0x1.66p-1,
+ 0x1.64p-1, 0x1.62p-1, 0x1.6p-1, 0x1.5ep-1, 0x1.5cp-1, 0x1.5ap-1, 0x1.58p-1,
+ 0x1.58p-1, 0x1.56p-1, 0x1.54p-1, 0x1.52p-1, 0x1.5p-1, 0x1.4ep-1, 0x1.4cp-1,
+ 0x1.4ap-1, 0x1.4ap-1, 0x1.48p-1, 0x1.46p-1, 0x1.44p-1, 0x1.42p-1, 0x1.42p-1,
+ 0x1.4p-1, 0x1.3ep-1, 0x1.3cp-1, 0x1.3cp-1, 0x1.3ap-1, 0x1.38p-1, 0x1.36p-1,
+ 0x1.36p-1, 0x1.34p-1, 0x1.32p-1, 0x1.3p-1, 0x1.3p-1, 0x1.2ep-1, 0x1.2cp-1,
+ 0x1.2cp-1, 0x1.2ap-1, 0x1.28p-1, 0x1.28p-1, 0x1.26p-1, 0x1.24p-1, 0x1.24p-1,
+ 0x1.22p-1, 0x1.2p-1, 0x1.2p-1, 0x1.1ep-1, 0x1.1cp-1, 0x1.1cp-1, 0x1.1ap-1,
+ 0x1.1ap-1, 0x1.18p-1, 0x1.16p-1, 0x1.16p-1, 0x1.14p-1, 0x1.14p-1, 0x1.12p-1,
+ 0x1.12p-1, 0x1.1p-1, 0x1.0ep-1, 0x1.0ep-1, 0x1.0cp-1, 0x1.0cp-1, 0x1.0ap-1,
+ 0x1.0ap-1, 0x1.08p-1, 0x1.08p-1, 0x1.06p-1, 0x1.06p-1, 0x1.04p-1, 0x1.04p-1,
+ 0x1.02p-1, 0x1.02p-1, 0x1p-1,
+};
+
+// Extra constants for exact range reduction when FMA instructions are not
+// available:
+// r * c - 1 for r = 2^-8 * nearestint( 2^8 / (1 + i * 2^-7))
+// and c = 1 + i * 2^-7
+// with i = 0..128.
+[[maybe_unused]] constexpr double RCM1[129] = {
+ 0.0, -0x1p-14, -0x1p-12, -0x1.2p-11, -0x1p-10, -0x1.9p-10,
+ 0x1.fp-10, 0x1.28p-10, 0x1p-12, -0x1.9p-11, -0x1.fp-10, 0x1.2p-10,
+ -0x1p-12, -0x1.cp-10, 0x1.1p-10, -0x1.5p-11, 0x1p-9, 0x1p-14,
+ -0x1p-9, 0x1.ap-12, -0x1.ep-10, 0x1.8p-12, -0x1.1p-9, -0x1p-15,
+ 0x1p-9, -0x1.ap-11, 0x1.1p-10, -0x1.f8p-10, -0x1p-12, 0x1.68p-10,
+ -0x1.fp-10, -0x1.cp-12, 0x1p-10, 0x1.3p-9, -0x1.6p-10, -0x1.4p-13,
+ 0x1p-10, 0x1.0cp-9, -0x1.08p-9, -0x1.2p-10, -0x1p-12, 0x1.2p-11,
+ 0x1.5p-10, 0x1p-9, 0x1.5p-9, -0x1.1cp-9, -0x1.cp-10, -0x1.58p-10,
+ -0x1p-10, -0x1.7p-11, -0x1p-11, -0x1.6p-12, -0x1p-12, -0x1.cp-13,
+ -0x1p-12, -0x1.6p-12, -0x1p-11, -0x1.7p-11, -0x1p-10, -0x1.58p-10,
+ -0x1.cp-10, -0x1.1cp-9, -0x1.6p-9, 0x1.5p-9, 0x1p-9, 0x1.5p-10,
+ 0x1.2p-11, -0x1p-12, -0x1.2p-10, -0x1.08p-9, -0x1.88p-9, 0x1.0cp-9,
+ 0x1p-10, -0x1.4p-13, -0x1.6p-10, -0x1.54p-9, 0x1.3p-9, 0x1p-10,
+ -0x1.cp-12, -0x1.fp-10, 0x1.8p-9, 0x1.68p-10, -0x1p-12, -0x1.f8p-10,
+ 0x1.7p-9, 0x1.1p-10, -0x1.ap-11, -0x1.6p-9, 0x1p-9, -0x1p-15,
+ -0x1.1p-9, 0x1.48p-9, 0x1.8p-12, -0x1.ep-10, 0x1.6p-9, 0x1.ap-12,
+ -0x1p-9, 0x1.48p-9, 0x1p-14, -0x1.4p-9, 0x1p-9, -0x1.5p-11,
+ -0x1.bp-9, 0x1.1p-10, -0x1.cp-10, 0x1.54p-9, -0x1p-12, -0x1.9cp-9,
+ 0x1.2p-10, -0x1.fp-10, 0x1.3p-9, -0x1.9p-11, 0x1.cp-9, 0x1p-12,
+ -0x1.88p-9, 0x1.28p-10, -0x1.2p-9, 0x1.fp-10, -0x1.9p-10, 0x1.4cp-9,
+ -0x1p-10, 0x1.9p-9, -0x1.2p-11, 0x1.c4p-9, -0x1p-12, 0x1.e8p-9,
+ -0x1p-14, 0x1.fcp-9, 0.0,
+};
+
+// Generated by Sollya with:
+// for i from 0 to 128 do {
+// r = 2^-8 * nearestint( 2^8 / (1 + i*2^-7) );
+// b = nearestint(log(r)*2^43) * 2^-43;
+// c = round(log(r) - b, D, RN);
+// print("{", -c, ",", -b, "},");
+// };
+// We replace LOG_R1_DD[128] with log(1.0) == 0.0
+alignas(16) constexpr fputil::DoubleDouble LOG_R1_DD[129] = {
+ {0.0, 0.0},
+ {-0x1.0c76b999d2be8p-46, 0x1.010157589p-7},
+ {-0x1.3dc5b06e2f7d2p-45, 0x1.0205658938p-6},
+ {-0x1.aa0ba325a0c34p-45, 0x1.8492528c9p-6},
+ {0x1.111c05cf1d753p-47, 0x1.0415d89e74p-5},
+ {-0x1.c167375bdfd28p-45, 0x1.466aed42ep-5},
+ {-0x1.29efbec19afa2p-47, 0x1.67c94f2d4cp-5},
+ {0x1.0fc1a353bb42ep-45, 0x1.aaef2d0fbp-5},
+ {-0x1.e113e4fc93b7bp-47, 0x1.eea31c006cp-5},
+ {-0x1.5325d560d9e9bp-45, 0x1.1973bd1466p-4},
+ {0x1.cc85ea5db4ed7p-45, 0x1.3bdf5a7d1ep-4},
+ {-0x1.53a2582f4e1efp-48, 0x1.4d3115d208p-4},
+ {0x1.c1e8da99ded32p-49, 0x1.700d30aeacp-4},
+ {0x1.3115c3abd47dap-45, 0x1.9335e5d594p-4},
+ {-0x1.e42b6b94407c8p-47, 0x1.a4e7640b1cp-4},
+ {0x1.646d1c65aacd3p-45, 0x1.c885801bc4p-4},
+ {0x1.a89401fa71733p-46, 0x1.da72763844p-4},
+ {-0x1.534d64fa10afdp-45, 0x1.fe89139dbep-4},
+ {0x1.1ef78ce2d07f2p-45, 0x1.1178e8227ep-3},
+ {0x1.ca78e44389934p-45, 0x1.1aa2b7e23fp-3},
+ {0x1.39d6ccb81b4a1p-47, 0x1.2d1610c868p-3},
+ {0x1.62fa8234b7289p-51, 0x1.365fcb0159p-3},
+ {0x1.5837954fdb678p-45, 0x1.4913d8333bp-3},
+ {0x1.633e8e5697dc7p-45, 0x1.527e5e4a1bp-3},
+ {-0x1.27023eb68981cp-46, 0x1.5bf406b544p-3},
+ {-0x1.5118de59c21e1p-45, 0x1.6f0128b757p-3},
+ {-0x1.c661070914305p-46, 0x1.7898d85445p-3},
+ {-0x1.73d54aae92cd1p-47, 0x1.8beafeb39p-3},
+ {0x1.7f22858a0ff6fp-47, 0x1.95a5adcf7p-3},
+ {0x1.9904d6865817ap-45, 0x1.9f6c407089p-3},
+ {-0x1.c358d4eace1aap-47, 0x1.b31d8575bdp-3},
+ {-0x1.d4bc4595412b6p-45, 0x1.bd087383bep-3},
+ {-0x1.1ec72c5962bd2p-48, 0x1.c6ffbc6f01p-3},
+ {-0x1.84a7e75b6f6e4p-47, 0x1.d1037f2656p-3},
+ {0x1.212276041f43p-51, 0x1.e530effe71p-3},
+ {-0x1.a211565bb8e11p-51, 0x1.ef5ade4ddp-3},
+ {0x1.bcbecca0cdf3p-46, 0x1.f991c6cb3bp-3},
+ {-0x1.6f08c1485e94ap-46, 0x1.01eae5626c8p-2},
+ {0x1.7188b163ceae9p-45, 0x1.0c42d67616p-2},
+ {-0x1.c210e63a5f01cp-45, 0x1.1178e8227e8p-2},
+ {0x1.b9acdf7a51681p-45, 0x1.16b5ccbacf8p-2},
+ {0x1.ca6ed5147bdb7p-45, 0x1.1bf99635a68p-2},
+ {0x1.a87deba46baeap-47, 0x1.214456d0eb8p-2},
+ {0x1.c93c1df5bb3b6p-45, 0x1.269621134d8p-2},
+ {0x1.a9cfa4a5004f4p-45, 0x1.2bef07cdc9p-2},
+ {0x1.16ecdb0f177c8p-46, 0x1.36b6776be1p-2},
+ {0x1.83b54b606bd5cp-46, 0x1.3c25277333p-2},
+ {0x1.8e436ec90e09dp-47, 0x1.419b423d5e8p-2},
+ {-0x1.f27ce0967d675p-45, 0x1.4718dc271c8p-2},
+ {-0x1.e20891b0ad8a4p-45, 0x1.4c9e09e173p-2},
+ {0x1.ebe708164c759p-45, 0x1.522ae0738ap-2},
+ {0x1.fadedee5d40efp-46, 0x1.57bf753c8dp-2},
+ {-0x1.a0b2a08a465dcp-47, 0x1.5d5bddf596p-2},
+ {-0x1.db623e731aep-45, 0x1.630030b3abp-2},
+ {0x1.0a0d32756ebap-45, 0x1.68ac83e9c68p-2},
+ {0x1.721657c222d87p-46, 0x1.6e60ee6af18p-2},
+ {0x1.d8b0949dc60b3p-45, 0x1.741d876c678p-2},
+ {0x1.9ec7d2efd1778p-45, 0x1.79e26687cf8p-2},
+ {-0x1.72090c812566ap-45, 0x1.7fafa3bd818p-2},
+ {0x1.fd56f3333778ap-45, 0x1.85855776dc8p-2},
+ {-0x1.05ae1e5e7047p-45, 0x1.8b639a88b3p-2},
+ {-0x1.766b52ee6307dp-46, 0x1.914a8635bf8p-2},
+ {-0x1.52313a502d9fp-46, 0x1.973a3431358p-2},
+ {-0x1.52313a502d9fp-46, 0x1.973a3431358p-2},
+ {-0x1.6279e10d0c0bp-45, 0x1.9d32bea15fp-2},
+ {0x1.3c6457f9d79f5p-45, 0x1.a33440224f8p-2},
+ {0x1.e36f2bea77a5dp-46, 0x1.a93ed3c8ad8p-2},
+ {-0x1.17cc552774458p-45, 0x1.af5295248dp-2},
+ {0x1.095252d841995p-46, 0x1.b56fa044628p-2},
+ {0x1.7d85bf40a666dp-45, 0x1.bb9611b80ep-2},
+ {0x1.cec807fe8e18p-45, 0x1.c1c60693fap-2},
+ {0x1.cec807fe8e18p-45, 0x1.c1c60693fap-2},
+ {-0x1.9b6ddc15249aep-45, 0x1.c7ff9c74558p-2},
+ {-0x1.797c33ec7a6bp-47, 0x1.ce42f180648p-2},
+ {0x1.35bafe9a767a8p-45, 0x1.d490246def8p-2},
+ {-0x1.ea42d60dc616ap-46, 0x1.dae75484c98p-2},
+ {-0x1.ea42d60dc616ap-46, 0x1.dae75484c98p-2},
+ {-0x1.326b207322938p-46, 0x1.e148a1a2728p-2},
+ {-0x1.465505372bd08p-45, 0x1.e7b42c3ddbp-2},
+ {0x1.f27f45a470251p-45, 0x1.ee2a156b41p-2},
+ {0x1.f27f45a470251p-45, 0x1.ee2a156b41p-2},
+ {0x1.2cde56f014a8bp-46, 0x1.f4aa7ee0318p-2},
+ {0x1.085fa3c164935p-47, 0x1.fb358af7a48p-2},
+ {-0x1.53ba3b1727b1cp-47, 0x1.00e5ae5b208p-1},
+ {-0x1.53ba3b1727b1cp-47, 0x1.00e5ae5b208p-1},
+ {-0x1.4c45fe79539ep-47, 0x1.04360be7604p-1},
+ {0x1.6812241edf5fdp-45, 0x1.078bf0533c4p-1},
+ {0x1.f486b887e7e27p-46, 0x1.0ae76e2d054p-1},
+ {0x1.f486b887e7e27p-46, 0x1.0ae76e2d054p-1},
+ {0x1.c299807801742p-46, 0x1.0e4898611ccp-1},
+ {-0x1.58647bb9ddcb2p-45, 0x1.11af823c75cp-1},
+ {-0x1.58647bb9ddcb2p-45, 0x1.11af823c75cp-1},
+ {-0x1.edd97a293ae49p-45, 0x1.151c3f6f298p-1},
+ {0x1.4cc4ef8ab465p-46, 0x1.188ee40f23cp-1},
+ {0x1.4cc4ef8ab465p-46, 0x1.188ee40f23cp-1},
+ {0x1.cacdeed70e667p-51, 0x1.1c07849ae6p-1},
+ {-0x1.a7242c9fe81d3p-45, 0x1.1f8635fc618p-1},
+ {-0x1.a7242c9fe81d3p-45, 0x1.1f8635fc618p-1},
+ {0x1.2fc066e48667bp-46, 0x1.230b0d8bebcp-1},
+ {-0x1.b61f10522625p-47, 0x1.269621134dcp-1},
+ {-0x1.b61f10522625p-47, 0x1.269621134dcp-1},
+ {0x1.06d2be797882dp-45, 0x1.2a2786d0ecp-1},
+ {-0x1.7a6e507b9dc11p-46, 0x1.2dbf557b0ep-1},
+ {-0x1.7a6e507b9dc11p-46, 0x1.2dbf557b0ep-1},
+ {-0x1.74e93c5a0ed9cp-45, 0x1.315da443408p-1},
+ {-0x1.74e93c5a0ed9cp-45, 0x1.315da443408p-1},
+ {0x1.0b83f9527e6acp-46, 0x1.35028ad9d8cp-1},
+ {-0x1.18b7abb5569a4p-45, 0x1.38ae2171978p-1},
+ {-0x1.18b7abb5569a4p-45, 0x1.38ae2171978p-1},
+ {-0x1.2b7367cfe13c2p-47, 0x1.3c6080c36cp-1},
+ {-0x1.2b7367cfe13c2p-47, 0x1.3c6080c36cp-1},
+ {-0x1.6ce7930f0c74cp-45, 0x1.4019c2125ccp-1},
+ {-0x1.6ce7930f0c74cp-45, 0x1.4019c2125ccp-1},
+ {-0x1.d984f481051f7p-48, 0x1.43d9ff2f924p-1},
+ {-0x1.2cb6af94d60aap-45, 0x1.47a1527e8a4p-1},
+ {-0x1.2cb6af94d60aap-45, 0x1.47a1527e8a4p-1},
+ {0x1.f7115ed4c541cp-49, 0x1.4b6fd6f970cp-1},
+ {0x1.f7115ed4c541cp-49, 0x1.4b6fd6f970cp-1},
+ {-0x1.e6c516d93b8fbp-45, 0x1.4f45a835a5p-1},
+ {-0x1.e6c516d93b8fbp-45, 0x1.4f45a835a5p-1},
+ {0x1.5ccc45d257531p-47, 0x1.5322e268678p-1},
+ {0x1.5ccc45d257531p-47, 0x1.5322e268678p-1},
+ {0x1.9980bff3303ddp-47, 0x1.5707a26bb8cp-1},
+ {0x1.9980bff3303ddp-47, 0x1.5707a26bb8cp-1},
+ {0x1.dfa63ac10c9fbp-45, 0x1.5af405c3648p-1},
+ {0x1.dfa63ac10c9fbp-45, 0x1.5af405c3648p-1},
+ {0x1.202380cda46bep-45, 0x1.5ee82aa2418p-1},
+ {0x1.202380cda46bep-45, 0x1.5ee82aa2418p-1},
+ {0.0, 0.0},
+};
+
+// Degree-7 minimax polynomial log(1 + v) ~ v - v^2 / 2 + ...
+// generated by Sollya with:
+// > P = fpminimax(log(1 + x)/x, 6, [|1, 1, D...|],
+// [-0x1.69000000000edp-8, 0x1.7f00000000081p-8]);
+constexpr double P_COEFFS[6] = {-0x1p-1,
+ 0x1.5555555555166p-2,
+ -0x1.fffffffdb7746p-3,
+ 0x1.99999a8718a6p-3,
+ -0x1.555874ce8ce22p-3,
+ 0x1.24335555ddbe5p-3};
+
+#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS
+// Extra errors from P is from using x^2 to reduce evaluation latency and
+// directional rounding.
+constexpr double P_ERR = 0x1.0p-49;
+
+// 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);
+
+// -log(r1) with 128-bit precision generated by SageMath with:
+//
+// 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, ", 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:
+// s(k) = 2^-18 round( 2^18 / (1 + k*2^-14) ) - 1 for k = -91 .. 96
+// Output range:
+// [-0x1.1037c00000040271p-15 , 0x1.108480000008096cp-15]
+constexpr double S2[198] = {
+ 0x1.6ep-8, 0x1.6ap-8, 0x1.66p-8, 0x1.62p-8, 0x1.5dcp-8,
+ 0x1.59cp-8, 0x1.55cp-8, 0x1.51cp-8, 0x1.4dcp-8, 0x1.49cp-8,
+ 0x1.458p-8, 0x1.418p-8, 0x1.3d8p-8, 0x1.398p-8, 0x1.358p-8,
+ 0x1.318p-8, 0x1.2d8p-8, 0x1.294p-8, 0x1.254p-8, 0x1.214p-8,
+ 0x1.1d4p-8, 0x1.194p-8, 0x1.154p-8, 0x1.114p-8, 0x1.0dp-8,
+ 0x1.09p-8, 0x1.05p-8, 0x1.01p-8, 0x1.fap-9, 0x1.f2p-9,
+ 0x1.eap-9, 0x1.e2p-9, 0x1.d98p-9, 0x1.d18p-9, 0x1.c98p-9,
+ 0x1.c18p-9, 0x1.b98p-9, 0x1.b18p-9, 0x1.a98p-9, 0x1.a18p-9,
+ 0x1.998p-9, 0x1.91p-9, 0x1.89p-9, 0x1.81p-9, 0x1.79p-9,
+ 0x1.71p-9, 0x1.69p-9, 0x1.61p-9, 0x1.59p-9, 0x1.51p-9,
+ 0x1.49p-9, 0x1.41p-9, 0x1.388p-9, 0x1.308p-9, 0x1.288p-9,
+ 0x1.208p-9, 0x1.188p-9, 0x1.108p-9, 0x1.088p-9, 0x1.008p-9,
+ 0x1.f1p-10, 0x1.e1p-10, 0x1.d1p-10, 0x1.c1p-10, 0x1.b1p-10,
+ 0x1.a1p-10, 0x1.91p-10, 0x1.81p-10, 0x1.71p-10, 0x1.6p-10,
+ 0x1.5p-10, 0x1.4p-10, 0x1.3p-10, 0x1.2p-10, 0x1.1p-10,
+ 0x1p-10, 0x1.ep-11, 0x1.cp-11, 0x1.ap-11, 0x1.8p-11,
+ 0x1.6p-11, 0x1.4p-11, 0x1.2p-11, 0x1p-11, 0x1.cp-12,
+ 0x1.8p-12, 0x1.4p-12, 0x1p-12, 0x1.8p-13, 0x1p-13,
+ 0x1p-14, 0.0, -0x1p-14, -0x1p-13, -0x1.8p-13,
+ -0x1p-12, -0x1.4p-12, -0x1.8p-12, -0x1.cp-12, -0x1p-11,
+ -0x1.2p-11, -0x1.4p-11, -0x1.6p-11, -0x1.8p-11, -0x1.ap-11,
+ -0x1.cp-11, -0x1.ep-11, -0x1p-10, -0x1.1p-10, -0x1.2p-10,
+ -0x1.3p-10, -0x1.4p-10, -0x1.5p-10, -0x1.6p-10, -0x1.6fp-10,
+ -0x1.7fp-10, -0x1.8fp-10, -0x1.9fp-10, -0x1.afp-10, -0x1.bfp-10,
+ -0x1.cfp-10, -0x1.dfp-10, -0x1.efp-10, -0x1.ffp-10, -0x1.078p-9,
+ -0x1.0f8p-9, -0x1.178p-9, -0x1.1f8p-9, -0x1.278p-9, -0x1.2f8p-9,
+ -0x1.378p-9, -0x1.3fp-9, -0x1.47p-9, -0x1.4fp-9, -0x1.57p-9,
+ -0x1.5fp-9, -0x1.67p-9, -0x1.6fp-9, -0x1.77p-9, -0x1.7fp-9,
+ -0x1.87p-9, -0x1.8fp-9, -0x1.968p-9, -0x1.9e8p-9, -0x1.a68p-9,
+ -0x1.ae8p-9, -0x1.b68p-9, -0x1.be8p-9, -0x1.c68p-9, -0x1.ce8p-9,
+ -0x1.d68p-9, -0x1.dep-9, -0x1.e6p-9, -0x1.eep-9, -0x1.f6p-9,
+ -0x1.fep-9, -0x1.03p-8, -0x1.07p-8, -0x1.0bp-8, -0x1.0fp-8,
+ -0x1.12cp-8, -0x1.16cp-8, -0x1.1acp-8, -0x1.1ecp-8, -0x1.22cp-8,
+ -0x1.26cp-8, -0x1.2acp-8, -0x1.2e8p-8, -0x1.328p-8, -0x1.368p-8,
+ -0x1.3a8p-8, -0x1.3e8p-8, -0x1.428p-8, -0x1.464p-8, -0x1.4a4p-8,
+ -0x1.4e4p-8, -0x1.524p-8, -0x1.564p-8, -0x1.5a4p-8, -0x1.5ep-8,
+ -0x1.62p-8, -0x1.66p-8, -0x1.6ap-8, -0x1.6ep-8, -0x1.72p-8,
+ -0x1.75cp-8, -0x1.79cp-8, -0x1.7dcp-8,
+};
+
+// -log(r) for the second step, generated by SageMath with:
+//
+// for i in range(-91, 97):
+// 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, ",
+// format_hex(m), "},");
+constexpr Float128 LOG_R2[198] = {
----------------
bassiounix wrote:
```suggestion
LIBC_INLINE_VAR constexpr Float128 LOG_R2[198] = {
```
https://github.com/llvm/llvm-project/pull/176089
More information about the libc-commits
mailing list