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

📄 complex.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include "map.h"/*complex divide, defensive against overflow from *	* and /, but not from + and - *	assumes underflow yields 0.0 *	uses identities: *	(a + bi)/(c + di) = ((a + bd/c) + (b - ad/c)i)/(c + dd/c) *	(a + bi)/(c + di) = (b - ai)/(d - ci)*/voidcdiv(double a, double b, double c, double d, double *u, double *v){	double r,t;	if(fabs(c)<fabs(d)) {		t = -c; c = d; d = t;		t = -a; a = b; b = t;	}	r = d/c;	t = c + r*d;	*u = (a + r*b)/t;	*v = (b - r*a)/t;}voidcmul(double c1, double c2, double d1, double d2, double *e1, double *e2){	*e1 = c1*d1 - c2*d2;	*e2 = c1*d2 + c2*d1;}voidcsq(double c1, double c2, double *e1, double *e2){	*e1 = c1*c1 - c2*c2;	*e2 = c1*c2*2;}/* complex square root *	assumes underflow yields 0.0 *	uses these identities: *	sqrt(x+_iy) = sqrt(r(cos(t)+_isin(t)) *	           = sqrt(r)(cos(t/2)+_isin(t/2)) *	cos(t/2) = sin(t)/2sin(t/2) = sqrt((1+cos(t)/2) *	sin(t/2) = sin(t)/2cos(t/2) = sqrt((1-cos(t)/2)*/voidcsqrt(double c1, double c2, double *e1, double *e2){	double r,s;	double x,y;	x = fabs(c1);	y = fabs(c2);	if(x>=y) {		if(x==0) {			*e1 = *e2 = 0;			return;		}		r = x;		s = y/x;	} else {		r = y;		s = x/y;	}	r *= sqrt(1+ s*s);	if(c1>0) {		*e1 = sqrt((r+c1)/2);		*e2 = c2/(2* *e1);	} else {		*e2 = sqrt((r-c1)/2);		if(c2<0)			*e2 = -*e2;		*e1 = c2/(2* *e2);	}}void cpow(double c1, double c2, double *d1, double *d2, double pwr){	double theta = pwr*atan2(c2,c1);	double r = pow(hypot(c1,c2), pwr);	*d1 = r*cos(theta);	*d2 = r*sin(theta);}

⌨️ 快捷键说明

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