看板 C_and_CPP 關於我們 聯絡資訊
問題是這樣的..... 我在寫某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