我遇到了问题。代码如下:
float a = 2.f;
float t = 0.0000025f;
float b = a + t;
float c = b - a;
printf("b = %.8f\n", b);
printf("c = %.8f\n", c);
该程序的输出是:
b = 2.00000238
c = 0.00000238
a
,b
应存储为 float
,因为我需要将其传输到 GPU,而 OptiX 库仅接受 float
作为顶点坐标类型。然后在GPU上,我想通过c
得到精确的b - a
。
但是现在我什至无法在CPU中得到准确的结果。我想要的是
b = 2.0000025
而不是 b = 2.00000238
,这会导致我在 GPU 上得到错误的值 c = 0.00000238
。有什么方法可以尽可能避免这种精度误差吗?
精度问题是由于float的精度有限而产生的。为了最大限度地减少此错误,您可以使用双精度。如果可能的话,您可以使用 double 进行计算,并且仅在传输到 GPU 时转换为 float。
我也听说过 Kahan summation,但我从未真正使用过它,所以我无法告诉您这是否完全适用于您的用例。