今日、痛みを伴ってnnとInfに深刻な問題があることがわかりました。たとえば、sqrtf(NaN)がより15倍遅いであり、sqrtf(-1)が(!!)よりも30倍遅いであることがわかっていますか?これは非常に遅いフローティングポイント計算!あなたはごみを計算し、それにばかげた時間を必要とし、それを実現さえしません。Windows C++でNatchとInfをキャッチ
Linuxで、[OK]をあなたは、彼らが発生したときに例外をスローすることによって、ナンとInfのバグをキャッチすることができます:
#include <fenv.h>
feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
どのようにWindowsの下でそれを達成できますか。
EDIT: ベンチマークコード:
float a,b;
a = 1.0/0; //inf
a = -10; //also nice
long c=0;
long time = SDL_GetTicks();
for (long i=1;i<=1000000;i++) {
b=sqrt(a);
}
ostringstream Help; Help << SDL_GetTicks()-time;
//RESULT SHEET
//sqrt(1): 21ms
//sqrt(10): 21ms
//sqrt(10.123): 20ms
//sqrt(-10); 390ms
//sqrt(+-NaN): 174ms
//sqrt(inf): 174
どのようにその時間を測定しましたか?たぶん、例外を隠す代わりに、発生を防ぐべきでしょうか? –
'isinf()'と 'isnan()'を使って値をチェックしますか? http://msdn.microsoft.com/en-us/library/hh308344.aspx –
_controlfp()で例外を有効にする –