Skip to content

Instantly share code, notes, and snippets.

@Marc-B-Reynolds
Last active January 27, 2021 22:26
Show Gist options
  • Save Marc-B-Reynolds/2d2cc661f5fe771e68d1fcf62007790f to your computer and use it in GitHub Desktop.
Save Marc-B-Reynolds/2d2cc661f5fe771e68d1fcf62007790f to your computer and use it in GitHub Desktop.
sollya script and output for sincospi in both single and double precision
/* -*- mode: c; -*- */
// create primary range approximations of sin(pi x) and cos(pi x) for x on [-1/4,1/4]
// both for single and double precision
R = [0;1/4];
T = floating;
E = relative;
B = [|24...|];
// write fp values such that they always have a decimal point
procedure fp_write(v)
{
if (v != nearestint(v)) then {
write(v);
} else {
write(v,".0");
};
};
// make a copy of list with f applied
procedure list_apply(l,f)
{
var r,v,i;
r = [||];
for i from 0 to length(l)-1 do {
v = f(l[i]);
r = r :. v;
};
return r;
};
f32_round = proc(n) { return single(n); };
f64_round = proc(n) { return double(n); };
// make a copy of list with elements rounded to binary32
procedure list_to_f32(l) { return list_apply(l, f32_round); };
procedure list_to_f64(l) { return list_apply(l, f64_round); };
procedure list_of_even_coeff(p)
{
var r,e,i;
e = degree(p);
r = [||];
for i from 0 to e by 2 do { r = r :. coeff(p,i); };
return r;
};
procedure list_of_odd_coeff(p)
{
var r,e,i;
e = degree(p);
r = [||];
for i from 1 to e by 2 do { r = r :. coeff(p,i); };
return r;
};
procedure f64_write_list(p,l)
{
var e,i;
display=hexadecimal!;
e = length(l)-1;
write("double ", p,"_k = {");
fp_write(l[0]);
for i from 1 to e do { write(", "); fp_write(l[i]); };
print("};");
display=decimal!;
};
procedure f32_write_list(p,l)
{
var e,i;
display=hexadecimal!;
e = length(l)-1;
write("float ", p,"_k = {");
fp_write(l[0]);
write("f");
for i from 1 to e do { write(", "); fp_write(l[i]); write("f"); };
print("};");
display=decimal!;
};
procedure f32_data_write(name,a,f,r)
{
var e,z,d,l,i;
// dump out the supnorm
display=hexadecimal!;
e = single(dirtyinfnorm(a-f, r));
write("// peak-error: ", e);
display=decimal!;
print(" (~", e,")");
display=hexadecimal!;
f32_write_list(name, list_of_odd_coeff(a));
// create a debug list of values of 'x' where the approximation
// error is max.
z = list_to_f32(dirtyfindzeros(diff(a-f), r));
l = length(z);
display=hexadecimal!;
write("const float " @ name @ "_emax[] = {");
fp_write(z[0]); write("f");
for i from 1 to l-1 do {
write(",");
fp_write(z[i]);
write("f");
};
z = list_to_f32(dirtyfindzeros(a-f, r));
l = length(z);
// and where the error is approximately zero
write("};\nconst float " @ name @ "_emin[] = {");
if (l > 0) then {
fp_write(z[0]); write("f");
for i from 1 to l-1 do {
write(",");
fp_write(z[i]);
write("f");
};
};
// dump out the supnorm
e = single(dirtyinfnorm(a-f, r));
print("};\n");
a;
display=decimal!;
a;
};
procedure f64_data_write(name,a,f,r)
{
var e,z,d,l,i;
// dump out the supnorm
display=hexadecimal!;
e = double(dirtyinfnorm(a-f, r));
write("// peak-error: ", e);
display=decimal!;
print(" (~", e,")");
display=hexadecimal!;
// create a debug list of values of 'x' where the approximation
// error is max.
z = list_to_f64(dirtyfindzeros(diff(a-f), r));
l = length(z);
write("const double " @ name @ "_emax[] = {");
fp_write(z[0]);
for i from 1 to l-1 do {
write(",");
fp_write(z[i]);
};
z = list_to_f64(dirtyfindzeros(a-f, r));
l = length(z);
// and where the error is approximately zero
write("};\nconst double " @ name @ "_emin[] = {");
if (l > 0) then {
fp_write(z[0]);
for i from 1 to l-1 do { write(","); fp_write(z[i]); };
};
// dump out the supnorm
print("};\n");
a;
display=decimal!;
a;
};
// Actual start of building polynomial
print("sin(pi x) in binary32");
I = [|1|];
F = sin(pi*x);
for i from 3 to 7 by 2 do
{
I = I :.i;
P = fpminimax(F,I,B,R,T,E);
f32_data_write("f32_sin_pi_" @ i, P,F,R);
f32_write_list("f32_sin_pi_" @ i, list_of_odd_coeff(P));
print("\n");
};
print("cos(pi x) in binary32");
I = [|0,2|];
F = cos(pi*x);
for i from 4 to 8 by 2 do
{
I = I :.i;
P = fpminimax(F,I,B,R,T,E);
f32_data_write("f32_cos_pi_" @ i, P,F,R);
f32_write_list("f32_cos_pi_" @ i, list_of_even_coeff(P));
print("\n");
};
B = [|53...|];
print("sin(pi x) in binary64");
I = [|1,3,5|];
F = sin(pi*x);
for i from 7 to 13 by 2 do
{
I = I :.i;
P = fpminimax(F,I,B,R,T,E);
f64_data_write("f64_sin_pi_" @ i, P,F,R);
f64_write_list("f64_sin_pi_" @ i, list_of_odd_coeff(P));
print("\n");
};
print("cos(pi x) in binary64");
I = [|0,2,4|];
F = cos(pi*x);
for i from 6 to 14 by 2 do
{
I = I :.i;
P = fpminimax(F,I,B,R,T,E);
f64_data_write("f64_cos_pi_" @ i, P,F,R);
f64_write_list("f64_cos_pi_" @ i, list_of_even_coeff(P));
print("\n");
};
sin(pi x) in binary32
// peak-error: 0x1.2ed54p-12 (~ 2.88804061710834503173828125e-4 )
float f32_sin_pi_3_k = {0x1.91f5aap1f, -0x1.408cf2p2f};
const float f32_sin_pi_3_emax[] = {0x1.ba464p-5f,0x1.7ee7d2p-3f};
const float f32_sin_pi_3_emin[] = {0.0f,0x1.8f7388p-4f,0x1.da902p-3f};
x * (0x1.91f5aap1 + x^0x1p1 * (-0x1.408cf2p2))
x * (3.1403095722198486328125 + x^2 * (-5.008602619171142578125))
float f32_sin_pi_3_k = {0x1.91f5aap1f, -0x1.408cf2p2f};
// peak-error: 0x1.1ea062p-20 (~ 1.0677669024516944773495197296142578125e-6 )
float f32_sin_pi_5_k = {0x1.921f8ep1f, -0x1.4aa618p2f, 0x1.3f3f3cp1f};
const float f32_sin_pi_5_emax[] = {0x1.2690cp-5f,0x1.1481fep-3f,0x1.c047fp-3f};
const float f32_sin_pi_5_emin[] = {0.0f,0x1.0b90ccp-4f,0x1.6cd498p-3f,0x1.ef122cp-3f};
x * (0x1.921f8ep1 + x^0x1p1 * (-0x1.4aa618p2 + x^0x1p1 * 0x1.3f3f3cp1))
x * (3.1415879726409912109375 + x^2 * (-5.1663875579833984375 + x^2 * 2.494117259979248046875))
float f32_sin_pi_5_k = {0x1.921f8ep1f, -0x1.4aa618p2f, 0x1.3f3f3cp1f};
// peak-error: 0x1.71dde6p-28 (~ 5.382270185094739645137451589107513427734375e-9 )
float f32_sin_pi_7_k = {0x1.921fb6p1f, -0x1.4abbecp2f, 0x1.466b2p1f, -0x1.2f5992p-1f};
const float f32_sin_pi_7_emax[] = {0x1.09709ep-4f,0x1.54dff2p-3f,0x1.d482c2p-3f};
const float f32_sin_pi_7_emin[] = {0.0f,0x1.e53278p-4f,0x1.9d352ap-3f,0x1.f4e948p-3f};
x * (0x1.921fb6p1 + x^0x1p1 * (-0x1.4abbecp2 + x^0x1p1 * (0x1.466b2p1 + x^0x1p1 * (-0x1.2f5992p-1))))
x * (3.1415927410125732421875 + x^2 * (-5.16771984100341796875 + x^2 * (2.550144195556640625 + x^2 * (-0.592480242252349853515625))))
float f32_sin_pi_7_k = {0x1.921fb6p1f, -0x1.4abbecp2f, 0x1.466b2p1f, -0x1.2f5992p-1f};
cos(pi x) in binary32
// peak-error: 0x1.8cp-17 (~ 1.180171966552734375e-5 )
float f32_cos_pi_4_k = {0.0f, 0.0f};
const float f32_cos_pi_4_emax[] = {0.0f,0x1.06f554p-3f,0x1.bf7746p-3f};
const float f32_cos_pi_4_emin[] = {0x1.16f1b2p-4f,0x1.7407dep-3f,0x1.f05e3ap-3f};
0x1.fffe74p-1 + x^0x1p1 * (-0x1.3ba0ecp2 + x^0x1p1 * 0x1.f73ff8p1)
0.99998819828033447265625 + x^2 * (-4.93169689178466796875 + x^2 * 3.93163967132568359375)
float f32_cos_pi_4_k = {0x1.fffe74p-1f, -0x1.3ba0ecp2f, 0x1.f73ff8p1f};
// peak-error: 0x1p-24 (~ 5.9604644775390625e-8 )
float f32_cos_pi_6_k = {0.0f, 0.0f, 0.0f};
const float f32_cos_pi_6_emax[] = {0.0f,0x1.b24f04p-4f,0x1.7509b6p-3f,0x1.dc5d3cp-3f};
const float f32_cos_pi_6_emin[] = {0x1.0e5a62p-4f,0x1.2e26bap-3f,0x1.b1dd54p-3f,0x1.f73c36p-3f};
0x1.fffffep-1 + x^0x1p1 * (-0x1.3bd37ep2 + x^0x1p1 * (0x1.03acccp2 + x^0x1p1 * (-0x1.4dfd3ap0)))
0.999999940395355224609375 + x^2 * (-4.934783458709716796875 + x^2 * (4.05742168426513671875 + x^2 * (-1.30464518070220947265625)))
float f32_cos_pi_6_k = {0x1.fffffep-1f, -0x1.3bd37ep2f, 0x1.03acccp2f, -0x1.4dfd3ap0f};
// peak-error: 0x1.1093e2p-31 (~ 4.95815888346129440833465196192264556884765625e-10 )
float f32_cos_pi_8_k = {0.0f, 0.0f, 0.0f, 0.0f};
const float f32_cos_pi_8_emax[] = {0.0f,0x1.6fd938p-4f,0x1.73724ap-3f,0x1.d9c86p-3f};
const float f32_cos_pi_8_emin[] = {0.0f,0x1.387c22p-3f,0x1.b41ba4p-3f,0x1.f719a4p-3f};
0x1p0 + x^0x1p1 * (-0x1.3bd3ccp2 + x^0x1p1 * (0x1.03c1b8p2 + x^0x1p1 * (-0x1.55b7cep0 + x^0x1p1 * 0x1.d684aap-3)))
1 + x^2 * (-4.93480205535888671875 + x^2 * (4.0586986541748046875 + x^2 * (-1.33483588695526123046875 + x^2 * 0.22974522411823272705078125)))
float f32_cos_pi_8_k = {0x1p0.0f, -0x1.3bd3ccp2f, 0x1.03c1b8p2f, -0x1.55b7cep0f, 0x1.d684aap-3f};
sin(pi x) in binary64
// peak-error: 0x1.3ab388049b2fbp-29 (~ 2.2897532778723922121316943157276133091748704373458e-9 )
const double f64_sin_pi_7_emax[] = {0x1.bbfcae69524b1p-6,0x1.aaa6ee9a516bdp-4,0x1.710b078e962a6p-3,0x1.dadad1e899089p-3};
const double f64_sin_pi_7_emin[] = {0.0,0x1.9452c31c5c644p-5,0x1.1ee430169b26bp-3,0x1.ab564e8573868p-3,0x1.f665d9b725143p-3};
x * (0x1.921fb52e6a183p1 + x^0x1p1 * (-0x1.4abbb9003982p2 + x^0x1p1 * (0x1.465e91ee1939cp1 + x^0x1p1 * (-0x1.2d93021f38404p-1))))
x * (3.1415926434166876468623286200454458594322204589844 + x^2 * (-5.167707681865095992179703898727893829345703125 + x^2 * (2.5497610485640063160417412291280925273895263671875 + x^2 * (-0.58901220923519348460217770480085164308547973632812))))
double f64_sin_pi_7_k = {0x1.921fb52e6a183p1, -0x1.4abbb9003982p2, 0x1.465e91ee1939cp1, -0x1.2d93021f38404p-1};
// peak-error: 0x1.c4c3c95e213b2p-39 (~ 3.2170873352098919646489518138990105220256787710298e-12 )
const double f64_sin_pi_9_emax[] = {0x1.62f256a94e5bp-6,0x1.597bfc1bd43f2p-4,0x1.33fb39e7fbcc5p-3,0x1.a17612638b623p-3,0x1.e7cdbe6af3bb8p-3};
const double f64_sin_pi_9_emin[] = {0.0,0x1.438846b0250ffp-5,0x1.d49c01416cb48p-4,0x1.6bdcf5c3a2521p-3,0x1.c9246558341aap-3,0x1.f9d22bf6da4fp-3};
x * (0x1.921fb5443af5fp1 + x^0x1p1 * (-0x1.4abbce564cd85p2 + x^0x1p1 * (0x1.466bba8bfcp1 + x^0x1p1 * (-0x1.32ca854cad10ep-1 + x^0x1p1 * 0x1.4bc25574ce357p-4))))
x * (3.1415926535755001047789392032427713274955749511719 + x^2 * (-5.1677127688193467136557046615052968263626098632812 + x^2 * (2.5501626189725357107818126678466796875 + x^2 * (-0.59920136033045579004863157024374231696128845214844 + x^2 * 8.099587804180195804715225449399440549314022064209e-2))))
double f64_sin_pi_9_k = {0x1.921fb5443af5fp1, -0x1.4abbce564cd85p2, 0x1.466bba8bfcp1, -0x1.32ca854cad10ep-1, 0x1.4bc25574ce357p-4};
// peak-error: 0x1.ca8315e19366fp-49 (~ 3.1815664868618470143756899685246542589904257102712e-15 )
const double f64_sin_pi_11_emax[] = {0x1.290fca06d94d1p-6,0x1.21fa4f1686edep-4,0x1.068f206cd5e3dp-3,0x1.6dc982d25d723p-3,0x1.bd313021f0d7p-3,0x1.ef0731bacde8p-3};
const double f64_sin_pi_11_emin[] = {0.0,0x1.0f0ce9901adffp-5,0x1.8aee1a1653b8ap-4,0x1.3966f37a10ed8p-3,0x1.977f635ffa226p-3,0x1.d99f44509e8dp-3,0x1.fbb1abf03fd4cp-3};
x * (0x1.921fb54442cf8p1 + x^0x1p1 * (-0x1.4abbce6257778p2 + x^0x1p1 * (0x1.466bc670fa464p1 + x^0x1p1 * (-0x1.32d2c627f47dap-1 + x^0x1p1 * (0x1.5071be0a2d3dap-4 + x^0x1p1 * (-0x1.dd4e0ae5b9fcdp-8))))))
x * (3.141592653589778905143248266540467739105224609375 + x^2 * (-5.16771278003385958754734019748866558074951171875 + x^2 * (2.5501640369080167403126324643380939960479736328125 + x^2 * (-0.59926432836277432336657966516213491559028625488281 + x^2 * (8.2139723151001403644855258789903018623590469360352e-2 + x^2 * (-7.2830940823464642222551113093231833772733807563782e-3))))))
double f64_sin_pi_11_k = {0x1.921fb54442cf8p1, -0x1.4abbce6257778p2, 0x1.466bc670fa464p1, -0x1.32d2c627f47dap-1, 0x1.5071be0a2d3dap-4, -0x1.dd4e0ae5b9fcdp-8};
// peak-error: 0x1.3ebb2d89a070cp-59 (~ 2.1598063750783926919942248742440729236434628912091e-18 )
const double f64_sin_pi_13_emax[] = {0x1.c59307defa546p-6,0x1.4e0079a3c9f9dp-4,0x1.0c9170d617f9fp-3,0x1.6478a9d1c4ae2p-3,0x1.aa84f32972f42p-3,0x1.dbd41065abda9p-3,0x1.f78ee2f85dafcp-3};
const double f64_sin_pi_13_emin[] = {0.0,0x1.c590af98da5c8p-5,0x1.b8e07f2f28fd3p-4,0x1.3c2cfebfb7742p-3,0x1.8bcb1d6623167p-3,0x1.c7a02ff5a5cf3p-3,0x1.ed8218d3335e2p-3,0x1.fe298cc44b3f1p-3};
x * (0x1.921fb54442d18p1 + x^0x1p1 * (-0x1.4abbce625be09p2 + x^0x1p1 * (0x1.466bc67754fffp1 + x^0x1p1 * (-0x1.32d2ccdfe9424p-1 + x^0x1p1 * (0x1.50782d5f14825p-4 + x^0x1p1 * (-0x1.e2fe76fdffd2bp-8 + x^0x1p1 * 0x1.e357ef99eb0bbp-12))))))
x * (3.141592653589793115997963468544185161590576171875 + x^2 * (-5.1677127800499045306992229598108679056167602539062 + x^2 * (2.5501640398670128995206596300704404711723327636719 + x^2 * (-0.59926452859202017364737002935726195573806762695312 + x^2 * (8.2145859939629931045779187570587964728474617004395e-2 + x^2 * (-7.3699036129249257884299417753481975523754954338074e-3 + x^2 * 4.609522817371582213523406590383046932402066886425e-4))))))
double f64_sin_pi_13_k = {0x1.921fb54442d18p1, -0x1.4abbce625be09p2, 0x1.466bc67754fffp1, -0x1.32d2ccdfe9424p-1, 0x1.50782d5f14825p-4, -0x1.e2fe76fdffd2bp-8, 0x1.e357ef99eb0bbp-12};
cos(pi x) in binary64
// peak-error: 0x1.18263bbp-25 (~ 3.261367653717428538584499619901180267333984375e-8 )
const double f64_cos_pi_6_emax[] = {0.0,0x1.923bb0adbcafp-4,0x1.6fb61edcf4f24p-3,0x1.db38f0a6a37cbp-3};
const double f64_cos_pi_6_emin[] = {0x1.9f8dbb5edb6c2p-5,0x1.24ad82cc292a3p-3,0x1.af3e4a9787538p-3,0x1.f6f865b07a221p-3};
0x1.fffffee7d9c45p-1 + x^0x1p1 * (-0x1.3bd38b6200606p2 + x^0x1p1 * (0x1.03ae64c9b1678p2 + x^0x1p1 * (-0x1.4e35da5eabfc3p0)))
0.99999996738632346282571461415500380098819732666016 + x^2 * (-4.9347866494222270006275721243582665920257568359375 + x^2 * (4.05751914688664072627943824045360088348388671875 + x^2 * (-1.3055092316753735826040383471990935504436492919922)))
double f64_cos_pi_6_k = {0x1.fffffee7d9c45p-1, -0x1.3bd38b6200606p2, 0x1.03ae64c9b1678p2, -0x1.4e35da5eabfc3p0};
// peak-error: 0x1.ed22p-35 (~ 5.606271002989160479046404361724853515625e-11 )
const double f64_cos_pi_8_emax[] = {0.0,0x1.440bfb3e3464p-4,0x1.323cbc9ae9f1ep-3,0x1.a21c19e033a7cp-3,0x1.e838279cbfa44p-3};
const double f64_cos_pi_8_emin[] = {0x1.4ac845c3a9abdp-5,0x1.dd3fca7d29e6fp-4,0x1.702a76b7ff874p-3,0x1.cb69acaec2594p-3,0x1.fa1f73d4fe5b2p-3};
0x1.ffffffff84b78p-1 + x^0x1p1 * (-0x1.3bd3cc6e7cf9dp2 + x^0x1p1 * (0x1.03c1daad03632p2 + x^0x1p1 * (-0x1.55c4e9c28184p0 + x^0x1p1 * 0x1.d99f538fa683dp-3)))
0.99999999994393728997010839520953595638275146484375 + x^2 * (-4.9348021582590293476755505253095179796218872070312 + x^2 * (4.0587069215376221364977027405984699726104736328125 + x^2 * (-1.3350359058254213096006424166262149810791015625 + x^2 * 0.231260922261585039061415614014549646526575088500977)))
double f64_cos_pi_8_k = {0x1.ffffffff84b78p-1, -0x1.3bd3cc6e7cf9dp2, 0x1.03c1daad03632p2, -0x1.55c4e9c28184p0, 0x1.d99f538fa683dp-3};
// peak-error: 0x1.278p-44 (~ 6.561418075534675153903663158416748046875e-14 )
const double f64_cos_pi_10_emax[] = {0.0,0x1.0ebc696fe375ap-4,0x1.04799c81b1588p-3,0x1.6e4f78d4e1e9p-3,0x1.be0de46a14ab8p-3,0x1.ef5a76f155683p-3};
const double f64_cos_pi_10_emin[] = {0x1.128bd41dfda14p-5,0x1.912e62ecf1771p-4,0x1.3d35cbe6bc8efp-3,0x1.9a7dcdfb20471p-3,0x1.db0698d3e9264p-3,0x1.fbdf01ca8c58cp-3};
0x1.ffffffffffdb1p-1 + x^0x1p1 * (-0x1.3bd3cc9bd0994p2 + x^0x1p1 * (0x1.03c1f073cd5eap2 + x^0x1p1 * (-0x1.55d3b9726d2d5p0 + x^0x1p1 * (0x1.e1e761359aeb5p-3 + x^0x1p1 * (-0x1.a0d8acfd174acp-6)))))
0.99999999999993438581924465324846096336841583251953 + x^2 * (-4.934802200472763189509350922890007495880126953125 + x^2 * (4.0587121134644608133612564415670931339263916015625 + x^2 * (-1.3352619079934602286385825209436006844043731689453 + x^2 * (0.235304603050612876069536127943138126283884048461914 + x^2 * (-2.5442284521308408673512246878090081736445426940918e-2)))))
double f64_cos_pi_10_k = {0x1.ffffffffffdb1p-1, -0x1.3bd3cc9bd0994p2, 0x1.03c1f073cd5eap2, -0x1.55d3b9726d2d5p0, 0x1.e1e761359aeb5p-3, -0x1.a0d8acfd174acp-6};
// peak-error: 0x1p-53 (~ 1.1102230246251565404236316680908203125e-16 )
const double f64_cos_pi_12_emax[] = {0.0,0x1.fb49ea376ccc2p-5,0x1.ced5a98d0ff82p-4,0x1.46436eb2a6971p-3,0x1.9512132415c01p-3,0x1.cfc3946e05a6ap-3,0x1.f3d79015a856bp-3};
const double f64_cos_pi_12_emin[] = {0x1.350e073e6c4f1p-5,0x1.698a3d96d6b82p-4,0x1.19428502dbd2ap-3,0x1.709b633142371p-3,0x1.b58cb1b142456p-3,0x1.e4ebe0bf4569ap-3,0x1.fcfa28a36c9f7p-3};
0x1.fffffffffffffp-1 + x^0x1p1 * (-0x1.3bd3cc9be4565p2 + x^0x1p1 * (0x1.03c1f081af262p2 + x^0x1p1 * (-0x1.55d3c7dac6352p0 + x^0x1p1 * (0x1.e1f4fa4f3bb22p-3 + x^0x1p1 * (-0x1.a6c9501cb8cdap-6 + x^0x1p1 * 0x1.f3b7b6aafa2abp-10)))))
0.99999999999999988897769753748434595763683319091797 + x^2 * (-4.9348022005445715265636863477993756532669067382812 + x^2 * (4.0587121263930345804737953585572540760040283203125 + x^2 * (-1.33526276675384680814318016928154975175857543945312 + x^2 * (0.235330539267544713855073723607347346842288970947266 + x^2 * (-2.5804832682195001647418308721171342767775058746338e-2 + x^2 * 1.9062714807153529044531081737545719079207628965378e-3)))))
double f64_cos_pi_12_k = {0x1.fffffffffffffp-1, -0x1.3bd3cc9be4565p2, 0x1.03c1f081af262p2, -0x1.55d3c7dac6352p0, 0x1.e1f4fa4f3bb22p-3, -0x1.a6c9501cb8cdap-6, 0x1.f3b7b6aafa2abp-10};
// peak-error: 0x1.c8900a3e39182p-62 (~ 3.8672361236922213500679278930099523851530575541127e-19 )
const double f64_cos_pi_14_emax[] = {0.0,0x1.be43b119b9775p-5,0x1.d9d47a79b1831p-4,0x1.4984d2a5775c3p-3,0x1.94e6aa80bece3p-3,0x1.ce104cf7c2667p-3,0x1.f2e1517ffa564p-3};
const double f64_cos_pi_14_emin[] = {0.0,0x1.7f14a95de1fb7p-4,0x1.221838759aa4bp-3,0x1.749a863e9202ep-3,0x1.b608c167f6485p-3,0x1.e44db81d472f4p-3,0x1.fcd45528d98b4p-3};
0x1p0 + x^0x1p1 * (-0x1.3bd3cc9be45dep2 + x^0x1p1 * (0x1.03c1f081b5a67p2 + x^0x1p1 * (-0x1.55d3c7e3c325bp0 + x^0x1p1 * (0x1.e1f5067b90b37p-3 + x^0x1p1 * (-0x1.a6d1e7294bffap-6 + x^0x1p1 * (0x1.f9c89ca1d5187p-10 + x^0x1p1 * (-0x1.b167302e37198p-14)))))))
1 + x^2 * (-4.9348022005446789961524700629524886608123779296875 + x^2 * (4.0587121264166858836119899933692067861557006835937 + x^2 * (-1.3352627688465392719052715619909577071666717529297 + x^2 * (0.23533062996474438111071947332675335928797721862793 + x^2 * (-2.5806880706284097970470980953905382193624973297119e-2 + x^2 * (1.92941146857092556653190396076524848467670381069183e-3 + x^2 * (-1.03331346255902656837422082247712751268409192562103e-4)))))))
double f64_cos_pi_14_k = {0x1p0.0, -0x1.3bd3cc9be45dep2, 0x1.03c1f081b5a67p2, -0x1.55d3c7e3c325bp0, 0x1.e1f5067b90b37p-3, -0x1.a6d1e7294bffap-6, 0x1.f9c89ca1d5187p-10, -0x1.b167302e37198p-14};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment