2013-02-20 2 views
5

今日、痛みを伴ってnnInfに深刻な問題があることがわかりました。たとえば、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 
+1

どのようにその時間を測定しましたか?たぶん、例外を隠す代わりに、発生を防ぐべきでしょうか? –

+1

'isinf()'と 'isnan()'を使って値をチェックしますか? http://msdn.microsoft.com/en-us/library/hh308344.aspx –

+3

_controlfp()で例外を有効にする –

答えて

5

Visual Studioを使用している場合、あなたは/fp:exceptオプションを使用して浮動小数点例外をオンにすることができます。 http://msdn.microsoft.com/en-us/library/e7s85ffb.aspxを参照してください。

コードの同等物は#pragma float_control(except, on)です。 http://msdn.microsoft.com/en-us/library/45ec64h6(v=vs.110).aspxを参照してください。

実行時には、_controlfp(_MCW_EM, _MCW_EM)のようなものを使用できます。 http://msdn.microsoft.com/en-us/library/vstudio/e9b52ceh(v=vs.110).aspxを参照してください。

+0

私は基本的なエディタ(geanyなど)を使用したいと思います - _controlfpは有望ですね。それに必要なライブラリリンクはありますか? – Kenobi

+0

私はそれがcrtの一部だと信じています。試してみるのは簡単です。 –

関連する問題