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

📄 complex.h

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1985 Thomas L. Quarles * Modified: 1999 Paolo Nenzi, 2000 Arno W. Peters */#ifndef _COMPLEX_H#define _COMPLEX_H/* Complex numbers. */struct _complex1 {   /* IBM portability... renamed due to double definition in MINGW32*/    double cx_real;    double cx_imag;} ;typedef struct _complex1 complex;#define realpart(cval)  ((struct _complex1 *) (cval))->cx_real#define imagpart(cval)  ((struct _complex1 *) (cval))->cx_imag#ifdef CIDER/* From Cider numcomplex.h    pn:leave it here until I decide what to do about struct mosAdmittances {    complex yIdVdb;    complex yIdVsb;    complex yIdVgb;    complex yIsVdb;    complex yIsVsb;    complex yIsVgb;    complex yIgVdb;    complex yIgVsb;    complex yIgVgb;   };    */#endif/* *  Each expects two arguments for each complex number - a real and an *  imaginary part. */typedef struct {    double real;    double imag;} SPcomplex;/* *  COMPLEX NUMBER DATA STRUCTURE * *  >>> Structure fields: *  real  (realNumber) *      The real portion of the number.  real must be the first *      field in this structure. *  imag  (realNumber) *      The imaginary portion of the number. This field must follow *      immediately after real. */#define spREAL  double#if 0 /* Can this be deleted? */ /* Begin `realNumber'. */ typedef  spREAL  realNumber, *realVector; /* Begin `ComplexNumber'. */ typedef  struct {   RealNumber  Real;    RealNumber  Imag; } ComplexNumber, *ComplexVector;#endif/* Some defines used mainly in cmath.c. */#define FTEcabs(d)  (((d) < 0.0) ? - (d) : (d))#define cph(c)    (atan2(imagpart(c), (realpart(c))))#define cmag(c)  (sqrt(imagpart(c) * imagpart(c) + realpart(c) * realpart(c)))#define radtodeg(c) (cx_degrees ? ((c) / 3.14159265358979323846 * 180) : (c))#define degtorad(c) (cx_degrees ? ((c) * 3.14159265358979323846 / 180) : (c))#define rcheck(cond, name)      if (!(cond)) { \    fprintf(cp_err, "Error: argument out of range for %s\n", name); \    return (NULL); }#define cdiv(r1, i1, r2, i2, r3, i3)            \{                           \    double r, s;                    \    if (FTEcabs(r2) > FTEcabs(i2)) {          \        r = (i2) / (r2);            \        s = (r2) + r * (i2);            \        (r3) = ((r1) + r * (i1)) / s;       \        (i3) = ((i1) - r * (r1)) / s;       \    } else {                    \        r = (r2) / (i2);            \        s = (i2) + r * (r2);            \        (r3) = (r * (r1) + (i1)) / s;       \        (i3) = (r * (i1) - (r1)) / s;       \    }                       \}#define DC_ABS(a,b) (fabs(a) + fabs(b))/* * Division among complex numbers */#define DC_DIVEQ(a,b,c,d) { \    double r,s,x,y;\    if(fabs(c)>fabs(d)) { \        r=(d)/(c);\        s=(c)+r*(d);\        x=((*(a))+(*(b))*r)/s;\        y=((*(b))-(*(a))*r)/s;\    } else { \        r=(c)/(d);\        s=(d)+r*(c);\        x=((*(a))*r+(*(b)))/s;\        y=((*(b))*r-(*(a)))/s;\    }\    (*(a)) = x; \    (*(b)) = y; \}/* * This is the standard multiplication among complex numbers: * (x+jy)=(a+jb)*(c+jd) * x = ac - bd and y = ad + bc */#define DC_MULT(a,b,c,d,x,y) { \    *(x) = (a) * (c) - (b) * (d) ;\    *(y) = (a) * (d) + (b) * (c) ;\}/* * Difference among complex numbers a+jb and c+jd * a = a - c   amd b = b - d */#define DC_MINUSEQ(a,b,c,d) { \    *(a) -= (c) ;\    *(b) -= (d) ;\}/* * Square root among complex numbers  * We need to treat all the cases because the sqrt() function * works only on real numbers. */#define	C_SQRT(A) {							      \	double	_mag, _a;						      \	if ((A).imag == 0.0) {						      \	    if ((A).real < 0.0) {					      \		(A).imag = sqrt(-(A).real);				      \		(A).real = 0.0;						      \	    } else {							      \		(A).real = sqrt((A).real);				      \		(A).imag = 0.0;						      \	    }								      \	} else {							      \	    _mag = sqrt((A).real * (A).real + (A).imag * (A).imag);	      \	    _a = (_mag - (A).real) / 2.0;				      \	    if (_a <= 0.0) {						      \		(A).real = sqrt(_mag);					      \		(A).imag /= (2.0 * (A).real); /*XXX*/			      \	    } else {							      \		_a = sqrt(_a);						      \		(A).real = (A).imag / (2.0 * _a);			      \		(A).imag = _a;						      \	    }								      \	}								      \    }/* * This macro calculates the squared modulus of the complex number * and return it as the real part of the same number: * a+jb -> a = (a*a) + (b*b) */ #define	C_MAG2(A) (((A).real = (A).real * (A).real + (A).imag * (A).imag),    \	(A).imag = 0.0)/* * Two macros to obtain the colpex conjugate of a number, * The first one replace the given complex with the conjugate, * the second sets A as the conjugate of B. */#define	C_CONJ(A) ((A).imag *= -1.0)#define	C_CONJEQ(A,B) {							      \	(A).real = (B.real);						      \	(A).imag = - (B.imag);						      \    }/* * Simple assignement */#define	C_EQ(A,B) {							      \	(A).real = (B.real);						      \	(A).imag = (B.imag);						      \    }/* * Normalization ??? *  */#define	C_NORM(A,B) {							      \	if ((A).real == 0.0 && (A).imag == 0.0) {			      \	    (B) = 0;							      \	} else {							      \	    while (fabs((A).real) > 1.0 || fabs((A).imag) > 1.0) {	      \		(B) += 1;						      \		(A).real /= 2.0;					      \		(A).imag /= 2.0;					      \	    }								      \	    while (fabs((A).real) <= 0.5 && fabs((A).imag) <= 0.5) {	      \		(B) -= 1;						      \		(A).real *= 2.0;					      \		(A).imag *= 2.0;					      \	    }								      \	}								      \    }/* * The magnitude of the complex number  */   #define	C_ABS(A) (sqrt((A).real * (A.real) + (A.imag * A.imag)))/*  * Standard arithmetic between complex numbers *  */#define	C_MUL(A,B) {							      \	double	TMP1, TMP2;						      \	TMP1 = (A.real);						      \	TMP2 = (B.real);						      \	(A).real = TMP1 * TMP2 - (A.imag) * (B.imag);			      \	(A).imag = TMP1 * (B.imag) + (A.imag) * TMP2;			      \    }#define	C_MULEQ(A,B,C) {						      \	(A).real = (B.real) * (C.real) - (B.imag) * (C.imag);		      \	(A).imag = (B.real) * (C.imag) + (B.imag) * (C.real);		      \    }#define	C_DIV(A,B) {							      \	double	_tmp, _mag;						      \	_tmp = (A.real);						      \	(A).real = _tmp * (B.real) + (A).imag * (B.imag);		      \	(A).imag = - _tmp * (B.imag) + (A.imag) * (B.real);		      \	_mag = (B.real) * (B.real) + (B.imag) * (B.imag);		      \	(A).real /= _mag;						      \	(A).imag /= _mag;						      \    }#define	C_DIVEQ(A,B,C) {						      \	double	_mag;							      \	(A).real = (B.real) * (C.real) + (B.imag) * (C.imag);		      \	(A).imag = (B.imag) * (C.real) - (B.real) * (C.imag) ;		      \	_mag = (C.real) * (C.real) + (C.imag) * (C.imag);		      \	(A).real /= _mag;						      \	(A).imag /= _mag;						      \    }#define	C_ADD(A,B) {							      \	(A).real += (B.real);						      \	(A).imag += (B.imag);						      \    }#define	C_ADDEQ(A,B,C) {						      \	(A).real = (B.real) + (C.real);					      \	(A).imag = (B.imag) + (C.imag);					      \    }

⌨️ 快捷键说明

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