Last active
January 27, 2021 22:26
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* -*- 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"); | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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