循环浮点中的总和超过允许值
Sum exceeding permissible value in looping floats
我最近创建了这个简单的程序来查找平均速度。
平均速度=Δx/Δt
我选择x作为t的函数,作为x=t^2
因此v=2t
此外,平均v=(x2 - x1) / (t2 - t1)
我选择的间隔为t=1s to 4s
。意味着x从1 to 16
因此平均v=(16 - 1) / (4 - 1)
=5
现在的程序:
#include <iostream>
using namespace std;
int main() {
float t = 1, v = 0, sum = 0, n = 0; // t = time, v = velocity, sum = Sigma v, n = Sigma 1
float avgv = 0;
while( t <= 4 ) {
v = 2*t;
sum += v;
t += 0.0001;
n++;
}
avgv = sum/n;
cout << "n----> " << avgv << " <----n";
return 0;
}
我使用时间的微小增量来计算许多时刻的速度。现在,如果t的增量为0.001,则计算出的平均值v为4.99998。
现在,如果我将t的增量设为0.0001,则平均值v变为5.00007!
进一步降低增量至0.00001产生平均v=5.000001
为什么会这样?
谢谢。
在基数2
中,0.0001
和0.001
是周期数,因此它们没有精确的表示。其中一个是向上取整,另一个是向下取整,所以当你对它们求和时,你会得到不同的值。
这与十进制表示中发生的情况相同,如果您选择相应的数字进行求和(假设每个变量可以包含3个十进制数字(。比较:
a = 1 / 3; // a becomes 0.333
b = a * 6; // b becomes 1.998
带有:
a = 2 / 3; // a becomes 0.667
b = a * 3; // b becomes 2.001
两者(理论上(都应该得到2
,但由于舍入误差,它们给出了不同的结果
在十进制中,由于10
被分解为素数2
和5
,因此只有分母只能被2
和5
整除的分数才能用有限数量的十进制数字表示(所有其他分数都是周期性的(,因此在基数为2的情况下,只有分母为2的幂的分数才能精确地表示。尝试使用1.0/512.0
和1.0/1024.0
作为循环中的步骤。此外,请小心,因为如果您选择的步长太小,则可能没有足够的数字来表示float
数据类型中的步长(即使用double
s(
相关文章:
- 为什么我无法更改"set<set>"循环中的值<int>
- C++程序在循环后给出奇怪的int值
- 如何在for循环中包含两个索引值的测试条件
- 为什么我的程序在for循环中k=0时返回垃圾值
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 如何使用 do while 循环确定最高值和最低值
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 使用一个 for 循环如何迭代和测试迭代器值?
- while 循环不以哨兵值终止
- C++ - 使用基于范围的 for 循环将字符值分配给向量中的字符串不会分配值
- 超出 int 的值范围后的无限循环
- 如何在 for 循环中的特定时间内获取要打印的额外值
- 布尔值向量的基于范围 for 循环
- C++ Code 在 for 循环期间不会累积变量中的总和,仅提供最终迭代值
- C++ 在循环中添加计数器变量并再次初始化其值
- 对于完成布尔值设置为 true 后未停止的循环
- 如何制作不允许重复值的 C++ int 数组循环?
- For 循环 C++ 中的值错误
- 编写按初始值循环的循环的更好方法是什么
- 通过十六进制/prop_id值循环