3

我有这个算法可以计算点 (x0,y0) 的 mandelbrot 值(我认为 x0 和 y0 介于 -1 和 1 之间,不是很重要)。scale当不是太大时,这一切都很顺利,但是在较高的值时scale,返回的值非常不准确,我的图形输出开始变得怪异。我如何预测scale会发生什么价值?

    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;
    }
4

2 回答 2

4

双精度数为 53 位。这相当于大约 16 位小数。

如果将分形放大 10^13 倍,并制作 1000x1000 像素的图片,则精度与屏幕分辨率大致相同:双精度可能的最小变化是屏幕上一个像素的步长。

但在那之前你会遇到麻烦,因为你在同一个数字上迭代了 mandelbrot 公式一百次。每次计算都会增加大约 1/10^16 的舍入误差(可能是多个)。有可能(尽管很乏味)预测何时会引起注意。

FPU 内部具有比标准双精度更高的位数,这将减少上述影响。

于 2012-09-16T20:05:02.937 回答
0

这是经典的“十进制与双倍”陷阱。尝试对所有变量使用“十进制”,看看它是否点击。

C# 参考页面:

与浮点类型相比,十进制类型的精度更高,范围更小

还有像BigFloat Class这样的任意精度实现。

于 2012-09-16T19:44:25.317 回答