// polynomial for approximating erfc(x)*exp(x*x) // // Copyright (c) 2022-2023, Arm Limited. // SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception deg = 12; // poly degree itv = parse(__argv[0]); bounds = [|3.725290298461914e-9, 0.18920711500272103, 0.41421356237309515, 0.681792830507429, 1, 1.378414230005442, 1.8284271247461903, 2.363585661014858, 3, 3.756828460010884, 4.656854249492381, 5.727171322029716, 7, 8.513656920021768, 10.313708498984761, 12.454342644059432, 15, 18.027313840043536, 21.627416997969522, 25.908685288118864, 31|]; a = bounds[itv]; b = bounds[itv + 1]; f = proc(y) { t = y + a; return erfc(t) * exp(t*t); }; poly = fpminimax(f(x), deg, [|double ...|], [0;b-a]); display = hexadecimal; print("rel error:", accurateinfnorm(1-poly(x)/f(x), [a;b], 30)); print("in [",a,b,"]"); print("coeffs:"); for i from 0 to deg do coeff(poly, i);