Что возвращает GetTickCount() после переполнения счетчика? - страница 2

 
alsu:

Проще наверное, просто считать в дополнительном коде...

PS Большое отрицательное число - это еще не переполнение, просто в старший разрад попала единичка. То есть до переполнения еще полпути.


Так-то оно так, но советник уже перестал работать в штатном режиме. Принтинг переменных показал это число. Советник ожидал постоянное наращивание, что текущее будет больше предыдущего, а тут раз и наоборот. Советник и я вместе с ним такого не ожидали. Теперь есть опыт)))
 
может есть смысл мерять разность по модулю ?
 
FAQ:
может есть смысл мерять разность по модулю ?

Ну дак я так и хотел... Но для этого надо снова смоделировать полупереполнение и удостовериться, что отрицательное число по модулю растёт. Алексей (Meat) выше писал, что отрицательно число будет по модулю уменьшаться, то есть двигаться к нулю.
 

Ну вот можно так смоделировать:

for (int i=0; i<10; i++)
  Print(0x7FFFFFFF + i);
 

Может примерно так сделать:

int nTickOld = GetTickCount();
int nTickNew = GetTickCount();

if (nTickNew & nTickOld) {это следующий тик} // Это работать не будет. Это направление для размышлений. Подумать надо, как сделать.
 

Думаю тут без приведения к double не обойтись. По крайней мере если рассматривать общий случай, когда между соседним замерами может пройти количество тиков превышающее 0x7FFFFFFF.

Вот набросал такой вариант приведения:

int nTick = GetTickCount();
double dTick = nTick >>1 * 2.0 + nTick &1; 

 Ну либо приводить уже непосредственно при подсчёте разницы:

double dTicks = (nTickNew >>1 - nTickOld >>1) * 2.0 + nTickNew &1 - nTickOld &1; 
 
Zhunko:

Может примерно так сделать:

Кажется так (PS в MQL4 ведь есть XOR?)
if (nTickNew ^ nTickOld) {это следующий тик} 
 

Эмм запустите этот код:

   int x1 = 0x7FFFFFFF;
   int x2 = x1 + 20;
   
   int x3 = 0xFFFFFFFF;
   int x4 = x3 + 20;
   
   Print(x2 - x1, ", ", x4 - x3);

И прекратите эту бессмысленную дискуссию.

 
Meat:

Думаю тут без приведения к double не обойтись. По крайней мере если рассматривать общий случай, когда между соседним замерами может пройти количество тиков превышающее 0x7FFFFFFF.    

Да. Самое простое приводить к  double. Все проблемы исчезают. 
 
TheXpert:

Эмм запустите этот код:

И прекратите эту бессмысленную дискуссию.

Вы правы, действительно в обычных случаях не стоит заморачиваться. Дополнительные манипуляции нужны только если дельта между x1 и x2 будет больше 0x7FFFFFFF. Т.е. разговор нужно было вести не о переполнении счётчика, а о переполнении дельты.

Причина обращения: