代码之家  ›  专栏  ›  技术社区  ›  Weather Vane

Mandelbrot集中的形状

  •  5
  • Weather Vane  · 技术社区  · 6 年前

    迷人可爱的Mandelbrot套箍和卷发是浮点计算不准确的结果吗?

    我编写了各种Mandelbrot集实现,例如动态缩放和回放。一些使用定点算法,另一些使用FPU。

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

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

    海马?Spektre增加:

    Sea horse?


    编辑:遵循提供的悬赏。

    我一直想说的是,浮点运算,无论是定点还是固定意义,都不能保持迭代步骤的真实结果。Mandelbrot集有趣的部分在边界附近,在这个区域,迭代坐标可以在循环的近重复中抖动数千次,然后最终“逃逸”。

    我的问题是:算术失败的方式是否会导致这些模式?据我所知,完美的Mandelbrot集合实际上是在其他芽周围无限排列的平滑形状的芽。评论者说,算法越好,著名的海马等形状就越好,而当一个糟糕的实现产生模糊的图像时,就可以看到这一点。但这只会强化我的问题:算法越精确,算法就越精确,越有规律地失败,直到随着坐标的变化,出现间断,并以稍微不同的方式发展到失败。

    无论如何,这里有一个C函数,它使用x87 FPU迭代一个点。代码不是最新的,可以利用方块之间的差异来改进它,这仍然在我古老的“待办事项”列表中。

    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;
    }
    

    请注意,有 迭代循环中的内存加载/存储操作。

    我还问了一个关于StackExchange数学的问题 here

    1 回复  |  直到 5 年前
        1
  •  7
  •   Jim Phillips    6 年前

    在Mandelbrot集合中看到的卷发、海马形状、芽以及所有其他令人惊奇的东西都是真实的,不是计算四舍五入的结果。事实上,计算中的数字越重要(舍入误差越小),计算出的形状就越复杂。个人警告:Mandelbrot集合的编码可能会上瘾!