zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 9ed970090c1fe6b7d2d2f0eef1a59343e7b9a67d (tree)
parent cc71a1af48aeaea4502aaa0592c413e4b964faba
Author: Christophe Delage <christ@ophe.net>
Date:   Fri, 29 May 2026 12:40:58 +0200

Better comments

Diffstat:
Mlib/compiler_rt/log.zig | 17++++++++++++-----
Mlib/compiler_rt/log10.zig | 18+++++++++++++-----
Mlib/compiler_rt/log2.zig | 20++++++++++++++------
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 },