#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. К сожалению, эта ссылка теперь не работает.