authorgravatar for christ@ophe.netChristophe Delage <christ@ophe.net> 2026-05-29 12:40:58+02:00
committergravatar for christ@ophe.netChristophe Delage <christ@ophe.net> 2026-05-29 12:40:58+02:00
log9ed970090c1fe6b7d2d2f0eef1a59343e7b9a67d
treedafe954aa06dbd8c08a100b206c8651c8f2e4883
parentcc71a1af48aeaea4502aaa0592c413e4b964faba

Better comments


3 files changed, 39 insertions(+), 16 deletions(-)

lib/compiler_rt/log.zig+12-5
...@@ -480,10 +480,11 @@ pub fn logq(x: f128) callconv(.c) f128 {...@@ -480,10 +480,11 @@ pub fn logq(x: f128) callconv(.c) f128 {
480 const u = 2 * f * g;480 const u = 2 * f * g;
481 const v = u * u;481 const v = u * u;
482 const uv = u * v;482 const uv = u * v;
483
484 const v64: f64 = @floatCast(v);483 const v64: f64 = @floatCast(v);
485484
486 // use f64 for the last few coefficients to improve performance485 // Polynomial approximation of log((1 + u / 2) / (1 - u / 2))
486 // in [2 * a / (2 + a), 2 * b / (2 + b)]
487 // where a = exp(-1 / 16) - 1 and b = exp(1 / 16) - 1
487 const p19 = 2.0165671588771827537210411918018159e-7;488 const p19 = 2.0165671588771827537210411918018159e-7;
488 const p17 = 8.97568550755477160981619052649713e-7 + v64 * p19;489 const p17 = 8.97568550755477160981619052649713e-7 + v64 * p19;
489 const p15 = 4.069010449774280288178309893970754e-6 + v64 * p17;490 const p15 = 4.069010449774280288178309893970754e-6 + v64 * p17;
...@@ -492,8 +493,9 @@ pub fn logq(x: f128) callconv(.c) f128 {...@@ -492,8 +493,9 @@ pub fn logq(x: f128) callconv(.c) f128 {
492 const p9 = 4.340277777777777776216500817402857e-4 + v * p11;493 const p9 = 4.340277777777777776216500817402857e-4 + v * p11;
493 const p7 = 2.2321428571428571428572328745789477e-3 + v * p9;494 const p7 = 2.2321428571428571428572328745789477e-3 + v * p9;
494 const p5 = 1.249999999999999999999999997455655e-2 + v * p7;495 const p5 = 1.249999999999999999999999997455655e-2 + v * p7;
496 const p3 = 8.333333333333333333333333333333581e-2;
495497
496 const q_hi = uv * 8.333333333333333333333333333333581e-2;498 const q_hi = uv * p3;
497 const q_lo = uv * v * p5;499 const q_lo = uv * v * p5;
498 const q = q_hi + q_lo;500 const q = q_hi + q_lo;
499501
...@@ -518,9 +520,11 @@ pub fn logq(x: f128) callconv(.c) f128 {...@@ -518,9 +520,11 @@ pub fn logq(x: f128) callconv(.c) f128 {
518520
519 const u = (f + f) / (y + F);521 const u = (f + f) / (y + F);
520 const v = u * u;522 const v = u * u;
521
522 const v64: f64 = @floatCast(v);523 const v64: f64 = @floatCast(v);
523 // use f64 for the last coefficient to improve performance524
525 // Polynomial approximation of log(1 + 2 * u / (2 - u))
526 // in [-(2 * fmax) / (2 + fmax), (2 * fmax) / (2 - fmax)]
527 // where fmax = 0.5 / size
524 const p11 = 8.877925718782769769445565656611838e-5;528 const p11 = 8.877925718782769769445565656611838e-5;
525 const p9 = 4.340277777635300605611118803507141e-4 + v64 * p11;529 const p9 = 4.340277777635300605611118803507141e-4 + v64 * p11;
526 const p7 = 2.2321428571428572515097318595359542e-3 + v * p9;530 const p7 = 2.2321428571428572515097318595359542e-3 + v * p9;
...@@ -529,6 +533,9 @@ pub fn logq(x: f128) callconv(.c) f128 {...@@ -529,6 +533,9 @@ pub fn logq(x: f128) callconv(.c) f128 {
529533
530 const q = u * v * p3;534 const q = u * v * p3;
531535
536 // log1p_tab[j].hi = 2^-n * round-to-integer(2^n * l)
537 // log1p_tab[j].lo = round-to-nearest-f128(l - log1p_tab[j].hi)
538 // where n = 97 and l = log(1 + j / size)
532 const log1p_tab = [size + 1]struct { hi: f128, lo: f128 }{539 const log1p_tab = [size + 1]struct { hi: f128, lo: f128 }{
533 .{ .hi = 0, .lo = 0 },540 .{ .hi = 0, .lo = 0 },
534 .{ .hi = 0x1.fe02a6b106788fc3769039p-8, .lo = 0x1.dc282d2b3db2c3ef9a073a876702p-100 },541 .{ .hi = 0x1.fe02a6b106788fc3769039p-8, .lo = 0x1.dc282d2b3db2c3ef9a073a876702p-100 },
lib/compiler_rt/log10.zig+13-5
...@@ -211,9 +211,11 @@ pub fn log10q(x: f128) callconv(.c) f128 {...@@ -211,9 +211,11 @@ pub fn log10q(x: f128) callconv(.c) f128 {
211 const u = 2 * f * g;211 const u = 2 * f * g;
212 const v = u * u;212 const v = u * u;
213 const uv = u * v;213 const uv = u * v;
214
215 const v64: f64 = @floatCast(v);214 const v64: f64 = @floatCast(v);
216 // use f64 for the last few coefficients to improve performance215
216 // Polynomial approximation of log10((1 + u / 2) / (1 - u / 2))
217 // in [2 * a / (2 + a), 2 * b / (2 + b)]
218 // where a = exp(-1 / 16) - 1 and b = exp(1 / 16) - 1
217 const p19 = 8.757839894876785986064901881670424e-8;219 const p19 = 8.757839894876785986064901881670424e-8;
218 const p17 = 3.898090687230025454479255130305971e-7 + v64 * p19;220 const p17 = 3.898090687230025454479255130305971e-7 + v64 * p19;
219 const p15 = 1.7671487851436387503930903139882346e-6 + v64 * p17;221 const p15 = 1.7671487851436387503930903139882346e-6 + v64 * p17;
...@@ -235,7 +237,7 @@ pub fn log10q(x: f128) callconv(.c) f128 {...@@ -235,7 +237,7 @@ pub fn log10q(x: f128) callconv(.c) f128 {
235237
236 const log10e_hi: f128 = 0x1.bcb7b1526e50ep-2;238 const log10e_hi: f128 = 0x1.bcb7b1526e50ep-2;
237 const log10e_lo: f128 = 0x1.95355baaafad33dc323ee3460246p-57;239 const log10e_lo: f128 = 0x1.95355baaafad33dc323ee3460246p-57;
238 // t = u / ln(2)240 // t = u / log(10)
239 const t_hi = u_hi * log10e_hi;241 const t_hi = u_hi * log10e_hi;
240 const t_lo = u_lo * log10e_hi + u * log10e_lo;242 const t_lo = u_lo * log10e_hi + u * log10e_lo;
241243
...@@ -258,17 +260,23 @@ pub fn log10q(x: f128) callconv(.c) f128 {...@@ -258,17 +260,23 @@ pub fn log10q(x: f128) callconv(.c) f128 {
258260
259 const u = (f + f) / (y + F);261 const u = (f + f) / (y + F);
260 const v = u * u;262 const v = u * u;
261
262 const v64: f64 = @floatCast(v);263 const v64: f64 = @floatCast(v);
263 // use f64 for the last few coefficients to improve performance264
265 // Polynomial approximation of log10(1 + 2 * u / (2 - u))
266 // in [-(2 * fmax) / (2 + fmax), (2 * fmax) / (2 - fmax)]
267 // where fmax = 0.5 / size
264 const p11 = 3.8556341504143175800053507804546873e-5;268 const p11 = 3.8556341504143175800053507804546873e-5;
265 const p9 = 1.884958688754320118955531917460363e-4 + v64 * p11;269 const p9 = 1.884958688754320118955531917460363e-4 + v64 * p11;
266 const p7 = 9.694073256769014481942040422515466e-4 + v * p9;270 const p7 = 9.694073256769014481942040422515466e-4 + v * p9;
267 const p5 = 5.428681023790647845638954444458386e-3 + v * p7;271 const p5 = 5.428681023790647845638954444458386e-3 + v * p7;
268 const p3 = 3.619120682527098563759407657655348e-2 + v * p5;272 const p3 = 3.619120682527098563759407657655348e-2 + v * p5;
269 const p1 = 0.4342944819032518276511289189166051;273 const p1 = 0.4342944819032518276511289189166051;
274
270 const q = u * v * p3;275 const q = u * v * p3;
271276
277 // log1p_tab[j].hi = 2^-n * round-to-integer(2^n * l)
278 // log1p_tab[j].lo = round-to-nearest-f128(l - log1p_tab[j].hi)
279 // where n = 97 and l = log10(1 + j / size)
272 const log1p_tab = [size + 1]struct { hi: f128, lo: f128 }{280 const log1p_tab = [size + 1]struct { hi: f128, lo: f128 }{
273 .{ .hi = 0, .lo = 0 },281 .{ .hi = 0, .lo = 0 },
274 .{ .hi = 0x1.bafd47221ed2665c1ba949p-9, .lo = -0x1.eb6f20a90ad48515635f3b8a1d22p-104 },282 .{ .hi = 0x1.bafd47221ed2665c1ba949p-9, .lo = -0x1.eb6f20a90ad48515635f3b8a1d22p-104 },
lib/compiler_rt/log2.zig+14-6
...@@ -204,9 +204,11 @@ pub fn log2q(x: f128) callconv(.c) f128 {...@@ -204,9 +204,11 @@ pub fn log2q(x: f128) callconv(.c) f128 {
204 const u = 2 * f * g;204 const u = 2 * f * g;
205 const v = u * u;205 const v = u * u;
206 const uv = u * v;206 const uv = u * v;
207
208 const v64: f64 = @floatCast(v);207 const v64: f64 = @floatCast(v);
209 // use f64 for the last few coefficients to improve performance208
209 // Polynomial approximation of log2((1 + u / 2) / (1 - u / 2))
210 // in [2 * a / (2 + a), 2 * b / (2 + b)]
211 // where a = exp(-1 / 16) - 1 and b = exp(1 / 16) - 1
210 const p19 = 2.909291439731657940692470637735429e-7;212 const p19 = 2.909291439731657940692470637735429e-7;
211 const p17 = 1.294917697032820750200161813672143e-6 + v64 * p19;213 const p17 = 1.294917697032820750200161813672143e-6 + v64 * p19;
212 const p15 = 5.870341197214724685339102193694838e-6 + v64 * p17;214 const p15 = 5.870341197214724685339102193694838e-6 + v64 * p17;
...@@ -215,8 +217,9 @@ pub fn log2q(x: f128) callconv(.c) f128 {...@@ -215,8 +217,9 @@ pub fn log2q(x: f128) callconv(.c) f128 {
215 const p9 = 6.261697226080570342191671010883619e-4 + v * p11;217 const p9 = 6.261697226080570342191671010883619e-4 + v * p11;
216 const p7 = 3.2203014305557218914285331735164364e-3 + v * p9;218 const p7 = 3.2203014305557218914285331735164364e-3 + v * p9;
217 const p5 = 1.8033688011112042591999058475816515e-2 + v * p7;219 const p5 = 1.8033688011112042591999058475816515e-2 + v * p7;
220 const p3 = 0.12022458674074695061332705675016125;
218221
219 const q_hi = uv * 0.12022458674074695061332705675016125;222 const q_hi = uv * p3;
220 const q_lo = uv * v * p5;223 const q_lo = uv * v * p5;
221224
222 const f_hi: f128 = @as(f64, @floatCast(f));225 const f_hi: f128 = @as(f64, @floatCast(f));
...@@ -225,7 +228,7 @@ pub fn log2q(x: f128) callconv(.c) f128 {...@@ -225,7 +228,7 @@ pub fn log2q(x: f128) callconv(.c) f128 {
225 const u_hi: f128 = @as(f64, @floatCast(u));228 const u_hi: f128 = @as(f64, @floatCast(u));
226 const u_lo: f128 = ((2 * (f - u_hi) - u_hi * f_hi) - u_hi * f_lo) * g;229 const u_lo: f128 = ((2 * (f - u_hi) - u_hi * f_hi) - u_hi * f_lo) * g;
227230
228 // t = u / ln(2)231 // t = u / log(2)
229 const log2e_hi: f128 = 0x1.71547652b82fep0;232 const log2e_hi: f128 = 0x1.71547652b82fep0;
230 const log2e_lo: f128 = 0x1.777d0ffda0d23a7d11d6aef551bbp-56;233 const log2e_lo: f128 = 0x1.777d0ffda0d23a7d11d6aef551bbp-56;
231 const t_hi = u_hi * log2e_hi;234 const t_hi = u_hi * log2e_hi;
...@@ -250,9 +253,11 @@ pub fn log2q(x: f128) callconv(.c) f128 {...@@ -250,9 +253,11 @@ pub fn log2q(x: f128) callconv(.c) f128 {
250253
251 const u = (f + f) / (y + F);254 const u = (f + f) / (y + F);
252 const v = u * u;255 const v = u * u;
253
254 const v64: f64 = @floatCast(v);256 const v64: f64 = @floatCast(v);
255 // use f64 for the last coefficient to improve performance257
258 // Polynomial approximation of log2(1 + 2 * u / (2 - u))
259 // in [-(2 * fmax) / (2 + fmax), (2 * fmax) / (2 - fmax)]
260 // where fmax = 0.5 / size
256 const p11 = 1.280813940786848788109850061222256e-4;261 const p11 = 1.280813940786848788109850061222256e-4;
257 const p9 = 6.261697225875019234719395591078697e-4 + v64 * p11;262 const p9 = 6.261697225875019234719395591078697e-4 + v64 * p11;
258 const p7 = 3.22030143055572204818095463930704e-3 + v * p9;263 const p7 = 3.22030143055572204818095463930704e-3 + v * p9;
...@@ -262,6 +267,9 @@ pub fn log2q(x: f128) callconv(.c) f128 {...@@ -262,6 +267,9 @@ pub fn log2q(x: f128) callconv(.c) f128 {
262267
263 const q = u * v * p3;268 const q = u * v * p3;
264269
270 // log1p_tab[j].hi = 2^-n * round-to-integer(2^n * l)
271 // log1p_tab[j].lo = round-to-nearest-f128(l - log1p_tab[j].hi)
272 // where n = 97 and l = log2(1 + j / size)
265 const log1p_tab = [size + 1]struct { hi: f128, lo: f128 }{273 const log1p_tab = [size + 1]struct { hi: f128, lo: f128 }{
266 .{ .hi = 0, .lo = 0 },274 .{ .hi = 0, .lo = 0 },
267 .{ .hi = 0x1.6fe50b6ef08517f8e37bp-7, .lo = 0x1.794f4441ccdf648f265a41e57d75p-99 },275 .{ .hi = 0x1.6fe50b6ef08517f8e37bp-7, .lo = 0x1.794f4441ccdf648f265a41e57d75p-99 },