Я немного уменьшил масштаб, и длинные хвосты продолжают уходить в бесконечность. Поскольку все |C| > 2
должны расходиться, это позволяет легко найти конкретный случай c, который не работает, например cReal = 2; cImg = -1.5;
. Ваш код говорит, что он сходится, но выполнение этого вручную показывает, что он расходится очень быстро :
Z0 = 0 + 0i
Z1 = (0 + 0i)^2 + 2 - 1.5i = 2 - 1.5i
Z2 = 2*2 - 2*2*1.5i - 1.5^2 = 1.75 - 6i
Пошаговое выполнение кода дает zReal, zImg
-1.5, -0.25
-0.75, -0.1875
-1.21875, -0.21484375
-0.976318359375, -0.2038421630859375
-1.1019703075289726, -0.20844837254844606
[...]
Другими словами, ваш l oop неверен. Сразу подозреваемая строка кода следующая:
double temp = zReal * zReal - cIm * cIm + cReal;
Он выполняет cIm*cIm
, но не должно быть никакого умножения каких-либо компонентов C: он просто добавляется в конце.
Так случилось, что вы случайно поменяли zIm
на cIm
.
Переключите их обратно, и вы должны получить лучший результат:
double temp = zReal * zReal - zIm * zIm + cReal;