2010-06-11 3 views
0

Это часто возвращается NAN ("Not A Number") в зависимости от ввода:Почему этот код иногда возвращает NaN?

#define PI 3.1415f 

GLfloat sineEaseIn(GLfloat ratio) { 
return 1.0f-cosf(ratio * (PI/2.0f)); 
} 

Я попытался сделать PI несколько цифр меньше, чтобы увидеть, если это поможет. Нет кубиков. Тогда я думал, что это может быть несоответствие типов данных, но поплавок и GLfloat кажутся эквивалентными:

gl.h

typedef float   GLfloat; 

math.h

extern float cosf(float); 

Это вопрос кастинга?

+0

Кажется, что нет ничего плохого в твоем литье. Может быть, с этим может быть NAN или INF? –

+0

Каковы некоторые входы, вызывающие «NaN», когда вы их не ожидаете? –

+0

Как примечание, вам не нужно определять 'PI' (или pi/2) самостоятельно. Вы можете использовать 'M_PI_2', определенную в' ' (желательно с добавлением приведения к float или суффиксу 'f', добавленным во избежание ненужных преобразований во время выполнения). –

ответ

2

Я подозреваю, что одна из следующих подготавливается:

  • ваш вклад значение ratio не может быть то, что вы ожидаете, что это будет, и ratio само по себе возможно NaN
  • cosf, что вы звонок не в math.h

В противном случае в вашем выражении не должно быть ничего плохого.

+0

Спасибо за помощь! Я был один за другим с моим перечислением, которое выбирало функцию ослабления, поэтому я в основном отлаживал неправильную функцию ослабления. Это плохой, и я знаю, почему сейчас: GLfloat circleEaseInOut (коэффициент GLfloat) { \t return ((ratio * = 2) <1)? -0,5 * (sqrtf (отношение 1-соотношение *) -1): 0,5 * (sqrtf (отношение 1- (отношение = 2) *) +1); } Я сменил эти цифры на поплавки, и теперь все работает! Спасибо за вашу помощь! Я, вероятно, все еще буду преследовать эту идею придания формы кроличьей дыре. – user360092

Смежные вопросы