仅打印时值是否为圆形?

时间:2013-07-02 09:31:13

标签: c floating-point printf

对不好的问题感到抱歉,但我认为我对某些变量的舍入有问题。

在我的C应用程序中,我必须计算消耗的能量和传感器节点的剩余能量。这是每10秒计算一次,如下所示:

cycle_energy = (some long mathematical computation)

energy_spent += cycle_energy;
remaining_energy -= cycle_energy;

在应用程序开始时,两个数量初始化为:

static float energy_spent = 0;
static float remaining_energy = 1000000;

然后每隔10秒打印两个值。由于我使用的gcc支持浮点数用于计算但不支持​​打印,我将这两个数量转换为无符号长整数。

printf("Energy spent: %lu \n", (uint32_t) energy_spent);
printf("Remaining energy: %lu \n", (uint32_t) remaining_energy);

问题在于,在应用程序结束时,数量1000000 - energy_spent应该与计算它们的方式相等remaining_energy

然而,在我的申请中并非如此。数量1000000 - energy_spentremaining_energy在开始时非常相似,但它们的差异会随着时间的推移而增加。

例如,在应用程序结束时,在案例energy_spent = 207223remaining_energy = 792093中,在另一个energy_spent = 215695remaining_energy = 783828中。

我认为唯一的问题在于我打印值时,但是我只是在打印值时它们不会被舍入。

提前感谢。

2 个答案:

答案 0 :(得分:1)

你只是在经历浮动漂移 - 这绝对不是不寻常的!

规范的方式是

static float energy_spent = 0;
static float total_energy = 1000000;
remaining_energy = 1000000;

然后

energy_spent += cycle_energy;
remaining_energy = total_energy - energy_spent;

答案 1 :(得分:0)

你的问题在于浮动类型本身。它没有足够的有效位来存储您的值。

请参阅此主题:Number of significant digits for a floating point type