复数乘法

C++ complex number multiplication

本文关键字:      更新时间:2023-10-16

如果我有(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的平方根

相关文章:
  • 没有找到相关文章