复数除法 - 条件

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/dn != 0d == 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;
    

    复制函数返回的结果。离开 constcopy 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 源代码。