| author | |
| committer | |
| log | 9ed970090c1fe6b7d2d2f0eef1a59343e7b9a67d |
| tree | dafe954aa06dbd8c08a100b206c8651c8f2e4883 |
| parent | cc71a1af48aeaea4502aaa0592c413e4b964faba |
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); |
| 485 | 484 | ||
| 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 | ||
| 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; | ||
| 495 | 497 | ||
| 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; |
| 499 | 501 | ||
| ... | @@ -518,9 +520,11 @@ pub fn logq(x: f128) callconv(.c) f128 { | ... | @@ -518,9 +520,11 @@ pub fn logq(x: f128) callconv(.c) f128 { |
| 518 | 520 | ||
| 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 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 | ||
| 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 { |
| 529 | 533 | ||
| 530 | const q = u * v * p3; | 534 | const q = u * v * p3; |
| 531 | 535 | ||
| 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 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 | ||
| 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 { |
| 235 | 237 | ||
| 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; |
| 241 | 243 | ||
| ... | @@ -258,17 +260,23 @@ pub fn log10q(x: f128) callconv(.c) f128 { | ... | @@ -258,17 +260,23 @@ pub fn log10q(x: f128) callconv(.c) f128 { |
| 258 | 260 | ||
| 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 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 | ||
| 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; |
| 271 | 276 | ||
| 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 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 | ||
| 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; | ||
| 218 | 221 | ||
| 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; |
| 221 | 224 | ||
| 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; |
| 227 | 230 | ||
| 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 { |
| 250 | 253 | ||
| 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 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 | ||
| 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 { |
| 262 | 267 | ||
| 263 | const q = u * v * p3; | 268 | const q = u * v * p3; |
| 264 | 269 | ||
| 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 }, |