其他分享
首页 > 其他分享> > 放大时的双精度问题

放大时的双精度问题

作者:互联网

我有这种算法来计算点(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