高精度浮点计算

时间:2020-03-22 20:47:44

标签: c# unity3d floating-point shader compute-shader

我想找到一种在计算着色器中使用多个浮点数表示一个数字的方法来进行更高精度的计算。

我的目标是使用mandelbrot渲染器,在该渲染器中,您可以放大到比通常的浮动精度所允许的深度还要深。性能并不是很关键,因为它只会计算一次并存储在纹理中。

我正在测试C#中的算法。到目前为止,我设法添加了两个足够准确的数字:

double a = Math.PI * 10;
double b = Math.E * .1;
double c = a + b;

float ax = (float)a;
float ay = (float)(a - ax);
float bx = (float)b;
float by = (float)(b - bx);

float cx = ax + bx;
float cy = 0;

if (Math.Abs(ax) > Math.Abs(bx)) {
    cy = -cx + ax + bx + ay + by;
} else {
    cy = -cx + bx + ax + by + ay;
}

// cx + (double)cy = 
//     0 10000000011 1111101100000001000010110001011110001010110010100000 | 31.68775471874380
// c = 0 10000000011 1111101100000001000010110001011110001010110010101001 | 31.68775471874380

将此算法扩展为每个数字3个浮点数,即可使总和完全等于两倍值。

您能想到一种将两个数字相乘的方法吗?如果您很开心,可以除法或求逆(然后乘)。其他计算可以细分为mul和add。

(我也愿意采用其他方法来获得mandelbrot集的高缩放图像。)

谢谢!

0 个答案:

没有答案