我在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)
有人可以告诉我一个会打印警告的情况,最重要的是,为什么.
通常,您不能将许多浮点数相加.
最终,总和变得与每个新添加的数字不同,因此精度会丢失.例如,在浮动的情况下,添加一百万个相同数量级的数字会产生与一千万个相同的结果,因为到它完成时,每添加一个新数字都不会改变任何东西.
围绕此算法的算法涉及每增加一个数字的几次乘法(实际上,只是为了正确地对数字求和).是的,浮点很棘手.
见http://floating-point-gui.de/