我有这个算法计算一个点(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;
}
答案 0 :(得分:4)
双精度具有53位精度。这相当于大约16位小数。
如果您将分形放大10 ^ 13倍,并生成1000x1000像素的图片,则精度与屏幕分辨率大致相同:双精度中可能的最小变化是屏幕上一个像素的一步。
但在此之前你会遇到麻烦,因为你在同一个数字上迭代迭代mandelbrot公式一百次。每次计算都会增加约1/10 ^ 16的舍入误差(可能是多个)。有可能(虽然单调乏味)预测何时这是显而易见的。
FPU内部具有比标准双倍更高的位数,这将减少上述效果。
答案 1 :(得分:0)
这是经典&#34;十进制vs双&#34;陷阱。 尝试使用&#39;十进制&#39;对于所有变量,看它是否点击。
来自C# Reference页面:
与浮点类型相比,十进制类型更大 精度和较小的范围
还有像BigFloat Class这样的任意精确实现。