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 {
480480 const u = 2 * f * g;
481481 const v = u * u;
482482 const uv = u * v;
483
484483 const v64: f64 = @floatCast(v);
485484
486 // use f64 for the last few coefficients to improve performance
485 // 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
487488 const p19 = 2.0165671588771827537210411918018159e-7;
488489 const p17 = 8.97568550755477160981619052649713e-7 + v64 * p19;
489490 const p15 = 4.069010449774280288178309893970754e-6 + v64 * p17;
......@@ -492,8 +493,9 @@ pub fn logq(x: f128) callconv(.c) f128 {
492493 const p9 = 4.340277777777777776216500817402857e-4 + v * p11;
493494 const p7 = 2.2321428571428571428572328745789477e-3 + v * p9;
494495 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;
497499 const q_lo = uv * v * p5;
498500 const q = q_hi + q_lo;
499501
......@@ -518,9 +520,11 @@ pub fn logq(x: f128) callconv(.c) f128 {
518520
519521 const u = (f + f) / (y + F);
520522 const v = u * u;
521
522523 const v64: f64 = @floatCast(v);
523 // use f64 for the last coefficient to improve performance
524
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
524528 const p11 = 8.877925718782769769445565656611838e-5;
525529 const p9 = 4.340277777635300605611118803507141e-4 + v64 * p11;
526530 const p7 = 2.2321428571428572515097318595359542e-3 + v * p9;
......@@ -529,6 +533,9 @@ pub fn logq(x: f128) callconv(.c) f128 {
529533
530534 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)
532539 const log1p_tab = [size + 1]struct { hi: f128, lo: f128 }{
533540 .{ .hi = 0, .lo = 0 },
534541 .{ .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 {
211211 const u = 2 * f * g;
212212 const v = u * u;
213213 const uv = u * v;
214
215214 const v64: f64 = @floatCast(v);
216 // use f64 for the last few coefficients to improve performance
215
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
217219 const p19 = 8.757839894876785986064901881670424e-8;
218220 const p17 = 3.898090687230025454479255130305971e-7 + v64 * p19;
219221 const p15 = 1.7671487851436387503930903139882346e-6 + v64 * p17;
......@@ -235,7 +237,7 @@ pub fn log10q(x: f128) callconv(.c) f128 {
235237
236238 const log10e_hi: f128 = 0x1.bcb7b1526e50ep-2;
237239 const log10e_lo: f128 = 0x1.95355baaafad33dc323ee3460246p-57;
238 // t = u / ln(2)
240 // t = u / log(10)
239241 const t_hi = u_hi * log10e_hi;
240242 const t_lo = u_lo * log10e_hi + u * log10e_lo;
241243
......@@ -258,17 +260,23 @@ pub fn log10q(x: f128) callconv(.c) f128 {
258260
259261 const u = (f + f) / (y + F);
260262 const v = u * u;
261
262263 const v64: f64 = @floatCast(v);
263 // use f64 for the last few coefficients to improve performance
264
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
264268 const p11 = 3.8556341504143175800053507804546873e-5;
265269 const p9 = 1.884958688754320118955531917460363e-4 + v64 * p11;
266270 const p7 = 9.694073256769014481942040422515466e-4 + v * p9;
267271 const p5 = 5.428681023790647845638954444458386e-3 + v * p7;
268272 const p3 = 3.619120682527098563759407657655348e-2 + v * p5;
269273 const p1 = 0.4342944819032518276511289189166051;
274
270275 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)
272280 const log1p_tab = [size + 1]struct { hi: f128, lo: f128 }{
273281 .{ .hi = 0, .lo = 0 },
274282 .{ .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 {
204204 const u = 2 * f * g;
205205 const v = u * u;
206206 const uv = u * v;
207
208207 const v64: f64 = @floatCast(v);
209 // use f64 for the last few coefficients to improve performance
208
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
210212 const p19 = 2.909291439731657940692470637735429e-7;
211213 const p17 = 1.294917697032820750200161813672143e-6 + v64 * p19;
212214 const p15 = 5.870341197214724685339102193694838e-6 + v64 * p17;
......@@ -215,8 +217,9 @@ pub fn log2q(x: f128) callconv(.c) f128 {
215217 const p9 = 6.261697226080570342191671010883619e-4 + v * p11;
216218 const p7 = 3.2203014305557218914285331735164364e-3 + v * p9;
217219 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;
220223 const q_lo = uv * v * p5;
221224
222225 const f_hi: f128 = @as(f64, @floatCast(f));
......@@ -225,7 +228,7 @@ pub fn log2q(x: f128) callconv(.c) f128 {
225228 const u_hi: f128 = @as(f64, @floatCast(u));
226229 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)
229232 const log2e_hi: f128 = 0x1.71547652b82fep0;
230233 const log2e_lo: f128 = 0x1.777d0ffda0d23a7d11d6aef551bbp-56;
231234 const t_hi = u_hi * log2e_hi;
......@@ -250,9 +253,11 @@ pub fn log2q(x: f128) callconv(.c) f128 {
250253
251254 const u = (f + f) / (y + F);
252255 const v = u * u;
253
254256 const v64: f64 = @floatCast(v);
255 // use f64 for the last coefficient to improve performance
257
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
256261 const p11 = 1.280813940786848788109850061222256e-4;
257262 const p9 = 6.261697225875019234719395591078697e-4 + v64 * p11;
258263 const p7 = 3.22030143055572204818095463930704e-3 + v * p9;
......@@ -262,6 +267,9 @@ pub fn log2q(x: f128) callconv(.c) f128 {
262267
263268 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)
265273 const log1p_tab = [size + 1]struct { hi: f128, lo: f128 }{
266274 .{ .hi = 0, .lo = 0 },
267275 .{ .hi = 0x1.6fe50b6ef08517f8e37bp-7, .lo = 0x1.794f4441ccdf648f265a41e57d75p-99 },