迷人而可爱的曼德布洛集合环和卷是由浮点计算不精确导致的吗?
我编写了各种曼德布洛集合实现,例如动态缩放和回放。有些使用定点算术,有些使用FPU。
我看到了这个问题,它表明每个芽都是数学上平滑的形状,并且周围还有更小的芽。
海马形状等等的游行是否是计算机浮点算术限制的副作用,而不是真正的曼德布洛集合?
海马形状?由Spektre添加:
我一直想说的是,无论是定点还是固定精度浮点算术,都不能保留迭代步骤的真实结果。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 Mathematics上提出了这个问题here。
FLDCW
改变FPU的精度,以在24、53和64位精度之间进行切换。你可能还想在两个初始化加载后包含一个FADD ST(0),0
,以便将加载的值四舍五入,因为FLD
不受精度影响。 - 1201ProgramAlarm