复数乘法
C++ complex number multiplication
如果我有(1+ I)^2,答案应该是2i
但是如果我做了
std::complex<double> i = sqrt(1), one = 1;
cout << pow(one+i,2) << endl;
输出(4,0)
您将i
初始化为sqrt(1)
,而您可能考虑的是sqrt(-1)
。因此,它将被计算为double
表达式(在-1被转换为double作为最接近的匹配sqrt
之后,参见Mike的完整序列注释),根据cplusplus.com,对于负参数会产生域错误。
可以初始化i
为:
std::complex<double> i(0,1);
或者您可以使用复数作为sqrt
的参数,如本答案所述,或者如Potatoswatter在注释中指出的那样,您可以在c++ 14中使用1.i
(如果您有编译器&支持标准库类型的用户定义文字的标准库,第2部分)。
c++中的math.h
头提供了以下sqrt
的重载:
auto sqrt( float arg ) -> float;
auto sqrt( double arg ) -> double;
auto sqrt( long double arg ) -> long double;
auto sqrt( Integral arg ) -> double; // C++11 and later
其中Integral
表示任意整型(这是一组重载或函数模板)。
<complex>
头文件额外定义了这个重载:
template< class T >
auto sqrt( complex<T> const& x ) -> complex<T>;
valarray
也有一个重载,但在这里不相关。
当您使用-1
作为实际参数时,如
sqrt( -1 )
直接匹配实参类型,即带Integral
实参的重载是最合适的,并且该重载返回double
。
没有办法将数学i表示为double
值。所以你得到的值是一个实现定义的值(如果你的c++实现的double
类型支持NaN, 不是一个数字,它可以是NaN);是否为整数表达式errno
获取值EDOM
是实现定义的;根据C99§7.12.1/2。为了避免这种情况,您可以确保将-1
转换为complex<double>
类型的参数,输入:
sqrt( complex<double>( -1 ) )
在编译器中,我尝试过这样做,得到的结果与写
相同complex<double>( 0, 1 )
表示数学上的i,即- 1的平方根
相关文章:
- 没有找到相关文章