12 数值
12.1 复数——<complex>
1、输入复数时,可以在括号内只写实部,也可以在括号内以逗号隔开实部和虚部。
2、复数的各种操作
(1)创建,复制和赋值
如:std::complex<double> c2(conj(c1));
(2)隐式类型转换
允许安全转换(如complex<float>转为complex<double>)可以隐式进行,而不安全的转换(如complex<long double>转为complex<double>)必须显示进行。
注意1:不能讲一个实部和虚部为整数的复数,转换为实部和虚部为float或double或long double的复数,但可以分开来当做参数。
注意2:std::complex<float> c2(std:polar(4.2, 0.75); //OK,支持complex<double>到complex<float>的显示转换。
然而std::complex<float> c2 = std:polar(4.2, 0.75); //error,因为polar()产生一个临时对象complex<double>,然而不存在complex<double>到complex<float>的隐式转换。
注意3:但是对于赋值操作符,可以任意转换(包括不安全的转换),这跟以上原则是冲突的。
(3)数值的存取
注意:返回值不是引用。
(4)比较:只存在==和!=,不存在大小(可以自行定义)。
(5)算术运算:支持四则运算,以及正负号,以及+=等。
注意:赋值操作符是改变既有complex的唯一途径。
(6)输入输出
input操作符可以接纳一下任何一种格式:(realpart, imagpart),(realpart),realpart。
(7)超越函数:如log(c)表示ln(c),sqrt(c)表示c的平方根。
12.2 valarray——<valarray>
1、valarray定义了下标操作符,所有的普通数值运算(加、减、乘、模数、反向、未操作、比较操作、逻辑操作、赋值操作)。
注意:不可以使用operator<来进行valarray的排序,因此valarray不能作为STL容器的元素。
注意:对于二元运算,操作数之一可以是某个单值。但是单值的型别必须和valarray的元素型别完全一致。如val = 4 * va2;va2只能是valarray<int>,而不能是valarray<double>。
2、valarray的子集
Slice(切割);Gerneral slice(一般化切割,多维);Masked subset(屏蔽式子集);Indirect subset(间接式子集)。
注意:将两个subset相乘,并将结果赋值给另一个subset,必须使用显示转型:
va[std::slice(0, 4, 3)] = static_cast<std::valarray<double> >(va[std::slice(1, 4, 3)]) * static_cast<std::valarray<double> >(va[std::slice(2,4,3]);其中slice的三个参数分别表示为起始索引、元素数量、元素间距(步幅)。