C# 高精度浮点计算
我想找到一种在计算着色器中使用多个浮点数来表示单个数字进行更高精度计算的方法 我的目标是一个mandelbrot渲染器,在这里,您可以比通常的浮点精度更深入地进行缩放。性能不是很重要,因为它只会计算一次并存储在纹理中 我正在用C#测试算法。到目前为止,我成功地添加了两个足够精确的数字:C# 高精度浮点计算,c#,unity3d,floating-point,shader,compute-shader,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
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
(我也愿意使用其他方法获得曼德尔布罗特集的高倍图像。)
提前谢谢
double
只是一个更大的float
位。它们都是浮点数。奇怪的是,为什么要将此限制为仅浮点值?@Zer0我认为计算着色器不支持双精度类型。将数字定义为double只是为了测试结果是否匹配。计算着色器确实支持双精度浮点,具体取决于API和硬件。这就是我问的原因。例如,它支持这一点。你能用你正在使用的API来标记这个问题吗?@Zer0哦,很抱歉:)是的,使用双打会更聪明。你知道Unity的着色器是否支持双精度吗?我主要使用DirectX、OpenGL和OpenCL。不是一个团结的专家。也许其他人可以帮助回答这个问题,或者如何有效地获得双精度。Unity不是图形API,它是一个引擎。double
只是一个更大的float
位。它们都是浮点数。奇怪的是,为什么要将此限制为仅浮点值?@Zer0我认为计算着色器不支持双精度类型。将数字定义为double只是为了测试结果是否匹配。计算着色器确实支持双精度浮点,具体取决于API和硬件。这就是我问的原因。例如,它支持这一点。你能用你正在使用的API来标记这个问题吗?@Zer0哦,很抱歉:)是的,使用双打会更聪明。你知道Unity的着色器是否支持双精度吗?我主要使用DirectX、OpenGL和OpenCL。不是一个团结的专家。也许其他人可以帮助回答这个问题,或者如何有效地获得双精度。Unity不是图形API,它是一个引擎。