Tôi đã học được một cách đau đớn hôm nay rằng Nan và Inf 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
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? –
Sử dụng 'isinf()' và 'isnan()' để kiểm tra giá trị? http://msdn.microsoft.com/en-us/library/hh308344.aspx –
Bạn bật ngoại lệ với _controlfp() –