8

今日、 NanInfには深刻な副次的な問題があることを痛感しました。たとえば、sqrtf(NaN)はsqrtf(10.123132)よりも15倍以上遅く、sqrtf(-1)は30倍遅い(!!)ことをご存知ですか?これ自体は非常に遅い浮動小数点計算です!?あなたはゴミを計算し、それのためにばかげた時間を必要とし、それを実現することさえしません。

Linuxでは、NanとInfのバグが発生したときに例外をスローすることで、それらをキャッチできます。

#include <fenv.h> 
feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);

Windowsでそれをどのように達成できますか?

編集:ベンチマークコード:

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
4

1 に答える 1

6

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を参照してください。

于 2013-02-20T23:57:53.043 に答える