Рассмотрим следующий код, выполняющий операции над комплексными числами с помощью float
языка C/C++:
float real_part = log(3.f);
float imag_part = 0.f;
float real_part2 = (imag_part)*(imag_part)-(real_part*real_part);
float imag_part2 = (imag_part)*(real_part)+(real_part*imag_part);
Результат будет
real_part2= -1.20695 imag_part2= 0
angle= 3.14159
где angle
— фаза комплексного числа, в данном случае — pi
.
Теперь рассмотрим следующий код:
float real_part = log(3.f);
float imag_part = 0.f;
float real_part2 = (-imag_part)*(-imag_part)-(real_part)*(real_part);
float imag_part2 = (-imag_part)*(real_part)+(real_part)*(-imag_part);
Результат будет
real_part2= -1.20695 imag_part2= 0
angle= -3.14159
Мнимая часть результата равна -0
, что делает фазу результата равной -pi
.
Хотя по-прежнему выполняется с основным аргументом комплексного числа и с подписанным свойством числа с плавающей запятой 0
, это изменение представляет собой проблему при определении функций комплексных чисел. Например, если определить sqrt
комплексного числа по формуле де Муавра, это изменит знак мнимой части результата на неправильное значение.
Как бороться с этим эффектом?
float imag_part2 = (-imag_part)*(real_part) ...
есть-
. Вcomplex_number3b.y=complex_number3a.x*complex_number3a.y ...
нет-
. Это ваше намерение? - person chux - Reinstate Monica   schedule 29.10.2013imag_part
меняется в знаке в обоих случаях. При вычисленииimag_part2
я меняю знакimag_part
, как вы заметили. При вычисленииcomplex_number3b
изменение знака находится в пределахcomplex_number3a.x
, что равно-imag_part
. - person Vitality   schedule 29.10.2013…+(real_part*imag_part)
нет знака минус. - person Pascal Cuoq   schedule 29.10.2013