Разделить комплексные числа - условия - PullRequest
0 голосов
/ 18 июня 2020

У меня вопрос. Я написал оператор на 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.real y.real + y.imag y. воображ) ???

Ответы [ 2 ]

3 голосов
/ 18 июня 2020

Есть ли ситуация, когда мы не можем разделить комплексные числа?

Если вы go вместо того, чтобы создать свой собственный класс для работы с комплексными числами использования std::complex, попробуйте заставить его вести себя так, как ожидал бы пользователь. То есть:

  • n/d, когда n != 0 и d == 0 дает inf, inf (или, возможно, -inf, -inf).
  • n/d, когда оба равны 0, дает nan, nan (или, возможно, -nan, -nan).

Это не связано с вопросом, но, тем не менее, связано с удобством использования и ремонтопригодностью вашего класса:

  • Подпись:

    friend const Comp operator/(const Comp& x, const Comp& y)
    

    Значение Comp, возвращаемое этой функцией, не должно быть const. Если задать const, выражение вида:

    Comp result = complex1 / complex2;
    

    будет преобразовано в copy результат, возвращаемый функцией. Оставьте const и скопируйте elision (или NRVO - Именованная оптимизация возвращаемого значения ).

  • Реализация:
    Обычно следует начинать с реализации функции-члена

    Comp& operator/=(const Comp& rhs);
    

    , которая делит *this на rhs (и возвращает *this). Тогда бесплатную функцию friend можно реализовать следующим образом:

    friend Comp operator/(const Comp& x, const Comp& y) {
        Comp temp(x); // copy construction
        temp /= y;    // operator/=
        return temp;  // NRVO
    }
    
2 голосов
/ 19 июня 2020

С математической точки зрения, вы всегда можете разделить на любое комплексное число, кроме 0.

Однако наивное выполнение математической формулы приводит к коду, который не будет работать так хорошо, как мог бы.

В вашей реализации, например, при вычислении знаменателя может произойти переполнение до бесконечности или уменьшение до 0, даже если и действительная, и мнимая части y не равны нулю и конечны.

Если ваша цель - создать код «производственного качества», вы можете поискать в Интернете «алгоритм сложного деления» или что-то подобное или взглянуть на исходники glib c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...