我在 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
有人可以告诉我一个打印警告的案例,最重要的是,为什么。
最佳答案
该函数在编写时考虑了一定范围的输入数据。如果未满足该输入数据期望,则会打印警告:
#include <stdio.h>
#define COUNT_OF(x) (sizeof(x)/sizeof(0[(x)]))
void computeGold( float* reference, float* idata, const unsigned int len)
{
double total_sum = 0;
unsigned int i;
reference[0] = 0;
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
float data[] = {
1.0,
2.0,
3.0,
4.0,
5.0
};
float data2[] = {
123456.0,
999999.0,
999999.0,
999999.0,
999999.0,
999999.0,
999999.0,
999999.0,
999999.0,
999999.0,
999999.0,
999999.0,
999999.0,
999999.0,
999999.0,
999999.0,
999999.0,
999999.0,
123456.0
};
float ref[COUNT_OF(data2)] = {0.0};
int main()
{
computeGold( ref, data, COUNT_OF(data));
computeGold( ref, data2, COUNT_OF(data2));
return 0;
}
关于c - 浮点精度的细微差别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3048043/