q_func.cpp
上传用户:jtjnyq9001
上传日期:2014-11-21
资源大小:3974k
文件大小:1k
源码类别:

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = q_func.cpp
  3. //
  4. //#include <stdlib.h>
  5. #include <math.h>
  6. #include "q_func.h"
  7. #ifndef PI
  8.   #define PI 3.1415926535897932
  9. #endif
  10. #define ROOT_2 1.414213562
  11. double q_func(double x)
  12. {
  13.   double val;
  14.   if(x ==0)
  15.     {
  16.     val = 0.5;
  17.     }
  18.   else
  19.     {
  20.     val = 0.5 * erfc(x/ROOT_2);
  21.     }
  22.   return(val);
  23. }
  24. double erfc(double x)
  25. {
  26.   double w, y, z;
  27.   z = fabs(x);
  28.   w = 1.0 / (1.0 + 0.5*z);
  29.   y = w*exp(-z*z-1.26551223+w*(1.00002368+w*(0.37409196+
  30.       w*(0.09678418+w*(-0.18628806+w*(0.27886807+w*(-1.13520398+
  31.       w*(1.48851587+w*(-0.82215223+w*0.17087277)))))))));
  32.   if(x<0.0) y = 2.0 - y;
  33.   return(y);
  34. }
  35. double marcum_q(double a, double t)
  36. {
  37.   #define prec 0.01
  38.   double result;
  39.   double ct, ca, et, g, k, gnew;
  40.   int nn, n;
  41.   if( (a>20.0) && t>10.0*(t-a) )
  42.     {
  43.     //result = 0.5 * erfc((t-a)/ROOT_2);
  44.     result = 0.0;
  45.     }
  46.   else
  47.     {
  48.     ct = t*t/2.0;
  49.     ca = a*a/2.0;
  50.     et = exp(-ct);
  51.     g = 1.0 - et;
  52.     k = exp(-ca);
  53.     gnew = et;
  54.     result = 1.0 - g*k;
  55.     nn = 1+int(ceil(0.5*a*t));
  56.     for(n=1; n<=nn; n++)
  57.       {
  58.       gnew = gnew * ct/double(n);
  59.       g -= gnew;
  60.       k *= (ca/double(n));
  61.       result -= g*k;
  62.       }
  63.     while( (g*k/1.0 - (0.5*a*t/n)*(0.5*a*t/n)) > prec*result)
  64.       {
  65.       n++;
  66.       gnew *= ct/double(n);
  67.       g -= gnew;
  68.       k *= ca/double(n);
  69.       result -= g*k;
  70.       }
  71.     } // end of else clause
  72.   return(result);
  73. }
  74. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++