1*f3087befSAndrew Turner// polynomial for approximating asinh(x) 2*f3087befSAndrew Turner// 3*f3087befSAndrew Turner// Copyright (c) 2022-2024, Arm Limited. 4*f3087befSAndrew Turner// SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception 5*f3087befSAndrew Turner 6*f3087befSAndrew Turner// Polynomial is used in [2^-26, 1]. However it is least accurate close to 1, so 7*f3087befSAndrew Turner// we use 2^-6 as the lower bound for coeff generation, which yields sufficiently 8*f3087befSAndrew Turner// accurate results in [2^-26, 2^-6]. 9*f3087befSAndrew Turnera = 0x1p-6; 10*f3087befSAndrew Turnerb = 1.0; 11*f3087befSAndrew Turner 12*f3087befSAndrew Turnerf = (asinh(sqrt(x)) - sqrt(x))/x^(3/2); 13*f3087befSAndrew Turner 14*f3087befSAndrew Turnerapprox = proc(poly, d) { 15*f3087befSAndrew Turner return remez(1 - poly(x)/f(x), deg-d, [a;b], x^d/f(x), 1e-10); 16*f3087befSAndrew Turner}; 17*f3087befSAndrew Turner 18*f3087befSAndrew Turnerpoly = 0; 19*f3087befSAndrew Turnerfor i from 0 to deg do { 20*f3087befSAndrew Turner i; 21*f3087befSAndrew Turner p = roundcoefficients(approx(poly,i), [|D ...|]); 22*f3087befSAndrew Turner poly = poly + x^i*coeff(p,0); 23*f3087befSAndrew Turner}; 24*f3087befSAndrew Turner 25*f3087befSAndrew Turner 26*f3087befSAndrew Turnerdisplay = hexadecimal; 27*f3087befSAndrew Turnerprint("coeffs:"); 28*f3087befSAndrew Turnerfor i from 0 to deg do coeff(poly,i); 29