Mandelbrot集中的形状

Wea*_*ane 5 floating-point x86 assembly rounding mandelbrot

有趣的Mandelbrot Set箍和卷发器是否是浮点计算结果不准确的结果?

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

我已经看到了这个问题,这表明每个芽在数学上都是光滑的形状,周围有较小的芽。

海马形状之类的游行是否是计算机浮点算术限制的副作用,而不是实际的Mandelbrot集的副作用?

海马?由Spektre添加:

海马?


编辑:按照@ JL2210提供的赏金。

我一直想说的是,浮点算术,无论是定点还是固定有效,都无法保持迭代步骤的真实结果。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;
}
Run Code Online (Sandbox Code Playgroud)

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

我也问上StackExchange数学问题在这里

小智 7

在Mandelbrot集中看到的冰壶,海马形状和芽以及所有其他令人惊奇的事物是真实的,而不是计算取整的结果。实际上,计算中的有效数字越多-舍入误差越小-计算出的形状越复杂。个人警告:Mandelbrot集的编码可能会令人上瘾!

  • 这个问题没有引起很大的兴趣。我接受您的回答,尽管我并不完全相信,经过多次迭代,该算术并不会获得越来越大的误差,然后会以产生模式的方式满足终止条件。有一天,我将在一个很小的区域上进行定点算术测试,该区域相当浅,在每次迭代中扩展了位存​​储的数量(也许在磁盘上),以免失去任何意义。定点是好的,因为这些值始终在±4的范围内。 (4认同)