Как зациклить и увеличить на 0,01 каждый раз? - PullRequest
3 голосов
/ 02 декабря 2010

Я действительно запутался в этом коде.

Вот что я хочу сделать: начните со значения «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
}

Вот что я получаю: я попытался установить iv <= 10, чтобы он делал 10 циклов только для того, чтобы я мог проверить его передоставив его на всю ночь.Он сделал только 6 циклов, начиная с v = 0,05 и заканчивая 0,1.Таким образом, проблема в том, что а) он не работал в течение 10 циклов, б) он не начинался в 5.00, он начинался в 0.05.</p>

Любая помощь будет оценена.

РЕДАКТИРОВАТЬ: Святое дерьмо, так много ответов!Я пробовал 2 разных ответа, оба работают!Я смотрел на это и менял код в течение 3 часов, не могу поверить, что это было так просто.

Ответы [ 6 ]

7 голосов
/ 02 декабря 2010

Вам нужно начать с iv = 500. и если вам нужно 10 циклов, а iv++ - это обновление, то вы останавливаетесь до 510.

Причина: v = 0.01*iv, поэтому v = 5 означает iv = 5/0.01 = 500. Что касается количества итераций, если ваш цикл for имеет форму for (x = N; x < M; x++) (константа N и M), то выполняются циклы max(0, M-N), если x не изменено в цикле и не является странным происходят вещи (например, переполнение, скрытые преобразования отрицательных чисел в неподписанные и т. д.).

EDIT

Вместо использования v = 0.01 * iv, v = iv / 100.0, вероятно, более точный. Причина: 0,01 не является точно представимым в плавающей точке, но 100,0 является.

2 голосов
/ 02 декабря 2010

Изменение кода SiegeX, чтобы он использовал целые числа («точнее»):

double dv;
int iv;
for(iv = 500; dv <= 1000; iv += 1)
{
    dv = (double)iv / 100.0;
}
0 голосов
/ 02 декабря 2010
int i;
double v;
v = 5;
for (i = 0; i < 500; i++)
{
    v += 0.01;
    // Do Calculations Here.

    if (v >= 10.00) break;
}

Это дает вам обоим. Это будет повторяться максимум 500 раз, но выйдет из этого цикла, если значение v достигнет (или превысит) 10,00.

Если вы хотели только одно или другое:

Версия 10.00:

double v;
v = 5.0;
while ( v < 10.00 )
{
    v += 0.01;
    // Do Calculations Here. 
}

Версия 500 итераций:

double v;
int i;
v = 5.0;
for( i = 0; i < 500; i++ )
{
    v += 0.01;
    // Do Calculations.
}

(Обратите внимание, что это не C99, который позволяет более чистый синтаксис объявления в циклах).

0 голосов
/ 02 декабря 2010
//start loop over v  
for(iv=0;iv<500;iv++) //loop from 0 to 499
{  
    v=v+0.01; //increase v by 0.01
    //Lots and lots of calculations with v here
}

это должно сделать

0 голосов
/ 02 декабря 2010
double iv;
for(iv = 5.0; iv <= 10.0 ; iv += 0.01) {
/* stuff here */
}
0 голосов
/ 02 декабря 2010

iv <= 10 не делает это в течение 10 циклов, он делает это до тех пор, пока iv не станет больше 10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...