Есть ли возможный способ деления двух чисел с плавающей точкой, которые были отлиты из беззнаковых int, сделать отрицательный результат с плавающей точкой? - PullRequest
3 голосов
/ 17 мая 2011
unsigned int deltaTime = now() - last();
unsigned int freq = getFreq();
float timeOfGap = float(deltaTime) / float(freq);

ASSERT(0.0f <= timeOfGap, "WHAT?");

Я получил очень утомительный результат от моей программы. Я не поймал сцену, которая произошла. Но у меня есть журнал, в котором сказано, что он действительно поднимался как минимум несколько раз.

Есть ли возможный способ деления двух чисел с плавающей точкой, которые были отлиты из unsigned int, сделать отрицательный результат с плавающей точкой?


ОК, спасибо, ребята. Я рад видеть ваше внимание. Позвольте мне попытаться добавить некоторые описания об этом. Это будет полезно для вас.

Я работаю над онлайн-игрой, и эта ситуация возникала редко, но часто, когда игра играла сотни миллионов раз. Я не могу отладить или поймать точный выстрел, но он регистрируется в сообщениях об ошибках db.

timeOfGap должен быть равен NaN, как вы заметили, но журнал не сообщал значение точно. TimeOfGap накапливается, как показано ниже;

mTotalFrameRateTimeAsASecond += timeOfGap;

И эта программа регистрирует mTotalFrameRateTimeAsASecond, это было отрицательное значение. Но кроме того, что этот знак стоимости был отрицательным, это правильное значение. Это значит, что время будет выглядеть так же хорошо, если я разделю окончательное значение с частотой кадров. Гипотетическое время воспроизведения составило 500 секунд, оно составляет -30000 (с частотой 60 кадров в секунду).

Ответы [ 4 ]

3 голосов
/ 17 мая 2011

Может быть, это не отрицательно, а NAN. 0.0f <= NAN - это false. Это может произойти, если оба операнда равны нулю.

0 голосов
/ 17 мая 2011

Это должно найти проблему:

unsigned int deltaTime = now() - last();
unsigned int freq = getFreq();
float timeOfGap = float(deltaTime) / float(freq);
char s[50] ;
sprintf (s, "WHAT? %u/%u < 0!", deltaTime, freq);

ASSERT(0.0f <= timeOfGap, s);
0 голосов
/ 17 мая 2011

Вы можете сделать простой тест, чтобы проверить приведение от unsigned int к float.

Попробуйте:

unsigned int toto = 0xFFFFFFFF; 
float convertedToto = float(toto);

convertedToto будет равно -1, если преобразование (unsigned int -> float) действительно (int -> float).Вы должны получить 2 * 10e31 с правильным преобразованием.

0 голосов
/ 17 мая 2011

Значение nan не сравнится ни с чем успешно.Так что если у вас есть:

float f = 0.0 / 0.0;

assert(f > 0 || f <= 0);

Утверждение не удастся!

...