gpt4 book ai didi

c++ - 总和超过循环 float 的允许值

转载 作者:太空宇宙 更新时间:2023-11-04 13:31:41 25 4
gpt4 key购买 nike

我最近创建了这个简单的程序来计算平均速度。

平均速度 = Δx/Δt

我选择 x 作为 t 的函数作为 x = t^2

因此 v = 2t

另外,avg v = (x2 - x1)/(t2 - t1)

我选择的间隔是t = 1s to 4s。暗示 x 从 1 到 16

因此 avg 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,则计算出的avg v为4.99998。
现在,如果我将 t 的增量设为 0.0001,则 avg v 变为 5.00007!

进一步减少增量到 0.00001 产生 avg v = 5.00001

为什么会这样?

谢谢。

最佳答案

2 中,0.00010.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 被分解为质数 25 只有分母只能被 2 整除的分数5 可以用有限数量的十进制数字表示(所有其他分数都是周期性的),在基数 2 中,只有以 2 的幂为分母的分数才能准确表示。尝试使用 1.0/512.01.0/1024.0 作为循环中的步骤。另外,要小心,因为如果您选择的步长太小,您可能没有足够的数字来表示 float 数据类型(即,使用 double)

关于c++ - 总和超过循环 float 的允许值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31208470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com