使用float类型计算时如何提高精度?

问题描述 投票:0回答:1

我遇到了问题。代码如下:

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
。有什么方法可以尽可能避免这种精度误差吗?

cuda precision optix
1个回答
0
投票

精度问题是由于float的精度有限而产生的。为了最大限度地减少此错误,您可以使用双精度。如果可能的话,您可以使用 double 进行计算,并且仅在传输到 GPU 时转换为 float。

我也听说过 Kahan summation,但我从未真正使用过它,所以我无法告诉您这是否完全适用于您的用例。

© www.soinside.com 2019 - 2024. All rights reserved.