复数除法 - 条件
Divide complex numbers - conditions
我有一个问题。我用C++写了除复数的运算符
friend const Comp operator/(const Comp& x, const Comp& y)
{
Comp temp;
temp.real = ((x.real * y.real) + (x.imag * y.imag))/(y.real*y.real + y.imag*y.imag);
temp.imag = ((x.imag * y.real) - (x.real * y.imag))/(y.real*y.real + y.imag*y.imag);
return temp;
}
我在想一件事。有没有什么情况不能除复数?如果是的话,我可能会用std:cerr,因为正常除法分频器必须是!= 0,所以这里这部分必须是!= 0(y.realy.real + y.imagy.imag)???
Is there any situation that we can't divide complex numbers?
如果 你去创建自己的 class 来处理复数而不是使用 std::complex
,试着让它表现得像用户一样预计。即:
n/d
当 n != 0
和 d == 0
给出 inf, inf
(或者可能 -inf, -inf
)。
n/d
当两者均为 0 时给出 nan, nan
(或可能 -nan, -nan
)。
这与问题无关,但与您的 class:
的可用性和可维护性有关
签名:
friend const Comp operator/(const Comp& x, const Comp& y)
这个函数返回的值Comp
不应该是const
。使其成为 const
将强制使用如下表达式:
Comp result = complex1 / complex2;
到复制函数返回的结果。离开 const
和 copy elision(或 NRVO - Named Return Value Optimization)开始。
实现:
您通常应该从实现成员函数开始
Comp& operator/=(const Comp& rhs);
将 *this
除以 rhs
(以及 returns *this
)。免费 friend
函数可以这样实现:
friend Comp operator/(const Comp& x, const Comp& y) {
Comp temp(x); // copy construction
temp /= y; // operator/=
return temp; // NRVO
}
从数学上讲,您总是可以除以 0 以外的任何复数。
然而,天真地实现数学公式会导致代码无法正常执行。
例如,在您的实现中,即使 y 的实部和虚部都非零且有限,分母的计算可能会溢出到无穷大或下溢到 0。
如果您的目标是生成 'production quality' 代码,您可能需要在网上搜索 'complex division algorithm' 之类的内容,或者查看 glibc 源代码。
我有一个问题。我用C++写了除复数的运算符
friend const Comp operator/(const Comp& x, const Comp& y)
{
Comp temp;
temp.real = ((x.real * y.real) + (x.imag * y.imag))/(y.real*y.real + y.imag*y.imag);
temp.imag = ((x.imag * y.real) - (x.real * y.imag))/(y.real*y.real + y.imag*y.imag);
return temp;
}
我在想一件事。有没有什么情况不能除复数?如果是的话,我可能会用std:cerr,因为正常除法分频器必须是!= 0,所以这里这部分必须是!= 0(y.realy.real + y.imagy.imag)???
Is there any situation that we can't divide complex numbers?
如果 你去创建自己的 class 来处理复数而不是使用 std::complex
,试着让它表现得像用户一样预计。即:
n/d
当n != 0
和d == 0
给出inf, inf
(或者可能-inf, -inf
)。n/d
当两者均为 0 时给出nan, nan
(或可能-nan, -nan
)。
这与问题无关,但与您的 class:
的可用性和可维护性有关签名:
friend const Comp operator/(const Comp& x, const Comp& y)
这个函数返回的值
Comp
不应该是const
。使其成为const
将强制使用如下表达式:Comp result = complex1 / complex2;
到复制函数返回的结果。离开
const
和 copy elision(或 NRVO - Named Return Value Optimization)开始。实现:
您通常应该从实现成员函数开始Comp& operator/=(const Comp& rhs);
将
*this
除以rhs
(以及 returns*this
)。免费friend
函数可以这样实现:friend Comp operator/(const Comp& x, const Comp& y) { Comp temp(x); // copy construction temp /= y; // operator/= return temp; // NRVO }
从数学上讲,您总是可以除以 0 以外的任何复数。
然而,天真地实现数学公式会导致代码无法正常执行。
例如,在您的实现中,即使 y 的实部和虚部都非零且有限,分母的计算可能会溢出到无穷大或下溢到 0。
如果您的目标是生成 'production quality' 代码,您可能需要在网上搜索 'complex division algorithm' 之类的内容,或者查看 glibc 源代码。