1: /*	@(#)erf.c	4.1	12/25/82	*/
   2: 
   3: /*
   4: 	C program for floating point error function
   5: 
   6: 	erf(x) returns the error function of its argument
   7: 	erfc(x) returns 1.0-erf(x)
   8: 
   9: 	erf(x) is defined by
  10: 	${2 over sqrt(pi)} int from 0 to x e sup {-t sup 2} dt$
  11: 
  12: 	the entry for erfc is provided because of the
  13: 	extreme loss of relative accuracy if erf(x) is
  14: 	called for large x and the result subtracted
  15: 	from 1. (e.g. for x= 10, 12 places are lost).
  16: 
  17: 	There are no error returns.
  18: 
  19: 	Calls exp.
  20: 
  21: 	Coefficients for large x are #5667 from Hart & Cheney (18.72D).
  22: */
  23: 
  24: #define M 7
  25: #define N 9
  26: int errno;
  27: static double torp = 1.1283791670955125738961589031;
  28: static double p1[] = {
  29:     0.804373630960840172832162e5,
  30:     0.740407142710151470082064e4,
  31:     0.301782788536507577809226e4,
  32:     0.380140318123903008244444e2,
  33:     0.143383842191748205576712e2,
  34:     -.288805137207594084924010e0,
  35:     0.007547728033418631287834e0,
  36: };
  37: static double q1[]  = {
  38:     0.804373630960840172826266e5,
  39:     0.342165257924628539769006e5,
  40:     0.637960017324428279487120e4,
  41:     0.658070155459240506326937e3,
  42:     0.380190713951939403753468e2,
  43:     0.100000000000000000000000e1,
  44:     0.0,
  45: };
  46: static double p2[]  = {
  47:     0.18263348842295112592168999e4,
  48:     0.28980293292167655611275846e4,
  49:     0.2320439590251635247384768711e4,
  50:     0.1143262070703886173606073338e4,
  51:     0.3685196154710010637133875746e3,
  52:     0.7708161730368428609781633646e2,
  53:     0.9675807882987265400604202961e1,
  54:     0.5641877825507397413087057563e0,
  55:     0.0,
  56: };
  57: static double q2[]  = {
  58:     0.18263348842295112595576438e4,
  59:     0.495882756472114071495438422e4,
  60:     0.60895424232724435504633068e4,
  61:     0.4429612803883682726711528526e4,
  62:     0.2094384367789539593790281779e4,
  63:     0.6617361207107653469211984771e3,
  64:     0.1371255960500622202878443578e3,
  65:     0.1714980943627607849376131193e2,
  66:     1.0,
  67: };
  68: 
  69: double
  70: erf(arg) double arg;{
  71:     double erfc();
  72:     int sign;
  73:     double argsq;
  74:     double d, n;
  75:     int i;
  76: 
  77:     errno = 0;
  78:     sign = 1;
  79:     if(arg < 0.){
  80:         arg = -arg;
  81:         sign = -1;
  82:     }
  83:     if(arg < 0.5){
  84:         argsq = arg*arg;
  85:         for(n=0,d=0,i=M-1; i>=0; i--){
  86:             n = n*argsq + p1[i];
  87:             d = d*argsq + q1[i];
  88:         }
  89:         return(sign*torp*arg*n/d);
  90:     }
  91:     if(arg >= 10.)
  92:         return(sign*1.);
  93:     return(sign*(1. - erfc(arg)));
  94: }
  95: 
  96: double
  97: erfc(arg) double arg;{
  98:     double erf();
  99:     double exp();
 100:     double n, d;
 101:     int i;
 102: 
 103:     errno = 0;
 104:     if(arg < 0.)
 105:         return(2. - erfc(-arg));
 106: /*
 107: 	if(arg < 0.5)
 108: 		return(1. - erf(arg));
 109: */
 110:     if(arg >= 10.)
 111:         return(0.);
 112: 
 113:     for(n=0,d=0,i=N-1; i>=0; i--){
 114:         n = n*arg + p2[i];
 115:         d = d*arg + q2[i];
 116:     }
 117:     return(exp(-arg*arg)*n/d);
 118: }

Defined functions

erf defined in line 69; used 7 times
erfc defined in line 96; used 9 times

Defined variables

errno defined in line 26; used 2 times
p1 defined in line 28; used 1 times
  • in line 86
p2 defined in line 46; used 1 times
q1 defined in line 37; used 1 times
  • in line 87
q2 defined in line 57; used 1 times
torp defined in line 27; used 1 times
  • in line 89

Defined macros

M defined in line 24; used 1 times
  • in line 85
N defined in line 25; used 1 times
Last modified: 1985-06-05
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1050
Valid CSS Valid XHTML 1.0 Strict