2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Дебагинг!
Сообщение29.09.2008, 22:59 
Хорошего вам времени сутки! Помогите пожалуста в дебагингу. Почему когда выполняется просто цикл:
Код:
p1=0;
    for(i=-3.0;i<=2.7;i+=0.3)
      {
      cout.setf(ios::fixed);
      cout.precision(1);
      cout<<"["<<i<<".."<<i+0.3<<")"<<" "<<k[p1]<<"\n";
      p1+=1;
      }

то все выводится правильно:двадцять промежутков и в соответствии с ними двадцать чисел. Когда я вставляю цикл вывода в сам метод(мы генерируем случайные числа):
Код:
for(i=0;i<=29;i++)
       k[i]=0;
   for(i=1;i<=numb;i++)
      {
       xnn=(a*xn+c)%m;
       xn=xnn;
       u=double(xnn)/m;
       bnn=(d*bn*bn+a*bn+c)%m;
       bn=bnn;
       v=double(bnn)/m;
       if(u=0)
          continue;
       if(xn*xn >-4*log(u))
          continue;
       u1=double(xn)/m;
       cout<<u1<<"\n";
       p1=0;
       p=-3.0;
     while(p<=3.0)
        {
        if(u1>=p && u1<(p+0.3))
           k[p1]+=1;
        p=p+0.3;
        p1+=1;
        }
       }
    p1=0;
    for(i=-3.0;i<=2.7;i+=0.3)
      {
      cout.setf(ios::fixed);
      cout.precision(1);
      cout<<"["<<i<<".."<<i+0.3<<")"<<" "<<k[p1]<<"\n";
      p1+=1;
      }

то выводятся на экран дофига одинакових промежутков и с каким-то странным числом. В чем проблема? Заранее спасибо!

 
 
 
 
Сообщение30.09.2008, 02:18 
Аватара пользователя
 !  Оформите свой код с помощью тега [ code ] ... [ /code ]. И не нужно каждую строчку заключать в доллары. Когда исправите - сообщите модератору в ЛС.

 
 
 
 
Сообщение30.09.2008, 20:19 
 !  Jnrty:
Перенёс в "Программирование".

 
 
 
 
Сообщение30.09.2008, 20:29 
Аватара пользователя
Код:
if(u=0)


Вы хотели здесь проверить переменную u на нулевое значение или присвоить ей 0?

 
 
 
 
Сообщение01.10.2008, 00:06 
)))))))))) блин, привичка от паскаля... спасибо!

 
 
 
 
Сообщение01.10.2008, 00:27 
Аватара пользователя
Чтобы автоматически избежать подобных ошибок, приучитесь при сравнении переменной с константой, первой писать константу, а потом переменную. То есть "if(0==u)" вместо "if(u==0)" и т.п.
Тогда "if(0=u)" выдало бы ошибку при компиляции.

 
 
 
 
Сообщение01.10.2008, 12:31 
Аватара пользователя
Хотел бы предостеречь Вас ещё об одной потенциальной трудноуловимой ошибке.
Дмитрий Келлерман писал(а):
Код:
    for(i=-3.0;i<=2.7;i+=0.3)

Дело в том, что компьютер работает с двоичным представлением дробных чисел, а числа 2.7 и 0.3 не могут быть точно представлены в виде конечной двоичной дроби. Поэтому будет производиться округление (в большую либо меньшую сторону), в результате чего у Вас в 20-й итерации может получиться вместо 2.7 чуть большее число, и последняя итерация не выполнится.
Произойдёт это или нет, может зависеть от нескольких факторов: типа переменной i, опций компилятора, самого компилятора, аппаратных особенностей целевой ЭВМ. В отладочной версии может быть всё нормально, а в оптимизированной --- глючить. Поэтому не рекомендуется сравнивать два вещественных числа, а переменную цикла лучше всегда делать целой (например, j от -30 до 27 с шагом 3, а в вычислениях использовать значение j/10).

 
 
 
 
Сообщение01.10.2008, 14:08 
Аватара пользователя
Да, это полезное замечание.
Можно еще поставить максимальное значение, скажем, 2.75.
Хотя использование целых переменных, безусловно, нагляднее.

Правда, тут теоретически в некоторых ситуациях может встать вопрос о быстродействии. Если речь идет об очень внутреннем цикле, который выполняется очень часто, то перевод числа из целого в формат с плавающей точкой занимает определенное время. В этом случае, если речь идет об очень существенном ускорении, вариант с использованием все-таки типа double или float может быть предпочтительнее.

Хотя я не очень понимаю. В первых циклах Вы явно используете переменную i как целую. А в этом цикле - как вещественную. Нет ли здесь еще одной ошибки? Какой тип имеет i?

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group