⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 q_func.cpp

📁 《无线通信系统仿真——c++使用模型》这本书的源代码
💻 CPP
字号:
//
//  File = q_func.cpp
//

//#include <stdlib.h>
#include <math.h>
#include "q_func.h"
#ifndef PI
  #define PI 3.1415926535897932
#endif
#define ROOT_2 1.414213562

double q_func(double x)
{
  double val;
  if(x ==0)
    {
    val = 0.5;
    }
  else
    {
    val = 0.5 * erfc(x/ROOT_2);
    }
  return(val);
}

double erfc(double x)
{
  double w, y, z;
  z = fabs(x);
  w = 1.0 / (1.0 + 0.5*z);
  y = w*exp(-z*z-1.26551223+w*(1.00002368+w*(0.37409196+
      w*(0.09678418+w*(-0.18628806+w*(0.27886807+w*(-1.13520398+
      w*(1.48851587+w*(-0.82215223+w*0.17087277)))))))));
  if(x<0.0) y = 2.0 - y;
  return(y);
}

double marcum_q(double a, double t)
{
  #define prec 0.01
  double result;
  double ct, ca, et, g, k, gnew;
  int nn, n;
  if( (a>20.0) && t>10.0*(t-a) )
    {
    //result = 0.5 * erfc((t-a)/ROOT_2);
    result = 0.0;
    }
  else
    {
    ct = t*t/2.0;
    ca = a*a/2.0;
    et = exp(-ct);
    g = 1.0 - et;
    k = exp(-ca);
    gnew = et;
    result = 1.0 - g*k;
    nn = 1+int(ceil(0.5*a*t));
    for(n=1; n<=nn; n++)
      {
      gnew = gnew * ct/double(n);
      g -= gnew;
      k *= (ca/double(n));
      result -= g*k;
      }
    while( (g*k/1.0 - (0.5*a*t/n)*(0.5*a*t/n)) > prec*result)
      {
      n++;
      gnew *= ct/double(n);
      g -= gnew;
      k *= ca/double(n);
      result -= g*k;
      }
    } // end of else clause
  return(result);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -