对不好的问题感到抱歉,但我认为我对某些变量的舍入有问题。
在我的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_spent
和remaining_energy
在开始时非常相似,但它们的差异会随着时间的推移而增加。
例如,在应用程序结束时,在案例energy_spent = 207223
和remaining_energy = 792093
中,在另一个energy_spent = 215695
和remaining_energy = 783828
中。
我认为唯一的问题在于我打印值时,但是我只是在打印值时它们不会被舍入。
提前感谢。
答案 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。