3

ポイント(x0、y0)のマンデルブロ値を計算するこのアルゴリズムがあります(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ピクセルの画像を作成する場合、精度は画面の解像度とほぼ同じです。ダブルで可能な最小の変化は、画面上の1ピクセルのステップです。

ただし、マンデルブロ集合を同じ数で100回繰り返すため、その前に問題が発生します。各計算では、約1/10 ^ 16の丸め誤差(おそらく複数の誤差)が追加されます。これがいつ気付くかを予測することは(退屈ですが)可能です。

FPUは内部的に標準のdoubleよりもビット数が多いため、上記の影響が少なくなります。

于 2012-09-16T20:05:02.937 に答える
0

これは、古典的な「10進数と2進数」の落とし穴です。すべての変数に「decimal」を使用してみて、クリックするかどうかを確認してください。

C#リファレンスページから:

浮動小数点型と比較して、10進型は精度が高く、範囲が狭くなります。

BigFloatクラスのような任意精度の実装もあります。

于 2012-09-16T19:44:25.317 に答える