Approximates 2^(r_hi + r_lo) - 1.
fn exp2Poly(r_hi: f128, r_lo: f128) f128
fn exp2Poly(r_hi: f128, r_lo: f128) f128 {
const a1: f128 = 0.6931471805599453094172321214581766;
const a2: f128 = 0.24022650695910071233355126316333273;
const a3: f128 = 5.5504108664821579953142263768621824e-2;
const a4: f128 = 9.618129107628477161979071497097137e-3;
const a5: f128 = 1.3333558146428443423412221872998745e-3;
const a6: f128 = 1.5403530393381609955139554247429082e-4;
const a7: f128 = 1.5252733804059840280740292411812167e-5;
const a8: f64 = 1.321548679014167884759296382063556e-6;
const a9: f64 = 1.0178086009237659848870888288504849e-7;
const a10: f64 = 7.0549159308426003613013130647805315e-9;
const a11: f64 = 4.445540987582123304209680731453203e-10;
const r = r_hi + r_lo;
const s: f64 = @floatCast(r);
const rr = r * r;
const ss = s * s;
// Do the upper degree computation in f64 and try to get better ILP
// by deviating from Horner's method. This does not measurably hurt
// accuracy.
const a10_11 = a10 + s * a11;
const a8_9 = a8 + s * a9;
const a8_11 = a8_9 + ss * a10_11;
const a6_7 = a6 + r * a7;
const a4_5 = a4 + r * a5;
const a2_3 = a2 + r * a3;
const a2_11 = a2_3 + rr * (a4_5 + rr * (a6_7 + rr * a8_11));
return r * (a1 + r * a2_11);
}