complexfd.c

来自「该程序是用vc开发的对动态数组进行管理的DLL」· C语言 代码 · 共 143 行

C
143
字号
/* Copyright (c) Colorado School of Mines, 2003.*//* All rights reserved.                       *//*********************** self documentation **********************//************************************************************************COMPLEXFD  - Subroutines to perform operations on double fcomplex numbers.		This set of functions complement the one in complexd.c		of the CWP librarydcipow		raise a double fcomplex number to an integer powerdcrpow		raise a double fcomplex number to a real powerrdcpow		raise a real number to a double fcomplex powerdcdcpow		raise a double fcomplex number to a double fcomplex powerdccos		compute the double fcomplex cosine of a double fcomplex angledcsin		compute the double fcomplex sine of a double fcomplex angledccosh		compute the double fcomplex hyperbolic cosine of a double fcomplex angledcsinh		compute the double fcomplex hyperbolic sine of a double fcomplex angledcexp1		compute the double fcomplex exponential of a double fcomplex numberdclog		compute the double fcomplex logarithm of a double fcomplex number************************************************************************Function Prototypes:dcomplex dcipow(dcomplex a, int p);dcomplex dcrpow(dcomplex a, float p);dcomplex rdcpow(float a, dcomplex p);dcomplex dcdcpow (dcomplex a, dcomplex p)dcomplex dccos(dcomplex a);dcomplex dcsin(dcomplex a);dcomplex dccosh(dcomplex a);dcomplex dcsinh(dcomplex a);dcomplex dcexp1(dcomplex a);dcomplex dclog(dcomplex a);************************************************************************Credits:	Dave Hale, original version in C++	Gabriel Alvarez, translation to C***********************************************************************//**************** end self doc ********************************/#include "cwp.h"dcomplex dcipow(dcomplex a, int p){	dcomplex res;	dcomplex b;	if (p==0) {		return dcmplx(1.0,0.0);	} else if (a.r==0.0 && a.i==0.0) {		return dcmplx(0.0,0.0);	} else {		res=dcmplx(1.0,0.0);		b=a;		if (p<0) {			p = -p;			b = dcinv(b);		}		for(;;) {			if (p&1) res = dcmul(res,b);			if ((p>>=1)==0)				return res;			else				b = dcmul(b,b);		}	}}			dcomplex dcrpow(dcomplex a, float p){	float ar,ai,amp,phs;	if (p==0.0) return dcmplx(1.0,0.0);	if (a.r==0.0 && a.i==0.0) return dcmplx(0.0,0.0);	ar = (float)a.r; ai = (float)a.i;	amp = (float)(exp(0.5*p*log(ar*ar+ai*ai)));	phs = (float)(p*atan2(ai,ar));	return dcmplx(amp*cos(phs),amp*sin(phs));	}dcomplex rdcpow(float a, dcomplex p){	float pr,pi,loga,amp,phs;	if (p.r==0.0 && p.i==0.0) return dcmplx(1.0,0.0);	if (a==0.0) return dcmplx(0.0,0.0);	pr = (float)p.r; pi = (float)p.i;	loga = (float)(0.5*log(a*a));	amp = (float)exp(pr*loga);	phs = pi*loga;	return dcmplx(amp*cos(phs),amp*sin(phs));	}dcomplex dcdcpow (dcomplex a, dcomplex p){	float ar,ai,pr,pi,loga,arga,amp,phs;	if (p.r==0.0 && p.i==0.0) return dcmplx(1.0,0.0);	if (a.r==0.0 && a.i==0.0) return dcmplx(0.0,0.0);	pr = (float)p.r; pi = (float)p.i; ar = (float)a.r; ai = (float)a.i;	loga = (float)(0.5*log(ar*ar+ai*ai));	arga = (float)atan2(ai,ar);	amp = (float)exp(pr*loga-pi*arga);	phs = pr*arga+pi*loga;	return dcmplx(amp*cos(phs),amp*sin(phs));}dcomplex dccos(dcomplex a){	return dcmplx(cos(a.r)*cosh(a.i),-sin(a.r)*sinh(a.i));}dcomplex dcsin(dcomplex a){	return dcmplx(sin(a.r)*cosh(a.i),cos(a.r)*sinh(a.i));}dcomplex dccosh(dcomplex a){	return dcmplx(cos(a.i)*cosh(a.r),sin(a.i)*sinh(a.r));}dcomplex dcsinh(dcomplex a){	return dcmplx(cos(a.i)*sinh(a.r),sin(a.i)*cosh(a.r));}dcomplex dcexp1(dcomplex a){	float r=(float)exp(a.r);	return dcmplx(r*cos(a.i),r*sin(a.i));}dcomplex dclog(dcomplex a){	float ar=(float)a.r,ai=(float)a.i,h=(float)sqrt(ar*ar+ai*ai);	return dcmplx(log(h),atan2(ai,ar));}

⌨️ 快捷键说明

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