commit 9ed970090c1fe6b7d2d2f0eef1a59343e7b9a67d (tree)
parent cc71a1af48aeaea4502aaa0592c413e4b964faba
Author: Christophe Delage <christ@ophe.net>
Date: Fri, 29 May 2026 12:40:58 +0200
Better comments
Diffstat:
3 files changed, 39 insertions(+), 16 deletions(-)
diff --git a/lib/compiler_rt/log.zig b/lib/compiler_rt/log.zig
@@ -480,10 +480,11 @@ pub fn logq(x: f128) callconv(.c) f128 {
const u = 2 * f * g;
const v = u * u;
const uv = u * v;
-
const v64: f64 = @floatCast(v);
- // use f64 for the last few coefficients to improve performance
+ // Polynomial approximation of log((1 + u / 2) / (1 - u / 2))
+ // in [2 * a / (2 + a), 2 * b / (2 + b)]
+ // where a = exp(-1 / 16) - 1 and b = exp(1 / 16) - 1
const p19 = 2.0165671588771827537210411918018159e-7;
const p17 = 8.97568550755477160981619052649713e-7 + v64 * p19;
const p15 = 4.069010449774280288178309893970754e-6 + v64 * p17;
@@ -492,8 +493,9 @@ pub fn logq(x: f128) callconv(.c) f128 {
const p9 = 4.340277777777777776216500817402857e-4 + v * p11;
const p7 = 2.2321428571428571428572328745789477e-3 + v * p9;
const p5 = 1.249999999999999999999999997455655e-2 + v * p7;
+ const p3 = 8.333333333333333333333333333333581e-2;
- const q_hi = uv * 8.333333333333333333333333333333581e-2;
+ const q_hi = uv * p3;
const q_lo = uv * v * p5;
const q = q_hi + q_lo;
@@ -518,9 +520,11 @@ pub fn logq(x: f128) callconv(.c) f128 {
const u = (f + f) / (y + F);
const v = u * u;
-
const v64: f64 = @floatCast(v);
- // use f64 for the last coefficient to improve performance
+
+ // Polynomial approximation of log(1 + 2 * u / (2 - u))
+ // in [-(2 * fmax) / (2 + fmax), (2 * fmax) / (2 - fmax)]
+ // where fmax = 0.5 / size
const p11 = 8.877925718782769769445565656611838e-5;
const p9 = 4.340277777635300605611118803507141e-4 + v64 * p11;
const p7 = 2.2321428571428572515097318595359542e-3 + v * p9;
@@ -529,6 +533,9 @@ pub fn logq(x: f128) callconv(.c) f128 {
const q = u * v * p3;
+ // log1p_tab[j].hi = 2^-n * round-to-integer(2^n * l)
+ // log1p_tab[j].lo = round-to-nearest-f128(l - log1p_tab[j].hi)
+ // where n = 97 and l = log(1 + j / size)
const log1p_tab = [size + 1]struct { hi: f128, lo: f128 }{
.{ .hi = 0, .lo = 0 },
.{ .hi = 0x1.fe02a6b106788fc3769039p-8, .lo = 0x1.dc282d2b3db2c3ef9a073a876702p-100 },
diff --git a/lib/compiler_rt/log10.zig b/lib/compiler_rt/log10.zig
@@ -211,9 +211,11 @@ pub fn log10q(x: f128) callconv(.c) f128 {
const u = 2 * f * g;
const v = u * u;
const uv = u * v;
-
const v64: f64 = @floatCast(v);
- // use f64 for the last few coefficients to improve performance
+
+ // Polynomial approximation of log10((1 + u / 2) / (1 - u / 2))
+ // in [2 * a / (2 + a), 2 * b / (2 + b)]
+ // where a = exp(-1 / 16) - 1 and b = exp(1 / 16) - 1
const p19 = 8.757839894876785986064901881670424e-8;
const p17 = 3.898090687230025454479255130305971e-7 + v64 * p19;
const p15 = 1.7671487851436387503930903139882346e-6 + v64 * p17;
@@ -235,7 +237,7 @@ pub fn log10q(x: f128) callconv(.c) f128 {
const log10e_hi: f128 = 0x1.bcb7b1526e50ep-2;
const log10e_lo: f128 = 0x1.95355baaafad33dc323ee3460246p-57;
- // t = u / ln(2)
+ // t = u / log(10)
const t_hi = u_hi * log10e_hi;
const t_lo = u_lo * log10e_hi + u * log10e_lo;
@@ -258,17 +260,23 @@ pub fn log10q(x: f128) callconv(.c) f128 {
const u = (f + f) / (y + F);
const v = u * u;
-
const v64: f64 = @floatCast(v);
- // use f64 for the last few coefficients to improve performance
+
+ // Polynomial approximation of log10(1 + 2 * u / (2 - u))
+ // in [-(2 * fmax) / (2 + fmax), (2 * fmax) / (2 - fmax)]
+ // where fmax = 0.5 / size
const p11 = 3.8556341504143175800053507804546873e-5;
const p9 = 1.884958688754320118955531917460363e-4 + v64 * p11;
const p7 = 9.694073256769014481942040422515466e-4 + v * p9;
const p5 = 5.428681023790647845638954444458386e-3 + v * p7;
const p3 = 3.619120682527098563759407657655348e-2 + v * p5;
const p1 = 0.4342944819032518276511289189166051;
+
const q = u * v * p3;
+ // log1p_tab[j].hi = 2^-n * round-to-integer(2^n * l)
+ // log1p_tab[j].lo = round-to-nearest-f128(l - log1p_tab[j].hi)
+ // where n = 97 and l = log10(1 + j / size)
const log1p_tab = [size + 1]struct { hi: f128, lo: f128 }{
.{ .hi = 0, .lo = 0 },
.{ .hi = 0x1.bafd47221ed2665c1ba949p-9, .lo = -0x1.eb6f20a90ad48515635f3b8a1d22p-104 },
diff --git a/lib/compiler_rt/log2.zig b/lib/compiler_rt/log2.zig
@@ -204,9 +204,11 @@ pub fn log2q(x: f128) callconv(.c) f128 {
const u = 2 * f * g;
const v = u * u;
const uv = u * v;
-
const v64: f64 = @floatCast(v);
- // use f64 for the last few coefficients to improve performance
+
+ // Polynomial approximation of log2((1 + u / 2) / (1 - u / 2))
+ // in [2 * a / (2 + a), 2 * b / (2 + b)]
+ // where a = exp(-1 / 16) - 1 and b = exp(1 / 16) - 1
const p19 = 2.909291439731657940692470637735429e-7;
const p17 = 1.294917697032820750200161813672143e-6 + v64 * p19;
const p15 = 5.870341197214724685339102193694838e-6 + v64 * p17;
@@ -215,8 +217,9 @@ pub fn log2q(x: f128) callconv(.c) f128 {
const p9 = 6.261697226080570342191671010883619e-4 + v * p11;
const p7 = 3.2203014305557218914285331735164364e-3 + v * p9;
const p5 = 1.8033688011112042591999058475816515e-2 + v * p7;
+ const p3 = 0.12022458674074695061332705675016125;
- const q_hi = uv * 0.12022458674074695061332705675016125;
+ const q_hi = uv * p3;
const q_lo = uv * v * p5;
const f_hi: f128 = @as(f64, @floatCast(f));
@@ -225,7 +228,7 @@ pub fn log2q(x: f128) callconv(.c) f128 {
const u_hi: f128 = @as(f64, @floatCast(u));
const u_lo: f128 = ((2 * (f - u_hi) - u_hi * f_hi) - u_hi * f_lo) * g;
- // t = u / ln(2)
+ // t = u / log(2)
const log2e_hi: f128 = 0x1.71547652b82fep0;
const log2e_lo: f128 = 0x1.777d0ffda0d23a7d11d6aef551bbp-56;
const t_hi = u_hi * log2e_hi;
@@ -250,9 +253,11 @@ pub fn log2q(x: f128) callconv(.c) f128 {
const u = (f + f) / (y + F);
const v = u * u;
-
const v64: f64 = @floatCast(v);
- // use f64 for the last coefficient to improve performance
+
+ // Polynomial approximation of log2(1 + 2 * u / (2 - u))
+ // in [-(2 * fmax) / (2 + fmax), (2 * fmax) / (2 - fmax)]
+ // where fmax = 0.5 / size
const p11 = 1.280813940786848788109850061222256e-4;
const p9 = 6.261697225875019234719395591078697e-4 + v64 * p11;
const p7 = 3.22030143055572204818095463930704e-3 + v * p9;
@@ -262,6 +267,9 @@ pub fn log2q(x: f128) callconv(.c) f128 {
const q = u * v * p3;
+ // log1p_tab[j].hi = 2^-n * round-to-integer(2^n * l)
+ // log1p_tab[j].lo = round-to-nearest-f128(l - log1p_tab[j].hi)
+ // where n = 97 and l = log2(1 + j / size)
const log1p_tab = [size + 1]struct { hi: f128, lo: f128 }{
.{ .hi = 0, .lo = 0 },
.{ .hi = 0x1.6fe50b6ef08517f8e37bp-7, .lo = 0x1.794f4441ccdf648f265a41e57d75p-99 },