// polynomial for approximating log2(1+x)
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

deg = 7; // poly degree
// interval ~= 1/(2*N), where N is the table entries
a= -0x1.f45p-8;
b=  0x1.f45p-8;

ln2 = evaluate(log(2),0);
invln2hi = double(1/ln2 + 0x1p21) - 0x1p21; // round away last 21 bits
invln2lo = double(1/ln2 - invln2hi);

// find log2(1+x) polynomial with minimal absolute error
f = log(1+x)/ln2;

// return p that minimizes |f(x) - poly(x) - x^d*p(x)|
approx = proc(poly,d) {
  return remez(f(x) - poly(x), deg-d, [a;b], x^d, 1e-10);
};

// first coeff is fixed, iteratively find optimal double prec coeffs
poly = x*(invln2lo + invln2hi);
for i from 2 to deg do {
  p = roundcoefficients(approx(poly,i), [|D ...|]);
  poly = poly + x^i*coeff(p,0);
};

display = hexadecimal;
print("invln2hi:", invln2hi);
print("invln2lo:", invln2lo);
print("abs error:", accurateinfnorm(f(x)-poly(x), [a;b], 30));
//// relative error computation fails if f(0)==0
//// g = f(x)/x = log2(1+x)/x; using taylor series
//g = 0;
//for i from 0 to 60 do { g = g + (-x)^i/(i+1)/ln2; };
//print("rel error:", accurateinfnorm(1-(poly(x)/x)/g(x), [a;b], 30));
print("in [",a,b,"]");
print("coeffs:");
for i from 0 to deg do coeff(poly,i);
