[Mono-list] Math precision.

Bob Smith bob@thestuff.net
19 Jul 2001 12:22:50 -0600


Hello all,

I've been working on the System.Math class, trying to implement
everything in C# without useing P/Invoke. I've been fairly successfull
at implementing the trig functions like sin/cos, but I've so far not
been able to get the precission of the results more precise then 15
decimals. What would everyone prefer I do. Will 15 decimal precision be
good enough until I can find a way to do it better, or should I just
give up and P/Invoke the C sin/cos function?

For those math types, here's the algarithm I'm useing (CODIC in C). Can
anyone see a way to improve it? A and K were generated useing Octave.:

double my_sin(double t){
  int j, d;
  double x=K, y=0, z=t, ox=K, oy=0, p=2;
  for(j=0; j<50; j++){
    d=(z<0)?-1:1;
    p/=2;
    x -= d*oy*p;
    y += d*ox*p;
    z -= d*A[j];
    ox=x; oy=y;
  }
  return y;
}

static const double
K=6.0725293500888144482274810798116959631443023681640625000e-01;

static const double A[]={
7.8539816339744827899949086713604629039764404296875000000e-01,
4.6364760900080609351547877849952783435583114624023437500e-01,
2.4497866312686414347332686247682431712746620178222656250e-01,
1.2435499454676143815667899161780951544642448425292968750e-01,
6.2418809995957350023054743815009715035557746887207031250e-02,
3.1239833430268277442154456480238877702504396438598632812e-02,
1.5623728620476831294161534913200739538297057151794433594e-02,
7.8123410601011111439873069173245312413200736045837402344e-03,
3.9062301319669717573901390750279460917226970195770263672e-03,
1.9531225164788187584341550007138721412047743797302246094e-03,
9.7656218955931945943649274965991935459896922111511230469e-04,
4.8828121119489828992621394121442790492437779903411865234e-04,
2.4414062014936177124474481203719733457546681165695190430e-04,
1.2207031189367020785306594543584424172877334058284759521e-04,
6.1035156174208772593501454162279173942806664854288101196e-05,
3.0517578115526095727154734515984557674528332427144050598e-05,
1.5258789061315761542377868187347900175154791213572025299e-05,
7.6293945311019699810389967098434027548137237317860126495e-06,
3.8146972656064961417507561819428829608114028815180063248e-06,
1.9073486328101869647792853193490891783312690677121281624e-06,
9.5367431640596084412763106322175055140633048722520470619e-07,
4.7683715820308884228106408205427602098325223778374493122e-07,
2.3841857910155797366768810983256310365163699316326528788e-07,
1.1920928955078068089973856351695968847081985586555674672e-07,
5.9604644775390552208106095333564611316035097843268886209e-08,
2.9802322387695302573832649363667901543095695160445757210e-08,
1.4901161193847654595638774893944650257182615860074292868e-08,
7.4505805969238281250000000000000000000000000000000000000e-09,
3.7252902984619140625000000000000000000000000000000000000e-09,
1.8626451492309570312500000000000000000000000000000000000e-09,
9.3132257461547851562500000000000000000000000000000000000e-10,
4.6566128730773925781250000000000000000000000000000000000e-10,
2.3283064365386962890625000000000000000000000000000000000e-10,
1.1641532182693481445312500000000000000000000000000000000e-10,
5.8207660913467407226562500000000000000000000000000000000e-11,
2.9103830456733703613281250000000000000000000000000000000e-11,
1.4551915228366851806640625000000000000000000000000000000e-11,
7.2759576141834259033203125000000000000000000000000000000e-12,
3.6379788070917129516601562500000000000000000000000000000e-12,
1.8189894035458564758300781250000000000000000000000000000e-12,
9.0949470177292823791503906250000000000000000000000000000e-13,
4.5474735088646411895751953125000000000000000000000000000e-13,
2.2737367544323205947875976562500000000000000000000000000e-13,
1.1368683772161602973937988281250000000000000000000000000e-13,
5.6843418860808014869689941406250000000000000000000000000e-14,
2.8421709430404007434844970703125000000000000000000000000e-14,
1.4210854715202003717422485351562500000000000000000000000e-14,
7.1054273576010018587112426757812500000000000000000000000e-15,
3.5527136788005009293556213378906250000000000000000000000e-15,
1.7763568394002504646778106689453125000000000000000000000e-15,
8.8817841970012523233890533447265625000000000000000000000e-16,
4.4408920985006261616945266723632812500000000000000000000e-16
};