一些复数运算的C语言实现

  很久不写博客了。第一次写博客是在04年,最近的一次还是在大学时,在学校时,甚至还有过自己去买虚拟主机搭WordPress写博客的经历。现在工作时间越长,越发现积累的重要性。那么就从这里开始吧,重新开始写博客。

  最近打算写小算法,里面需要用到一些复数运算。贴一点复数运算的C语言实现代码。都是些很简单的东西。

  包括以下运算:

  复数加法、复数减法、复数乘法、复数除法、复数取模、复指数运算、复数取相角、模与相角合成复位。本人专业本职做硬件的,写程序没受过专业训练,勿吐槽。

 1 /*file        ComplexCalculation.h
 2  *author    Vincent Cui
 3  *e-mail    [email protected]
 4  *version    0.1
 5  *data        20-Oct-2014
 6  *brief        用于复数运算的一些函数头和定义
 7 */
 8
 9
10
11 #ifndef _COMPLEXCALCULATION_H_
12 #define _COMPLEXCALCULATION_H_
13
14 #define ASSERT_ENABLE 1
15
16 #define IS_COMPLEX_DIVISOR_CORRENT(DIVISOR_REAL, DIVISOR_IMAG)        ((DIVISOR_REAL != 0) || (DIVISOR_IMAG != 0))
17
18 typedef double                    mathDouble;
19 typedef unsigned char            mathUint_8;
20 typedef unsigned short int        mathUint_16;
21 typedef unsigned int            mathUint_32;
22
23
24 typedef struct _ReDefcomplex
25 {
26     mathDouble    Real;
27     mathDouble    Imag;
28 }complexType;
29
30
31 complexType    complexAdd(complexType a, complexType b);
32 complexType    complexSubtract(complexType minuend, complexType subtrahend);
33 complexType complexMultiply(complexType a, complexType b);
34 complexType complexDivision(complexType dividend, complexType divisor);
35 mathDouble    complexAbs(complexType a);
36 mathDouble    complexAngle(complexType a);
37 complexType complexByAbsAngle(mathDouble r, mathDouble theta);
38 complexType complexExp(complexType a);
39
40 #if ASSERT_ENABLE
41   #define assert_param(expr) ((expr) ? (void)0 : assert_failed((mathUint_8 *)__FILE__, __LINE__))
42   void assert_failed(mathUint_8* file, mathUint_32 line);
43 #else
44   #define assert_param(expr) ((void)0)
45 #endif
46
47
48
49 #endif

ComplexCalculation.h

  1 /*file        ComplexCalculation.c
  2  *author    Vincent Cui
  3  *e-mail    [email protected]
  4  *version    0.1
  5  *data        20-Oct-2014
  6  *brief        用于复数运算的一些函数
  7 */
  8
  9
 10 #include "ComplexCalculation.h"
 11 #include "math.h"
 12 #include "stdio.h"
 13
 14
 15 /*函数名:complexAdd
 16  *说明:复数加法
 17  *输入:a,b两个复数
 18  *输出:
 19  *返回:a + b
 20  *调用:
 21  *其它:
 22  */
 23 complexType    complexAdd(complexType a, complexType b)
 24 {
 25     complexType result;
 26
 27     result.Real = a.Real + b.Real;
 28     result.Imag = a.Imag + b.Imag;
 29
 30     return result;
 31 }
 32
 33 /*函数名:complexSubtract
 34  *说明:复数减法
 35  *输入:minuend被减数,subtrahend减数
 36  *输出:
 37  *返回:a - b
 38  *调用:
 39  *其它:
 40  */
 41 complexType    complexSubtract(complexType minuend, complexType subtrahend)
 42 {
 43     complexType result;
 44
 45     result.Real = minuend.Real - subtrahend.Real;
 46     result.Imag = minuend.Imag - subtrahend.Imag;
 47
 48     return result;
 49 }
 50
 51 /*函数名:complexMultiply
 52  *说明:复数乘法
 53  *输入:a,b两个复数
 54  *输出:
 55  *返回:a * b
 56  *调用:
 57  *其它:
 58  */
 59 complexType complexMultiply(complexType a, complexType b)
 60 {
 61     complexType result;
 62
 63     result.Real = a.Real * b.Real - a.Imag * b.Imag;
 64     result.Imag = a.Imag * b.Real + a.Real * b.Imag;
 65
 66     return result;
 67 }
 68
 69
 70 /*函数名:complexDivision
 71  *说明:复数除法
 72  *输入:dividend被除数,divisor除数
 73  *输出:
 74  *返回:a / b
 75  *调用:
 76  *其它:divisor的实部和虚部不能同时为0
 77  */
 78 complexType complexDivision(complexType dividend, complexType divisor)
 79 {
 80     complexType result;
 81
 82     /*断言,被除数的实部和虚部不能同时为零*/
 83     assert_param(IS_COMPLEX_DIVISOR_CORRENT(divisor.Real, divisor.Imag));
 84
 85     result.Real = (mathDouble)(dividend.Real * divisor.Real + dividend.Imag * divisor.Imag) /  86                   (divisor.Real * divisor.Real + divisor.Imag * divisor.Imag);
 87     result.Imag = (mathDouble)(dividend.Imag * divisor.Real - dividend.Real * divisor.Imag) /  88                   (divisor.Real * divisor.Real + divisor.Imag * divisor.Imag);
 89     return result;
 90 }
 91
 92 /*函数名:complexAbs
 93  *说明:复数取模
 94  *输入:a复数
 95  *输出:
 96  *返回:复数的模
 97  *调用:
 98  *其它:
 99  */
100 mathDouble    complexAbs(complexType a)
101 {
102     return (sqrt( pow(a.Real,2) + pow(a.Imag,2) ));
103 }
104
105
106 /*函数名:complexAngle
107  *说明:复数取相角
108  *输入:a复数
109  *输出:
110  *返回:复数的相角
111  *调用:
112  *其它:
113  */
114 mathDouble    complexAngle(complexType a)
115 {
116     /*是atan2而非atan,(-PI,PI] */
117     return (atan2(a.Imag, a.Real));
118 }
119
120 /*函数名:complexByAbsAngle
121  *说明:通过模和相角合成复数
122  *输入:r 模, theta 相角
123  *输出:
124  *返回:复数
125  *调用:
126  *其它:
127  */
128 complexType complexByAbsAngle(mathDouble r, mathDouble theta)
129 {
130     complexType tmp_1,tmp_2;
131
132     tmp_1.Real = 0;
133     tmp_1.Imag = theta;
134     tmp_2 = complexExp(tmp_1);
135     tmp_2.Real *= r;
136     tmp_2.Imag *= r;
137
138     return tmp_2;
139 }
140
141 /*函数名:complexExp
142  *说明:复指数运算
143  *输入:a 复指数
144  *输出:
145  *返回:e的a次方
146  *调用:
147  *其它:使用欧拉公式 e^(jw) = cos(w) + j * sin(w)
148  */
149 complexType complexExp(complexType a)
150 {
151     complexType result;
152
153     result.Real = exp(a.Real) * cos(a.Imag);
154     result.Imag = exp(a.Real) * sin(a.Imag);
155
156     return result;
157 }
158
159
160 #if ASSERT_ENABLE
161 /*函数名:assert_failed
162  *说明:断言函数
163  *输入:
164  *输出:打印出错的位置
165  *返回:
166  *调用:
167  *其它:
168  */
169 void assert_failed(mathUint_8* file, mathUint_32 line)
170 {
171     printf("Assert Error in File: %s \r\nLine: %d \r\n",file,line);
172 }
173
174 #endif

ComplexCalculation.c

 1 #include "ComplexCalculation.h"
 2 #include "stdio.h"
 3
 4 int main(void)
 5 {
 6     complexType a,b,c;
 7     a.Imag = 0.5;
 8     a.Real = 2.5;
 9     b.Real = 1;
10     b.Imag = -5;
11
12     c = complexAdd(a,b);
13     printf("complexAdd: c.Real %f, c.Imag %f \r\n",c.Real,c.Imag);
14     c = complexSubtract(a,b);
15     printf("complexSubtract: c.Real %f, c.Imag %f \r\n",c.Real,c.Imag);
16     c = complexMultiply(a,b);
17     printf("complexMultiply: c.Real %f, c.Imag %f \r\n",c.Real,c.Imag);
18     c = complexDivision(a,b);
19     printf("complexDivision: c.Real %f, c.Imag %f \r\n",c.Real,c.Imag);
20     printf("Abs(c): %f\r\n",complexAbs(a));
21     printf("Angle(c): %f\r\n",complexAngle(a));
22     c = complexByAbsAngle(complexAbs(a),complexAngle(a));
23     printf("complexByAbsAngle: a.Real %f, a.Imag %f \r\n",c.Real,c.Imag);
24
25     while(1);
26 }

main.c

下面是运行结果,在VS2012上运行的。

欢迎一起交流!

后面博客中我会写一些数字信号处理运算的C语言实现。

时间: 2024-10-10 13:50:12

一些复数运算的C语言实现的相关文章

C语言中复数运算及调用blas,lapack中复数函数进行科学计算

C语言中常用的数据类型主要int, float ,double ,char 等,但在科学运算中复数扮演着重要角色.这里讲下C语言中的复数运算以及如何调用blas,lapack库中的复数函数来进行科学计算. 1.C语言中的复数运算. C语言中若要用的复数,需要包含头文件complex.h,下面看看一些基本的例子 #include <stdio.h> #include"complex.h" int main() { complex a, b, c, d, f; a = 1 +

C++复数运算 重载

近期整理下很久前写的程序,这里就把它放在博文中了,有些比较简单,但是很有学习价值. 下面就是自己很久前实现的复数重载代码,这里没有考虑特殊情况,像除法中,分母不为零情况. #include <iostream> /* #include <conio.h> #include<stdio.h> #include<iomanip> #include<string> #include<sstream> */ using namespace s

复数运算

#include<iostream> #include<cmath> using namespace std; struct node { int shi; int xu; int data; }; int main() { int shinum=0; int xunum=0; int n; cin>>n; node*num=new node[n]; char*a=new char[n-1]; for(int i=0;i<n-1;i++) { cin>>

Python 基础学习之: Python math 模块、cmath 模块 区别是 cmath 模块运算的是复数,math 模块运算的是数学运算 Python数学函数列表及解释 Python math 模块提供了许多对浮点数的数学运算函数。 Python cmath 模块包含了一些用于复数运算的函数

Python math 模块.cmath 模块 Python 中数学运算常用的函数基本都在 math 模块.cmath 模块中. Python math 模块提供了许多对浮点数的数学运算函数. Python cmath 模块包含了一些用于复数运算的函数. cmath 模块的函数跟 math 模块函数基本一致,区别是 cmath 模块运算的是复数,math 模块运算的是数学运算. 要使用 math 或 cmath 函数必须先导入: import math 查看 math 查看包中的内容: impo

c++实现复数运算(运算符重载)

#include <iostream> using namespace std; class Complex { public: //构造函数 Complex(int real=2,int image=4) :_real(real) ,_image(image) { cout<<"构造函数"<<endl; } //拷贝构造函数 Complex(Complex& c) { cout<<"拷贝构造函数"<&l

用C#实现复数运算

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sample_01_CA { public class Complex { //定义复试的实部和虚部 private int integer; private int fraction; //构造函数 public Complex(int integer,int fraction) { this.integ

通过运算符重载实现复数运算

#include<iostream> using namespace std; class Complex { public: // 带缺省值的构造函数 Complex(double real = 0, double image = 0) { cout << "带缺省值的构造函数" << endl; _real = real; _image = image; } // 析构函数 ~Complex() { cout << "析构函

矩阵的运算:Python语言实现

一.矩阵的加减法 import numpy as np #这里是矩阵的加法 ar1=np.arange(10).reshape(10,1) ar1 ar2=np.arange(10).reshape(10,1) print(ar1) print('\n') print(ar2) ar1+ar2 输出: [[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]] [[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]] Out[8]: array(

c语言中无符号和有符号之间的运算

关于计算机中有符号,无符号数值的表示以及它们之间的运算 是基本知识,但工作这么多年也不敢说完全搞明白透彻. 这几天在将知识点进行了一些梳理,并做了一些有意思的试验. 计算机中,数值的表示和运算都是用补码表示的. 正数的补码就是其本身: 负数的补码则是最高符号位为1,其余位取反加1. 比如-5表示为0xFFFB, 而5则表示为0x0005. 这里,第一个需要注意的问题就是 有符号数和无符号数之间的运算. c语言规定,先一律转成无符号数,然后再进行运算. 比如,  int iValue1 = -5;