2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Дебагинг!
Сообщение29.09.2008, 22:59 


09/09/08
31
Львів.
Хорошего вам времени сутки! Помогите пожалуста в дебагингу. Почему когда выполняется просто цикл:
Код:
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 
Модератор
Аватара пользователя


11/01/06
5660
 !  Оформите свой код с помощью тега [ code ] ... [ /code ]. И не нужно каждую строчку заключать в доллары. Когда исправите - сообщите модератору в ЛС.

 Профиль  
                  
 
 
Сообщение30.09.2008, 20:19 
Модератор


16/01/07
1567
Северодвинск
 !  Jnrty:
Перенёс в "Программирование".

 Профиль  
                  
 
 
Сообщение30.09.2008, 20:29 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Код:
if(u=0)


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

 Профиль  
                  
 
 
Сообщение01.10.2008, 00:06 


09/09/08
31
Львів.
)))))))))) блин, привичка от паскаля... спасибо!

 Профиль  
                  
 
 
Сообщение01.10.2008, 00:27 
Модератор
Аватара пользователя


11/01/06
5660
Чтобы автоматически избежать подобных ошибок, приучитесь при сравнении переменной с константой, первой писать константу, а потом переменную. То есть "if(0==u)" вместо "if(u==0)" и т.п.
Тогда "if(0=u)" выдало бы ошибку при компиляции.

 Профиль  
                  
 
 
Сообщение01.10.2008, 12:31 
Заслуженный участник
Аватара пользователя


01/08/06
3054
Уфа
Хотел бы предостеречь Вас ещё об одной потенциальной трудноуловимой ошибке.
Дмитрий Келлерман писал(а):
Код:
    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 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Да, это полезное замечание.
Можно еще поставить максимальное значение, скажем, 2.75.
Хотя использование целых переменных, безусловно, нагляднее.

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group