放大时出现双精度问题

时间:2012-09-16 19:15:57

标签: c# double-precision

我有这个算法计算一个点(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;
    }

2 个答案:

答案 0 :(得分:4)

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

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

但在此之前你会遇到麻烦,因为你在同一个数字上迭代迭代mandelbrot公式一百次。每次计算都会增加约1/10 ^ 16的舍入误差(可能是多个)。有可能(虽然单调乏味)预测何时这是显而易见的。

FPU内部具有比标准双倍更高的位数,这将减少上述效果。

答案 1 :(得分:0)

这是经典&#34;十进制vs双&#34;陷阱。 尝试使用&#39;十进制&#39;对于所有变量,看它是否点击。

来自C# Reference页面:

  

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

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