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 集的编码会让人上瘾!
有趣可爱的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 集的编码会让人上瘾!