作者wahaha99 (此方不可長)
看板C_and_CPP
標題[問題] VC2008 這問題不知道該算什麼問題...
時間Thu Aug 5 20:59:28 2010
問題是這樣的..... 我在寫某SDK時, 發生了 float 陣列卻像是 double 的怪事
float *workA; workA = new float [ some_size ];
memcpy(workA, someone_point, some_size*4 );
some_size*4 是因為 float 是 4byte (這樣寫沒錯吧)
實際上 workA 也在後續演算法裡正常工作中, 現在是因為要抓一個怪bug
所以要檢查 workA 的值這樣, 下面是發生的怪事....
============================
cout << workA[0]; <= 畫面上顯示
0.999969 (實際多少我不知道)
if (workA[0] == 0.999969) { something(); } <=
false
cout << workA[0] - 0.999969; <=
4.82422e-007
printf( "%10f", workA[0]); <=
0.999969
printf( "%10f", workA[0]- 0.999969); <=
0.0000.... 又正常起來了
cout << workA[0] *
1000000; <=
99996.9
cout << workA[0] * 10000000; <=
999970 哪招啊
if (workA[0]*1000000 == 999970) { something(); } <=
false
float TEST = 0.999969; <=
compiler 警告: 這是 double 常數, 轉換成float會掉資料
============================
簡單來說 .......單精的浮點數變成倍精? (倍精部分的資料是存在哪邊啊.....)
有沒有人能解惑一下這種靈異現象....QQ 感謝
MS VC++ 2008 / XP SP3 32bit
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.132.126.29
※ 編輯: wahaha99 來自: 220.132.126.29 (08/05 21:00)
→ x000032001:看起來有點像是第12戒 08/05 21:02
→ x000032001:0.99997 >= workA[0] && workA[0] >= 0.999969 08/05 21:03
→ x000032001:另外上面那行是我自己寫浮點數比較的時候會這樣寫XD 08/05 21:04
→ wahaha99:float也有精度問題喔 QQ;; 08/05 21:11
→ x000032001:看到那行黃字我大概知道了 0.999969是double 08/05 21:12
→ x000032001:計算的時候compiler幫你轉換型態了 就掉資料.. 08/05 21:12
→ akasan:加個 f 就變 floating point constant 了 08/05 21:14
→ akasan:不過對精準度應該是沒任何改善 XD 08/05 21:15
→ x000032001:不過cout << workA[0]又是0.999969 囧a 08/05 21:15
推 LPH66:這個值應該是 1-2^-15 (從這些實驗中推測出來的) 08/05 22:02