如果我有(1 + i)^ 2,答案应该是2i
但如果我这样做
std::complex<double> i = sqrt(1), one = 1;
cout << pow(one+i,2) << endl;
输出(4,0)
答案 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的平方根。