第 14 章 使用复数运算库

复数是由实部和虚部组成的数。例如:

3.2 + 4i 1 + 3i 1 + 2.3i

在特例情况下,如 0 + 3i 是纯虚数,通常写为 3i;5 + 0i 是纯实数,通常写为 5。可以使用 complex 数据类型来表示复数。

注 –

复数运算库 (libcomplex) 仅可用于兼容模式 ( -compat[ =4])。在标准模式(缺省模式)下,C++ 标准库 libCstd 附带具有类似功能的复数类。

14.1 复数库

复数运算库以新的数据类型实现复数数据类型,并提供:

运算符

数学库函数(为内建数字类型定义)

扩展(用于允许复数输入和输出的 iostream)

错误处理机制

复数也可表示为绝对值(或幅度)和参数(或角度)。该库提供了在实部虚部(笛卡尔)表示形式和幅度角度(极)表示形式之间进行转换的函数。

数字复共轭的虚部中有相反符号。

14.1.1 使用复数库

要使用复数库,应在程序中包含头文件 complex.h,并使用 -library=complex 选项进行编译和链接。

14.2 complex 类型

复数运算库定义了一个类:complex 类。complex 类的对象可以存放一个复数。复数由两部分构成:

实部

虚部

class complex {

double re, im;

};

complex 类的对象值是一对 double 值。第一个值表示实部,第二个值表示虚部。

14.2.1 complex 类的构造函数

有两个用于 complex 的构造函数。它们的定义是:

complex::complex() {re=0.0; im=0.0;}

complex::complex(double r, double i = 0.0) {re=r; im=i;}

如果声明复数变量时没有指定参数,则会使用第一个构造函数并初始化变量,因此两个部分都为 0。以下示例创建了一个其实部和虚部均为 0 的复数变量。

complex aComp;

您可以给定一个或两个参数。无论是以上哪种情况,都将使用第二个构造函数。如果只给定一个参数,该参数将作为实部的值,而虚部的值设置为 0。例如:

complex aComp(4.533);

用下列值创建一个复数变量:

4.533 + 0i

如果给定了两个值,第一个值被视为实部的值,而第二个值被视为虚部的值。例如:

complex aComp(8.999, 2.333);

用下列值创建一个复数变量:

8.999 + 2.333i

也可以使用复数运算库中提供的 polar 函数(请参见14.3 数学函数)创建复数。polar 函数根据给定的极坐标幅度和角度创建复数值。

没有用于 complex 类型的析构函数。

14.2.2 算术运算符

复数运算库定义了所有基本的算术运算符。具体来说,以下运算符按一般方法和普通的优先级工作:

+ - / * =

减法运算符 (-) 具有其通常的二元和一元含义。

此外,您可以按通常的方法使用以下运算符:

加法赋值运算符 (+=)

减法赋值运算符 (-=)

乘法赋值运算符 (*=)

除法赋值运算符 (/=)

但是,若将以上四个运算符用于表达式,则不产生任何值。例如,下列表达式无法进行运算:

complex a, b;

...

if ((a+=2)==0) {...}; // illegal

b = a *= b; // illegal

另外还可以使用等号 (==) 和不等号 (!=),它们具有常规含义。

将运算表达式中的实数和复数混合时,C++ 使用复数运算符函数并将实数转换为复数。

14.3 数学函数

复数运算库提供了许多数学函数。一些是专用于复数的,而其余的则是标准 C 数学库中函数的复数版本。

全部这些函数为每个可能的参数产生结果。如果函数无法生成具有数学意义的结果,它就调用 complex_error 并返回适用的某值。具体来说,这些函数会尽量避免实际的溢出,而是调用 complex_error 并显示消息。下表描述了复数运算库函数的提示。

注 –

sqrt 和 atan2 函数的实现遵循 C99 csqrt 附录 G 规范。

表 14–1 复数运算库函数复数运算库函数说明

double abs(const complex)返回复数的幅度。

double arg(const complex)返回复数的角度。

complex conj(const complex)返回其参数的复共轭。

double imag(const complex&)返回复数的虚部。

double norm(const complex)返回其参数幅度的平方。比 abs 快,但较易产生溢出。用于比较幅度。

complex polar(double mag, double ang=0.0)执行一对表示复数幅度和角度的极坐标,并返回对应的复数。

double real(const complex&)返回复数的实部。

表 14–2 复数数学函数和三角函数复数运算库函数说明

complex acos(const complex)返回余弦为其参数的角度。

complex asin(const complex)返回正弦为其参数的角度。

complex atan(const complex)返回正切为其参数的角度。

complex cos(const complex)返回其参数的余切。

complex cosh(const complex)返回其参数的双曲余弦。

complex exp(const complex)计算 e**x,其中 e 为自然对数的基数,x 是为 exp 提供的参数。

complex log(const complex)返回其参数的自然对数。

complex log10(const complex)返回其参数的常用对数。

complex pow(double b, const complex exp)

complex pow(const complex b, int exp)

complex pow(const complex b, double exp)

complex pow(const complex b, const

complex exp)使用两个参数:pow(b, exp).它计算出 b 的 exp 次幂。

complex sin(const complex)返回其参数的正弦。

complex sinh(const complex)返回其参数的双曲正弦。

complex sqrt(const complex)返回其参数的平方根。

complex tan(const complex)返回其参数的正切。

complex tanh(const complex)返回其参数的双曲正切。

14.4 错误处理

复数库具有以下用于错误处理的定义:

extern int errno;

class c_exception {...};

int complex_error(c_exception&);

外部变量 errno 是来自 C 库的全局错误状态。errno 可以为标准头文件 errno.h 中所列值(请参见 perror(3) 手册页)。没有任何函数会将 errno 设置为零,但有许多函数会将它设置为其他值。

要分辨特定运算是否失败:

在运算前将 errno 设置为零。

测试运算。

函数 complex_error 采用对类型 c_exception 的引用并由下列复数运算库函数调用:

exp

log

log10

sinh

cosh

缺省版本的 complex_error 返回零。这个零值的返回意味着发生了缺省的错误处理。可以提供自己的替换函数 complex_error,以执行其他错误处理。cplxerr(3CC4) 手册页中介绍了错误处理。

cplxtrig(3CC4) 和 cplxexp(3CC4) 手册页中介绍了缺省的错误处理,下表中也进行了简要介绍。

复数运算库函数缺省错误处理汇总

exp如果产生溢出,将 errno 设置为 ERANGE,并返回一个极大的复数。

log、log10如果参数为零,将 errno 设置为 EDOM,并返回一个极大的复数。

sinh、cosh如果参数的虚部产生溢出,则返回一个零复数。如果实部产生溢出,则返回一个极大的复数。无论是以上哪种情况,都将 errno 设置为 ERANGE。

14.5 输入和输出

复数运算库提供了用于复数的缺省提取器和插入器,如以下示例所示:

ostream& operator<

istream& operator>>(istream&, complex&); //extractor

对于输入,复数提取器 >> 从输入流中提取一对数(用圆括号括住,并由逗号分隔开),并将其读入复数对象。第一个值被视为实部的值,而第二个值被视为虚部的值。例如,给定声明和输入语句:

complex x;

cin >> x;

以及输入 (3.45, 5),则 x 值等于 3.45 + 5.0i。对插入器来讲反向为真。如果给定 complex x(3.45, 5),cout<

输入通常由括号中的一对数值(由逗号分隔)组成,也可选择空格。如果您提供一个单一数值(具有或不具有括号和空格),那么提取器会将数值的虚部设置为零。不要将符号 i 包括在输入文本中。

插入器会插入括号中实部和虚部的值(由逗号分隔)。它不包括符号 i。这两个值都视为 double。

14.6 混合模式运算

类型 complex 专门用于处理混合模式表达式中的内置运算类型。运算类型会缺省转换为 complex 类型,而且算术运算符和大多数数学函数都有 complex 版本。例如:

int i, j;

double x, y;

complex a, b;

a = sin((b+i)/y) + x/j;

表达式 b+i 是混合模式。整数 i 通过构造函数 complex::complex(double,double=0) 转换为类型 complex(整型数先是转换为类型 double)。所得结果除以 double 类型的 y,因此 y 也转换为 complex 且使用了复数除法运算。这样,得到的商是 complex 类型,因此调用复数正弦例程,从而生成另一个 complex 结果等。

但是,并非所有的数学运算符和转换都是暗示的(即使定义)。例如从数学角度,复数未较好排序,只能比较等式。

complex a, b;

a == b; // OK

a != b; // OK

a < b; // error: operator < cannot be applied to type complex

a >= b; // error: operator >= cannot be applied to type complex

同样,由于未明确定义概念,因此不会自动将类型 complex 转换为其他类型。您可以指定是否需要实部、虚部或幅度。

complex a;

double f(double);

f(abs(a)); // OK

f(a); // error: no match for f(complex)

14.7 效率

设计 complex 类主要为了提高效率。

最简单的函数声明为 inline,以消除函数调用开销。

在函数不同时就会提供函数的多个开销版本。例如,pow 函数有多个版本,分别取类型为 double 和 int 以及 complex 的指数,而前者的运算简单得多。

在包含 complex.h 时,会自动包含标准 C 数学库头文件 math.h。然后 C++ 开销规则就会产生类似于下面的表达式效率评估:

double x;

complex x = sqrt(x);

在此示例中,调用了标准数学函数 sqrt(double),且结果转换为 complex 类型,而不是先转换为 complex 类型再调用 sqrt(complex)。该结果转向重载决策规则的外部,正好是您所希望的结果。

14.8 复数手册页

复数运算库的剩余文档由下表所列的手册页组成:

表 14–3 有关 complex 类型的手册页手册页概述

cplx.intro(3CC4)对复数运算库的一般性介绍

cartpol(3CC4)笛卡尔函数和极函数

cplxerr(3CC4)错误处理函数

cplxexp(3CC4)指数、对数和平方根函数

cplxops(3CC4)算术运算符函数

cplxtrig(3CC4)三角函数

oracle 判断是否复数,第 14 章 使用复数运算库相关推荐

  1. oracle日期虚数0去掉,第 14 章 使用复数运算库

    第 14 章 使用复数运算库 复数是由实部和虚部组成的数.例如: 3.2 + 4i 1 + 3i 1 + 2.3i 在特例情况下,如 0 + 3i 是纯虚数,通常写为 3i:5 + 0i 是纯实数,通 ...

  2. 【书评:Oracle查询优化改写】第14章 结尾章

    [书评:Oracle查询优化改写]第14章 结尾章 一.1  相关参考文章链接 前13章的链接参考相关连接: [书评:Oracle查询优化改写]第一章 http://blog.itpub.net/26 ...

  3. oracle dba 培训教程 第14章 管理权限

    Oracle数据库管理系统的权限分类 系统权限,对象权限 什么是系统权限 访问数据库的权力,使用户在数据库中能够执行一些特定的操作 什么是对象权限 维护数据库中的对象的权力,使用户能够访问和维护某一特 ...

  4. Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理

    Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...

  5. 《C Primer Plus》学习笔记—第14章

    目录 <C Primer Plus>学习笔记 第14章 结构和其他数据形式 1.示例问题:创建图书目录 1.程序book.c 2.建立结构声明 3.定义结构变量 1.初始化结构 2.访问结 ...

  6. 【机器学习实战】第14章 利用SVD简化数据

    第14章 利用SVD简化数据 SVD 概述 奇异值分解(SVD, Singular Value Decomposition):提取信息的一种方法,可以把 SVD 看成是从噪声数据中抽取相关特征.从生物 ...

  7. Machine Learning Yearning book draft - 读记(前14章)

    本篇文章由作者授权转载,转自知乎. 首先,非常感谢Andrew NG对于本书<Machine Learning Yearning>的贡献,本书总共大概50多章,昨天收到了1-12章(1-2 ...

  8. mysql 导入百万级数据 几种 java_Java 修行第034天--执行计划及其使用--Oracle数据导入导出--第三章MySQL使用...

    执行计划中牢记几句话: -- 尽量避免是*代替所有列,编写查询语句时使用具体列名代替*,可以防止全表扫描 -- 尽可能少的使用like关键字进行模糊查询 -- 建立适当的索引可以提高查询效率 十三. ...

  9. 第14章:傅里叶变换

    第14章:傅里叶变换 一.理论基础: 二.Numpy实现傅里叶变换: 1. 实现傅里叶变换: 2. 逆傅里叶变换: 3. 高通滤波示例: 三.OpenCV实现傅里叶变换: 1. 实现傅里叶变换: 2. ...

  10. 读书笔记_代码大全_第14章_组织直线型代码_第15章_使用条件语句

    组织直线型代码 + 使用条件语句 希望我的读书笔试能带你翻过18页的书 http://www.cnblogs.com/jerry19880126/ <代码大全>第14章和第15章的内容比较 ...

最新文章

  1. C语言-转义字符注意事项
  2. 部署虚拟服务器,把网站部署到虚拟服务器
  3. Asp.Net Core中利用Seq组件展示结构化日志功能
  4. 显微镜下的大明内容_平凡故事展现炮火下人性光辉,李少红《解放·终局营救》创作全解...
  5. 必须收藏:20个开发技巧教你开发高性能计算代码
  6. 基于Spring Security的认证方式_编程理解PasswordEncoder工作原理_Spring Security OAuth2.0认证授权---springcloud工作笔记125
  7. ROS学习笔记(一)——软件版本的选择
  8. android进程间传递文件描述符原理
  9. Hyperledger Fabric教程(12)--链码chaincode样例
  10. linux使用flock文件锁解决crontab冲突问题
  11. 【运维】从实战掌握自动化运维工具Ansible
  12. 开源加速器Gemmini代码解析(一):脉动阵列
  13. 群体智能优化算法之总结
  14. 蓝桥杯算法训练超全习题题解——ALGO-3.K好数**
  15. 如何将自己的win7电脑变身WiFi无线网络热点
  16. 程序员进阶架构师、技术总监、CTO,需要掌握哪些核心技能
  17. xp找不到局域网内其它计算机,在W10局域网内找不到其它共享电脑的解决方案
  18. 王春亮推拿正骨与按摩心理学高级师传培训班
  19. SQL 语句多表联查
  20. python 模拟键盘自动打字敲英语文章

热门文章

  1. 【企业】掌握理查德·费曼学习法,提高学习效率
  2. 【Get深一度】信号处理(三)——3db带宽
  3. 计算机主机异常经常蓝屏,电脑频繁蓝屏怎么办
  4. 寻找生态位置,中小险企破局生态建设——保险生态建设...
  5. templates模板文件
  6. java 验证码 延迟_通过java短信接口发送短信验证码有哪些限制
  7. 计算机搜索不到网络扫描仪,电脑打印机怎么找不到扫描
  8. Word如何插入图片
  9. key位置 win10生成的ssh_Win10系统中生成SSH密钥的方法
  10. 开源流媒体SRS结合硬件视频实时转码服务器的部署