Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Mandelbrot集合中的形状_Assembly_X86_Floating Point_Rounding_Mandelbrot - Fatal编程技术网

Assembly Mandelbrot集合中的形状

Assembly Mandelbrot集合中的形状,assembly,x86,floating-point,rounding,mandelbrot,Assembly,X86,Floating Point,Rounding,Mandelbrot,迷人可爱的Mandelbrot集箍和卷曲是浮点计算不准确的结果吗 我编写了各种Mandelbrot集实现,例如动态缩放和回放。一些使用定点算法,另一些使用FPU 我已经看到,这表明每个花蕾都是数学上平滑的形状,周围有较小的花蕾 海马形状等的游行是计算机浮点运算局限性的副作用,而不是实际的曼德布罗特集吗 海马?由Spektre添加: 编辑:根据提供的赏金 我一直想说的是,浮点运算,无论是定点运算还是固定意义运算,都不能保持迭代步骤的真实结果。Mandelbrot集有趣的部分在边界附近,在这个区

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

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

我已经看到,这表明每个花蕾都是数学上平滑的形状,周围有较小的花蕾

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

海马?由Spektre添加:


编辑:根据提供的赏金

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

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

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

intmaxrad=4;
int K_极限=5000;
双实8,IMAG8;
int迭代(void)
//计算REAL8、IMAG8的Mandelbrot迭代
//返回迭代
{
国际热核试验堆;
__asm{
菲尔德德沃德PTR最大值;最大值^2
FLD QWORD PTR IMAG8;初始Y值
FLD QWORD PTR REAL8;初始X值
FLD ST(1);工作Y=IMAG
FLD ST(1);工作X=实际值
MOV ECX,DWORD PTR K_极限
MOV BX,0100h;C0标志的遮罩
对齐4
MLOOPB:;迭代ST0 ST1 ST2 ST3 ST4 ST5 ST6 ST7
;X Y REAL IMAG 4.0
FLD ST(0);推动X Y真实图像4.0
FMUL ST(1),ST;X*X^2 Y真实图像4.0
FMUL ST,ST(2);X*Y XY X^2 Y真实图像4.0
FADD ST,ST(0);2*XY 2XY X^2 Y真实图像4.0
FADD ST,ST(4);2XY+IMAG Y'X^2 Y真实IMAG 4.0
FXCH ST(2);Y',Y X^2 Y'真实图像4.0
FMUL ST,ST(0);Y*Y Y^2 X^2 Y'真实图像4.0
FLD ST(0);推送Y^2 Y^2 Y^2 X^2 Y'真实图像4.0
FADD ST,ST(2);Y^2+X^2R^2Y^2X^2Y'真实图像4.0
FCOMP ST(6);测试和弹出Y^2 X ^2 Y'REAL IMAG 4.0
状态
FSUB;X^2-Y^2…Y'REAL IMAG 4.0
FADD ST,ST(2);X'X'Y'REAL IMAG 4.0
测试AX,BX;检查C0
LOOPNZ MLOOPB;循环IF(ITERS>0)和(半径^2<4)
清除堆栈的初始化协处理器
MOV EAX,DWORD PTR K_极限
子EAX,ECX;完成,循环向下计数
MOV DWORD PTR iters,EAX
}
返回ITER;
}
请注意,迭代循环中没有内存加载/存储操作


我还问了有关StackExchange数学的问题。

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

你能在Mandelbrot集合上发布海马形状的图片吗?在向下投票后,澄清一下:我认为不进行迭代就不可能生成Mandelbrot集合图像。我所看到的一切,比如计算点到M集的距离,都需要迭代。由于浮点运算的精度有限,且迭代次数较多,因此计算不可能精确,因此生成的图像表示有多真实?在M-集的邻域中尤其如此,其中函数值可以在逃逸之前围绕两个或多个吸引子点抖动大量迭代@ṀữŀlɪgắNậCễơưṩᛗ 我很好奇,我想我找到了一个。我在问题上添加了一个图像。在窗口的标题中还使用了坐标、缩放和最大迭代次数。。。代码和演示在这里@WeatherVane no FPU错误会自行产生像素化的工件。。。形状来自复杂的数学本身,与FPU圆角无关。使用代码测试这一点的一个相对简单的方法是使用
FLDCW
更改FPU的精度,以在24、53和64位精度之间进行更改。由于
FLD
不受精度的影响,您可能还希望在两次init加载后包含一个
FADD ST(0),0
,以获得四舍五入的加载值。这个问题没有引起太多兴趣。我接受你的答案,尽管我并不完全相信在多次迭代之后,算术不会获得越来越大的错误,然后以产生模式的方式满足终止条件。总有一天我会的
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;
}