浮点精度细微差别

0fn*_*fnt 3 c floating-point

我在NVIDIA的CUDA SDK示例中找到了此代码.

void computeGold( float* reference, float* idata, const unsigned int len)
{
    reference[0] = 0;
    double total_sum = 0;
    unsigned int i;
    for( i = 1; i < len; ++i)
    {
        total_sum += idata[i-1];
        reference[i] = idata[i-1] + reference[i-1];
    }
    // Here it should be okay to use != because we have integer values
    // in a range where float can be exactly represented
    if (total_sum != reference[i-1])
        printf("Warning: exceeding single-precision accuracy.  Scan will be inaccurate.\n");
}
//(C) Nvidia Corp
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我一个会打印警告的情况,最重要的是,为什么.

Pav*_*sky 5

通常,您不能将许多浮点数相加.

最终,总和变得与每个新添加的数字不同,因此精度会丢失.例如,在浮动的情况下,添加一百万个相同数量级的数字会产生与一千万个相同的结果,因为到它完成时,每添加一个新数字都不会改变任何东西.

围绕此算法的算法涉及每增加一个数字的几次乘法(实际上,只是为了正确地对数字求和).是的,浮点很棘手.

http://floating-point-gui.de/