乘法与双打 C++

kam*_*r83 3 c++ mandelbrot

我是 C++ 的新手,我想对其中设置的 mandelbrot 进行编码,以进行一些练习并将速度与 Python 进行比较。我用来迭代以查看复数是否达到无穷大的函数如下所示:

int iterate(double ir, double ii, int iterations){
    double sr = 0.0;
    double si = 0.0;
    unsigned int steps = 0;
    while(sr < 2.0 && sr > -2.0 && si < 2.0 && si > -2.0 && steps < iterations){
        sr = sr*sr-si*si+ir;
        si = si*sr*2 + ii;
        steps ++;
    }
    return steps;
}
Run Code Online (Sandbox Code Playgroud)

我将输出与我的 python 代码进行了比较,并意识到它更新虚部的行不能正常工作。*2 不能正常工作。Insted 加倍会使结果为负。例如,当我插入数字 0.2 + 1i 时,它会执行以下操作:

0.2 + 1i、-0.76 - 0.52i、0.5072 + 0.472512i、0.233984 + 1.22112i、-1.23639 - 2.01956i

它应该做的事情(我从我的 Python 程序中得到的)是:

0.2+ 1i, -0.76 + 1.4i, -1.1823999999999997 - 1.1279999999999997i, 0.3256857599999999 + 3.66749943995999

我的猜测是它写入符号而不是将尾数加倍或增加指数。我不能让它无符号,因为它也必须能够存储负值。你能为这个做什么?感谢您的 awnsers!

Pat*_*rts 6

我会像这样编写你的函数,使用std::complex

template <class T>
std::size_t iterate(std::complex<T> c, std::size_t max_iterations) {
    std::complex<T> z = 0;
    std::size_t steps = 0;

    while (std::norm(z) <= 4 && steps < max_iterations) {
        z = z * z + c;
        ++steps;
    }

    return steps;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样调用你的函数:

using std::complex_literals::operator""i;
std::complex<double> c = 0.2 + 1i; // or c(0.2, 1);
const auto steps = iterate(c, 256);
Run Code Online (Sandbox Code Playgroud)

您应该使用std::norm(z) <= 4而不是的原因std::abs(z) <= 2是因为它的计算成本较低

如果您在每次迭代后进行流式传输,您可以验证以下程序是否输出您的预期序列:zstd::cout

(0.2,1)(-0.76,1.4)(-1.1824,-1.128)(0.325686,3.66749)
Run Code Online (Sandbox Code Playgroud)