放大时的双精度问题
作者:互联网
我有这种算法来计算点(x0,y0)的mandelbrot值(我认为x0和y0介于-1和1之间,不是很重要).当比例尺不会变得太大时,一切都会很好,但是在比例尺值较高时,返回的值将非常不准确,并且我的图形输出开始变得怪异.我如何根据规模的价值进行预测?
public static byte CalculateMandelbrot(double x0, double y0,double scale)
{
x0 /= scale;
y0 /= scale;
double y = 0;
double x = 0;
byte i = 0;
while (x * x + y * y < 4)
{
double tx = x;
x = x * x - y * y + x0;
y = 2 * tx * y + y0;
i++;
if (i == 0xFF) break;
}
return i;
}
解决方法:
双精度具有53位精度.这总计约16位小数.
如果将分形放大10 ^ 13倍,并制作1000×1000像素的图片,则精度大约与屏幕分辨率相同:双倍的最小更改是在屏幕上移动一个像素.
但是在那之前您会遇到麻烦,因为您对同一个数字迭代mandelbrot公式一百次.每次计算都会增加大约1/10 ^ 16的舍入误差(可能是多个).可以(尽管很乏味)进行预测.
FPU内部具有比标准double高的位数,这将减少上述影响.
标签:double-precision,c 来源: https://codeday.me/bug/20191031/1979130.html