2013-02-20 55 views
5

Tôi đã học được một cách đau đớn hôm nay rằng NanInf có vấn đề nghiêm trọng. Bạn có biết ví dụ sqrtf (NaN) lớn hơn chậm hơn 15 lần và sqrtf (-1) là chậm hơn 30 lần (!!) so với sqrtf (10,123132) - vốn khá chậm, nổi tính toán điểm? Bạn tính toán rác, cần một lượng thời gian vô lý cho nó và thậm chí không nhận ra nó.Bắt Nan và Inf trong Windows C++

Ok, dưới Linux bạn có thể bắt Nan và Inf lỗi bằng cách ném một ngoại lệ khi chúng xảy ra:

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

Làm thế nào bạn có thể đạt được điều đó trong môi trường Windows?

EDIT: mã Benchmarking:

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

bạn đo thời gian đó như thế nào? Có lẽ thay vì giấu ngoại lệ, bạn chỉ nên ngăn chặn sự xuất hiện? –

+1

Sử dụng 'isinf()' và 'isnan()' để kiểm tra giá trị? http://msdn.microsoft.com/en-us/library/hh308344.aspx –

+3

Bạn bật ngoại lệ với _controlfp() –

Trả lời

5

Nếu bạn đang sử dụng Visual Studio, bạn có thể bật ngoại lệ điểm sử dụng tùy chọn /fp:except nổi. Xem http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx.

Tương đương trong mã là #pragma float_control(except, on). Xem http://msdn.microsoft.com/en-us/library/45ec64h6(v=vs.110).aspx.

Khi chạy, bạn có thể sử dụng một cái gì đó như _controlfp(_MCW_EM, _MCW_EM). Xem http://msdn.microsoft.com/en-us/library/vstudio/e9b52ceh(v=vs.110).aspx.

+0

Tôi muốn sử dụng một trình soạn thảo cơ bản (geany vv) - _controlfp có vẻ đầy hứa hẹn. Bất kỳ liên kết thư viện cần thiết cho điều đó? – Kenobi

+0

Tôi tin rằng đó là một phần của crt. Nên dễ dàng để thử và xem. –

Các vấn đề liên quan