Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何循环并每次增加0.01?_C_Loops - Fatal编程技术网

C 如何循环并每次增加0.01?

C 如何循环并每次增加0.01?,c,loops,C,Loops,我真的对这个代码感到困惑 我希望它这样做:从“v”值5开始,执行其余的函数/计算,将“v”值增加0.01,执行函数/计算,然后再次将“v”值增加0.01,执行函数…执行500次或直到“v”值达到10.00,以更容易编码的为准 这是我目前的代码: //start loop over v for(iv=5;iv<=500;iv++) { v=0.01*iv; //Lots and lots of calculations with v here } //在v上开始循环

我真的对这个代码感到困惑

我希望它这样做:从“v”值5开始,执行其余的函数/计算,将“v”值增加0.01,执行函数/计算,然后再次将“v”值增加0.01,执行函数…执行500次或直到“v”值达到10.00,以更容易编码的为准

这是我目前的代码:

//start loop over v  
for(iv=5;iv<=500;iv++) {  
    v=0.01*iv;
    //Lots and lots of calculations with v here
}
//在v上开始循环

对于(iv=5;iv您需要从
iv=500
开始。如果您想要10个循环,并且
iv++
是更新,那么您需要在
510
之前停止

原因:
v=0.01*iv
,因此
v=5
意味着
iv=5/0.01=500
。至于迭代次数,如果for循环的形式是
for(x=N;x
(常数
N
M
),那么
max(0,M-N)
如果循环中未更改
x
,并且没有出现奇怪的情况(例如溢出、将负数隐藏转换为无符号等),则执行循环

编辑

与其使用
v=0.01*iv
v=iv/100.0
可能更准确。原因:0.01不能用浮点表示,但100.0可以用双iv表示; 对于(iv=5.0;iv
//在v上启动回路
对于(iv=0;iv
inti;
双v;
v=5;
对于(i=0;i<500;i++)
{
v+=0.01;
//在这里做计算。
如果(v>=10.00)中断;
}
这将给你两个。这将迭代最多500次,但如果v值达到(或超过)10.00,将打破该循环

如果您只想要其中一个:

10.00版本:

double v;
v = 5.0;
while ( v < 10.00 )
{
    v += 0.01;
    // Do Calculations Here. 
}
doublev;
v=5.0;
而(v<10.00)
{
v+=0.01;
//在这里做计算。
}
500迭代版本:

double v;
int i;
v = 5.0;
for( i = 0; i < 500; i++ )
{
    v += 0.01;
    // Do Calculations.
}
doublev;
int i;
v=5.0;
对于(i=0;i<500;i++)
{
v+=0.01;
//做计算。
}

(请注意,这不是C99,它允许在循环中使用更清晰的声明语法)。

更改SiegeX的代码,使其使用整数(“更精确”):

双dv;
int iv;

对于(iv=500;由于IEEE 754不准确,应尽可能避免使用浮点数的dv操作。由于IEEE 754不准确,应尽可能避免使用浮点数的操作。我已经厌倦了这么说,但由于IEEE 75,应尽可能避免使用浮点数的操作4不准确性。你建议如何将一个数字增加0.01,然后在不进行浮点运算的情况下在计算中使用该数字?特别是这是一个家庭作业问题,除非是在某些数值方法类中(看起来不是这样的)这不重要。也许你可以提供正确的答案,而不是说明所有答案都是错误的。因为已经给出了正确的答案(虽然不是由我给出的)。确实没有。但它确实解释了a)询问者的观察结果,以及b)不要让问题变得更糟。没有必要将
iv
转换为
double
——常量
100.0
的类型为
double
,所以
iv
将通过通常的算术转换来提升。@caf我知道,但强尼得到的是,他需要使用
(double)
iv
当他想把它改成
双精度的时候,他不会犯任何错误。我想你错了,一次乘法的错误与大量加法的错误是一样的。每次加法,错误都会累积,这不仅是因为0.01不完全可以表示,还因为中间的ate结果不是完全可以表示的。@janm:是的。我刚才试图思考它时,把浮点当作实数来处理,这是有罪的。更正了。
int i;
double v;
v = 5;
for (i = 0; i < 500; i++)
{
    v += 0.01;
    // Do Calculations Here.

    if (v >= 10.00) break;
}
double v;
v = 5.0;
while ( v < 10.00 )
{
    v += 0.01;
    // Do Calculations Here. 
}
double v;
int i;
v = 5.0;
for( i = 0; i < 500; i++ )
{
    v += 0.01;
    // Do Calculations.
}
double dv;
int iv;
for(iv = 500; dv <= 1000; iv += 1)
{
    dv = (double)iv / 100.0;
}