Mandelbrot 集中的形状

Shapes in the Mandelbrot Set

有趣可爱的Mandelbrot Set hoops and curls是浮点计算不准确的结果吗?

我已经编写了各种 Mandelbrot 集实现,例如动态缩放和回放。有的用定点运算,有的用FPU。

我看到 this question 这表明每个芽都是数学上光滑的形状,周围有较小的芽。

海马形状的游行等是计算机浮点运算局限性的副作用,而不是实际的 Mandelbrot 集?

海马?由 Spektre 添加:


编辑:按照提供的赏金。

我一直想说的是,浮点运算,无论是定点还是定值,都不能保持迭代步骤的真实结果。 Mandelbrot 集的有趣部分在边界附近,在该区域中,迭代坐标可以在循环近重复中抖动数千次迭代,最终 "escaping".

我的问题是:算术失败的方式是否会导致出现模式?据我所知,完美的 Mandelbrot 集实际上是形状光滑的芽围绕其他芽排列,无穷无尽。评论者表示,算法越好,著名的海马等形状就越好,当实施不当会产生模糊的图像时可以看出这一点。但这只会加强我的问题:算术越精确,算术失败就越精确和规律,直到随着坐标的变化,出现不连续性,并以稍微不同的方式发展到失败。

无论如何,这是一个使用 x87 FPU 迭代一个点的 C 函数。代码不是最新的,并且可以通过利用正方形之间的差异来改进它,这仍然在我古老的 "to-do" 列表中。

int MAXRAD = 4;
int K_LIMIT = 5000;
double REAL8, IMAG8;

int iterate (void)
// calculate Mandelbrot iterations of REAL8, IMAG8
// return iterations
{
int iters;

    __asm {

        FILD    DWORD PTR MAXRAD       ;MAX R^2
        FLD     QWORD PTR IMAG8        ;INIT Y VALUE
        FLD     QWORD PTR REAL8        ;INIT X VALUE

        FLD     ST(1)     ;WORKING Y = IMAG
        FLD     ST(1)     ;WORKING X = REAL

        MOV     ECX,DWORD PTR K_LIMIT
        MOV     BX,0100h  ;MASK FOR C0 FLAG

        ALIGN 4
    MLOOPB:               ;ITERATE      ST0  ST1  ST2  ST3  ST4  ST5  ST6  ST7
                          ;             X    Y    REAL IMAG 4.0
        FLD     ST(0)     ;PUSH X       X    X    Y    REAL IMAG 4.0
        FMUL    ST(1),ST  ;X * X        X    X^2  Y    REAL IMAG 4.0
        FMUL    ST,ST(2)  ;X * Y        XY   X^2  Y    REAL IMAG 4.0
        FADD    ST,ST(0)  ;2 * XY       2XY  X^2  Y    REAL IMAG 4.0
        FADD    ST,ST(4)  ;2XY+IMAG     Y'   X^2  Y    REAL IMAG 4.0
        FXCH    ST(2)     ;Y', Y        Y    X^2  Y'   REAL IMAG 4.0
        FMUL    ST,ST(0)  ;Y * Y        Y^2  X^2  Y'   REAL IMAG 4.0
        FLD     ST(0)     ;PUSH Y^2     Y^2  Y^2  X^2  Y'   REAL IMAG 4.0
        FADD    ST,ST(2)  ;Y^2 + X^2    R^2  Y^2  X^2  Y'   REAL IMAG 4.0
        FCOMP   ST(6)     ;TEST & POP   Y^2  X^2  Y'   REAL IMAG 4.0
        FNSTSW  AX        ;STATUS
        FSUB              ;X^2 - Y^2    ...  Y'   REAL IMAG 4.0
        FADD    ST,ST(2)  ;X'            X'  Y'   REAL IMAG 4.0
        TEST    AX,BX     ;CHECK C0
        LOOPNZ  MLOOPB    ;LOOP IF (ITERS > 0) and (RADIUS^2 < 4)

        FNINIT            ;INIT COPROCESSOR TO CLEAR STACK

        MOV     EAX,DWORD PTR K_LIMIT
        SUB     EAX,ECX   ;DONE, LOOP WAS COUNTED DOWNWARD
        MOV     DWORD PTR iters,EAX
    }

    return iters;
}

请注意,在迭代循环中有没有 内存load/store 操作。

我也在 StackExchange Mathematics 上问过这个问题 here

您在 Mandelbrot 集中看到的花饰、海马形状和芽以及所有其他令人惊奇的东西都是真实的,而不是计算四舍五入的结果。事实上,计算中的有效数字越多 - 舍入误差越小 - 计算出的形状就越复杂。个人警告:Mandelbrot 集的编码会让人上瘾!