Самый быстрый способ найти сложные корни

#c #optimization

#c #оптимизация

Вопрос:

Используя a i b = sqrt(a*a b*b) * exp(i arctan2(a,b)) , я прихожу к следующему способу вычисления сложных корней. Однако я слышал, что тригонометрические функции скорее расходуют производительность, поэтому мне интересно, есть ли лучший способ в ванильном c (без внешних библиотек).

Пример: Пусть u iv = sqrt(a i b)

 #include <math.h>
#include <iostream>

int main(){
    double a = -1.;
    double b = 0;    

    double r = sqrt(sqrt(a*a b*b));
    double phi = 0.5 * atan2(b, a);
    double u = r * cos(phi);
    double v = r * sin(phi);

    std::cout << u << std::endl;
    std::cout << v << "i" << std::endl;
}
  

Это просто подразумевается как MWE, поэтому оно не написано в классе или методе.

Комментарии:

1. Что не так с std::sqrt(std::complex<>) ?

2. Я не знал, что это существует. На самом деле я написал свой собственный класс ComplexNumber и теперь хотел реализовать эту функцию.

3. вы не знали о std::sqrt или около std::complex ? 😉

4. Я не ожидал, что комплексные числа будут доступны в стандартной библиотеке, поэтому я не знал ни о том, ни о другом.

Ответ №1:

Да, есть! Я собираюсь привести здесь хорошее объяснение процесса, но, похоже, этого можно достичь, только вычисляя величину исходного числа и вычитая действительную часть исходного числа и, наконец, извлекая квадратный корень из этого, чтобы найти мнимую часть квадратного корня. Действительную часть можно найти, разделив мнимую часть исходного числа на 2 * мнимую часть корня, чтобы получить окончательный ответ. https://www.qc.edu.hk/math/Advanced Level/Finding the square root of a complex number.htm Дайте мне знать, если вам понадобится дополнительная помощь с кодом, но для этого не требуются тригонометрические функции.

Комментарии:

1. Ах да, это на самом деле просто. Спасибо.

2. К сожалению, эта ссылка теперь не работает.