assembly - 曼德尔布罗特集中的形状

标签 assembly x86 floating-point rounding mandelbrot

有趣又可爱的Mandelbrot Set环圈和 curl 是浮点计算不准确的结果吗?

我编写了各种 Mandelbrot Set 实现,例如动态缩放和播放。有些使用定点运算,有些则使用 FPU。

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

海马形状的游行等是否是计算机浮点运算局限性的副作用,而不是实际的曼德尔布罗特集?

海马?由 Spektre 添加:

Sea horse?

<小时/> 编辑:遵循提供的赏金。

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

我的问题是:算术失败是否会导致出现这些模式?据我所知,完美的曼德尔布罗特集实际上是形状光滑的花蕾排列在其他花蕾周围,无穷无尽。评论者表示,算法越好,著名的海马等形状就越好,当糟糕的实现产生模糊的图像时就可以看出这一点。但这只会强化我的问题:算术越精确,算术就越精确、越有规律地失败,直到随着坐标的变化,出现不连续性,并以稍微不同的方式进展到失败。

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

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 Mathematics here 上提出了问题.

最佳答案

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

关于assembly - 曼德尔布罗特集中的形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49762561/

相关文章:

c - 为什么 5.0/3 在 C 中是 1.666667?

c - 这个 __usercall 包装器有什么问题?

assembly - 如何修复汇编中的 "Segmentation fault (core dumped)"?

assembly - 使用 GDT 保护模式下的汇编器跳转

c++ - double 在什么时候开始失去精度?

c - 编写我自己的 float 解析器

assembly - 在没有AVX2的情况下,如何使用字节中的位设置ymm寄存器中的双字? (vmovmskps的倒数)

c - 二元炸弹第二阶段算术

java - 无法在 32 位 JVM 上加载 64 位 SWT 库(即使我下载了 32 位 SWT)

assembly - 如果 x86 jmp 跳转到其他两个连续有效地址之间的地址会发生什么?