C ++复数乘法

时间:2014-05-30 00:31:51

标签: c++ complex-numbers

如果我有(1 + i)^ 2,答案应该是2i

但如果我这样做

std::complex<double> i = sqrt(1), one = 1;
cout << pow(one+i,2) << endl;

输出(4,0)

2 个答案:

答案 0 :(得分:4)

您正在将i初始化为sqrt(1),而您可能会考虑sqrt(-1)。 因此,它将被评估为double表达式(在将-1转换为double作为最接近的匹配sqrt之后,请参阅Mike对完整序列的评论),根据{{3为负参数生成域错误。

相反,您可以将i初始化为:

std::complex<double> i(0,1);

或者你可以使用复数作为sqrt的参数,如cplusplus.com中所述,或者作为评论中指出的Potatoswatter可以使用1.i和C ++ 14(如果有的话)支持this answer)的编译器和标准库。

答案 1 :(得分:1)

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根据C99§7.12.1/ 2获取值EDOM是实现定义的“。为避免这种情况,您可以确保将-1转换为complex<double>类型的参数,例如:

sqrt( complex<double>( -1 ) )

使用我尝试的编译器产生与编写

相同的结果
complex<double>( 0, 1 )

表示数学 i ,-1的平方根。

相关问题