【发布时间】:2018-11-30 22:27:36
【问题描述】:
这里我有一个float 类型的函数sum(),它接收一个float 类型的指针t 和一个整数size。它返回数组中所有元素的总和。然后我使用该函数创建两个数组。一个在第一个索引处具有 BIG 值,在最后一个索引处具有 BIG 值。当我返回每个数组的总和时,我得到不同的结果。
这是我的代码:
#include <stdlib.h>
#include <stdio.h>
#define N 1024
#define SMALL 1.0
#define BIG 100000000.0
float sum(float* t, int size) { // here I define the function sum()
float s = 0.0;
for (int i = 0; i < size; i++) {
s += t[i];
}
return s;
}
int main() {
float tab[N];
for (int i = 0; i < N; i++) {
tab[i] = SMALL;
}
tab[0] = BIG;
float sum1 = sum(tab, N); // initialize sum1 with the big value at index 0
printf("sum1 = %f\n", sum1);
tab[0] = SMALL;
tab[N-1] = BIG;
float sum2 = sum(tab, N); // initialize sum2 with the big value at last index
printf("sum2 = %f\n", sum2);
return 0;
}
编译代码并运行后,我得到以下输出:
Sum = 100000000.000000
Sum = 100001024.000000
为什么即使数组具有相同的元素(但索引不同),我也会得到不同的结果。
【问题讨论】:
-
不要使用浮点数,因为这种数据类型的精度非常有限。使用双倍。
-
IMO How best to sum up lots of floating point numbers? 是重复的错误选择。 Is floating point math broken? 可能更接近,因为它至少试图解释为什么。
标签: c arrays floating-point