我试图在一个for循环中编写两个循环,所以我在for循环中查找了多个变量的语法
问题是第二个变量l
没有更新我不知道为什么
#include<iostream>
using namespace std;
int main ()
{
float vsum=0, lsum=0;
double nsum=0, msum=0;
float v=1, l=100000000;
for (v, l ; v<= 100000000, l >= 1 ; v++, l--)
{
vsum= vsum + 1/v;
nsum= nsum + 1/v;
lsum= lsum + 1/l;
msum= msum+ 1/l;
}
cout << " The float sum of all numbers 1 through 1/100000000 is " << vsum << endl;
cout << " The double sum of all numbers 1 through 1/100000000 is " << nsum << endl;
cout << "The float sum of all numbers 1/100000000 through 1/1 is " << lsum << endl;
cout << "The double sum of all numbers 1/100000000 through 1/1 is " << msum << endl;
cin >> vsum;
}
答案 0 :(得分:2)
我想你的问题是在
之后float f = 100000000;
为什么--f;
保持f
不变?
答案是由float
的粒度决定的。 float
没有足够的精度来存储每个可能的整数。例如,显然32位浮点数不能存储与32位int一样多的整数值。
离0
越远,float
的连续可能值之间的差距就越大。在您的系统上100000000 - 1
仍然大于100000000
以下的浮动的下一个可能值。
C ++的规则是,当计算结果不能完全由浮点表示时,它的实现定义是使用下一个最低值还是下一个最高值。 (所以你的编译器应该实际记录这里发生的事情)。在这种情况下,您的系统使用次高值。
要获得预期的结果,请将v
和l
设为整数类型,并在实际计算中进行浮点转换,例如
vsum += 1.f/v;
nsum += 1.0/v;
答案 1 :(得分:1)
正如dasblinkenlight所提到的,你只是检查第二个条件,但第二个变量正在更新。这是一个证明这一点的简略例子。
#include<iostream>
using namespace std;
int main ()
{
float vsum=0, lsum=0;
double nsum=0, msum=0;
float v=1, l=10;
for (v, l ; v<= 10, l >= 1 ; v++, l--)
{
cout << v << " " << l << endl;
}
}
输出:
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1