首页 > 其他分享 >记录几个正态分布相关的函数(从GSL里拷贝出来的)

记录几个正态分布相关的函数(从GSL里拷贝出来的)

时间:2023-01-30 12:44:06浏览次数:36  
标签:00 01 const double 正态分布 static return 拷贝 GSL

做芯片测试经常需要分析很多的数据,而正态分布应用最多,这些函数电子表格软件中都有,但是写在测试程序里,直接生成报告会更爽一些,尤其是遇到需要反复验证数据的情况。

//////////////////////////////////////////////////////////////////////////
////////利用梯形法生成符合标准正态分布的累积函from  Dain//////////////////
//////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <fstream>
#include <math.h>
#include <errno.h>

using namespace std;

const double PI=3.1415926;

double Normal(double z)
{
	double temp;
	temp=exp((-1)*z*z/2)/sqrt(2*PI);
	return temp;

}
/******************************************************************/
/* 返回标准正态分布的累积函数,该分布的平均值为 0,标准偏差为 1。 */
/******************************************************************/
double NormSDist(const double z)
{
	// this guards against overflow
	if(z > 6) return 1;
	if(z < -6) return 0;

	static const double gamma =  0.231641900,
		a1  =  0.319381530,
		a2  = -0.356563782,
		a3  =  1.781477973,
		a4  = -1.821255978,
		a5  =  1.330274429;

	double k = 1.0 / (1 + fabs(z) * gamma);
	double n = k * (a1 + k * (a2 + k * (a3 + k * (a4 + k * a5))));
	n = 1 - Normal(z) * n;
	if(z < 0)
		return 1.0 - n;

	return n;
}


/***********************************************************************/
/* 返回标准正态分布累积函数的逆函数。该分布的平均值为 0,标准偏差为 1。*/
/***********************************************************************/
double normsinv(const double p)
{
	static const double LOW  = 0.02425;
	static const double HIGH = 0.97575;

	/* Coefficients in rational approximations. */
	static const double a[] =
	{
		-3.969683028665376e+01,
		2.209460984245205e+02,
		-2.759285104469687e+02,
		1.383577518672690e+02,
		-3.066479806614716e+01,
		2.506628277459239e+00
	};

	static const double b[] =
	{
		-5.447609879822406e+01,
		1.615858368580409e+02,
		-1.556989798598866e+02,
		6.680131188771972e+01,
		-1.328068155288572e+01
	};

	static const double c[] =
	{
		-7.784894002430293e-03,
		-3.223964580411365e-01,
		-2.400758277161838e+00,
		-2.549732539343734e+00,
		4.374664141464968e+00,
		2.938163982698783e+00
	};

	static const double d[] =
	{
		7.784695709041462e-03,
		3.224671290700398e-01,
		2.445134137142996e+00,
		3.754408661907416e+00
	};

	double q, r;

	errno = 0;

	if (p < 0 || p > 1)
	{
		errno = EDOM;
		return 0.0;
	}
	else if (p == 0)
	{
		errno = ERANGE;
		return -HUGE_VAL /* minus "infinity" */;
	}
	else if (p == 1)
	{
		errno = ERANGE;
		return HUGE_VAL /* "infinity" */;
	}
	else if (p < LOW)
	{
		/* Rational approximation for lower region */
		q = sqrt(-2*log(p));
		return (((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5]) /
			((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1);
	}
	else if (p > HIGH)
	{
		/* Rational approximation for upper region */
		q  = sqrt(-2*log(1-p));
		return -(((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5]) /
			((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1);
	}
	else
	{
		/* Rational approximation for central region */
		q = p - 0.5;
		r = q*q;
		return (((((a[0]*r+a[1])*r+a[2])*r+a[3])*r+a[4])*r+a[5])*q /
			(((((b[0]*r+b[1])*r+b[2])*r+b[3])*r+b[4])*r+1);
	}
}

int main()
{
	ofstream out1;
	out1.open("正态分布累积函数.xls");
	for(int i=0;i<1200;i++)
		out1<<(-6)+i*0.01<<"\t"<<NormSDist((-6)+i*0.01)<<"\n";
	out1.close();
	out1.open("正态分布累积函数的逆函数.xls");
    for(int i=0;i<1000;i++)
		out1<<0.001*i<<"\t"<<normsinv(0.001*i)<<"\n";
	out1.close();
}

  

标签:00,01,const,double,正态分布,static,return,拷贝,GSL
From: https://www.cnblogs.com/integrated-circuit-testing/p/17075124.html

相关文章

  • C#高性能数组拷贝实验
    前言昨天wc(Wyu_Cnk)提了个问题C#里多维数组拷贝有没有什么比较优雅的写法?这不是问对人了吗?正好我最近在搞图像处理,要和内存打交道,我一下就想到了在C#里面直接像C/......
  • 对象拷贝
    1.对象拷贝1.1浅拷贝当pkt与新对象newobjects的构造函数new()一起使用时,pkt中的内容将被复制到pkt2中。Packetpkt,pkt2;pkt=new;pkt2=newpkt;这种方法称......
  • 判断go对象是否能直接赋值进行深拷贝
    在golang中可以使用a:=b这种方式将b赋值给a,只有当b能进行深拷贝时a与b才不会互相影响,否则就需要进行更为复杂的深拷贝。下面就是Go赋值操作的一个说明:Go语言中所有赋值......
  • 探究Array.of为浅拷贝
    发现一个很有意思的事/***Array.of是否为浅拷贝*/constarr=[1,{x:1}]constarrOf=Array.of(...arr)console.log('arr',arr)arrOf[0]='zjy'......
  • Python中的深拷贝与浅拷贝
    Python进阶篇-系列文章全篇......
  • 拷贝构造函数
    ​配合这篇文章食用更佳:构造析构函数拷贝构造函数调用时机使用一个已经创建完毕的对象来初始化一个新对象(复制)值传递的方式给函数参数传值(实参传递给形参的过程,复制)......
  • 【Python】python深拷贝和浅拷贝(一)
    【Python】python深拷贝和浅拷贝(一)大家好,我们的gzh是朝阳三只大明白,满满全是干货,分享近期的学习知识以及个人总结(包括读研和IT),跪求一波关注,希望和大家一起努力、进步!!定义直......
  • 【Python】python深拷贝和浅拷贝(二)
    【Python】python深拷贝和浅拷贝(二)大家好,我们的gzh是朝阳三只大明白,满满全是干货,分享近期的学习知识以及个人总结(包括读研和IT),跪求一波关注,希望和大家一起努力、进步!!前言上......
  • Day18 - property和拷贝
    1.装饰器方式的property使用@property对get方法进行装饰get方法在装饰时,不需要再以get_做为前缀在通过@property装饰好Get方法后,可以使用get方法的方法......
  • 【C++ OOP 02 对象的初始化和清理】构造/析构函数、深/浅拷贝、初始化列表以及静态成
    【对象的初始化和清理】生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全C++中的面向对象来源于生活,每个对象也都会有......