[問題] VC2008 這問題不知道該算什麼問題...

看板C_and_CPP作者 (此方不可長)時間15年前 (2010/08/05 20:59), 編輯推噓1(109)
留言10則, 4人參與, 最新討論串1/2 (看更多)
問題是這樣的..... 我在寫某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)

08/05 21:02, , 1F
看起來有點像是第12戒
08/05 21:02, 1F

08/05 21:03, , 2F
0.99997 >= workA[0] && workA[0] >= 0.999969
08/05 21:03, 2F

08/05 21:04, , 3F
另外上面那行是我自己寫浮點數比較的時候會這樣寫XD
08/05 21:04, 3F

08/05 21:11, , 4F
float也有精度問題喔 QQ;;
08/05 21:11, 4F

08/05 21:12, , 5F
看到那行黃字我大概知道了 0.999969是double
08/05 21:12, 5F

08/05 21:12, , 6F
計算的時候compiler幫你轉換型態了 就掉資料..
08/05 21:12, 6F

08/05 21:14, , 7F
加個 f 就變 floating point constant 了
08/05 21:14, 7F

08/05 21:15, , 8F
不過對精準度應該是沒任何改善 XD
08/05 21:15, 8F

08/05 21:15, , 9F
不過cout << workA[0]又是0.999969 囧a
08/05 21:15, 9F

08/05 22:02, , 10F
這個值應該是 1-2^-15 (從這些實驗中推測出來的)
08/05 22:02, 10F
文章代碼(AID): #1CMhMp7l (C_and_CPP)
文章代碼(AID): #1CMhMp7l (C_and_CPP)