2013-06-03 53 views
0
 POINT p; 
     RECT rec; 

     ::GetClientRect(hWnd, &rec); 
     LONG windowWidth = rec.right, windowHeight = rec.bottom; 

     ::GetCursorPos(&p);//get position on screen 
     ::ScreenToClient(hWnd,&p);//convert POINT to position in window 

     // 2d vector math 
     float x=0.0f,y=0.0f; // vector 
     x= static_cast<float>(p.x - (windowWidth>>1)); // problem... 
     y= static_cast<float>(p.y - (windowHeight>>1)); 

     char buf[100]; 
     sprintf_s(buf, "x: %d, y: %d\n", x,y); // create string to print 
     OutputDebugStringA(buf); // print to debut window 

當我打印X和Y到控制檯它給我瘋狂的數字。似乎長時間投射正在失去一些數據,但爲什麼?不應該有任何問題。C++從長轉換爲浮點奇怪錯誤

它打印:
X:0,Y:1080795136

+0

你有什麼期望'WINDOWWIDTH >> 1'做什麼呢? – fge

+0

將windowWidth除以2 –

+0

它不是!這對整數類型是正確的,對浮點類型不是。閱讀關於IEEE 754. – fge

回答

5
sprintf_s(buf, "x: %d, y: %d\n", x,y); 

應該

sprintf_s(buf, "x: %f, y: %f\n", x,y); 

因爲xyfloat類型,而不是整數。

+0

爲了回收這個答案,'float'與'int'和'long'具有不同的二進制格式。在二進制透視圖中,'4.3f'的值可能看起來像是'-242343' – tay10r

+0

@TaylorFlores感謝您添加更多信息。 – taocp

2

難道是因爲你在你的sprintf_s調用使用%d?嘗試使用%f,看看是否是這個問題。

3

如果您使用%d格式並傳遞一個浮點數(實際上是以double的形式傳遞的),那麼難怪你會得到垃圾。你可能會變得更糟。嘗試%f格式,或轉換爲%d預期的int。

3

只是修改,以

sprintf_s(buf, "x: %f, y: %f\n", x,y); 

因爲你使用的彩車

+1

該死的我是第四個像4分鐘 – Nicola