看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 問題(Question): 一樣的程式碼 同一個exe 在不同電腦 有可能CPU會自動把-0.0 轉成 0.0嗎? 餵入的資料(Input): 輸入數值為 0 預期的正確結果(Expected Output): -0.0 (我的電腦) 錯誤結果(Wrong Output): 0.0 (客戶的電腦) 程式碼(Code):(請善用置底文網頁, 記得排版) double b; file >> b; float a = -(float) b; printf("%f",a); CString score; score.Format("%2.2f",a); if(score == "0.00") 補充說明(Supplement): 以上是我簡化程式碼後的結果 從出錯的地方 和客戶電腦交叉比對後 才發現問題出在這邊 而這數字是分數 後續會轉成CString 判斷是否 為 "0.00" 我的電腦出來的結果是 -0.00 所以不會進入判斷式 但是客戶的電腦出來的卻是 0.00 所以會進去 造成意料之外的結果 請問版友有人有類似的經驗嗎? 一樣的程式碼 一樣的執行檔 我個人猜測可能只有CPU演算單元之類的差別 還請版友不吝賜教 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.117.112.106
linotwo:有可能是 debug 版跟 release 版的差異。 11/07 19:37
一樣都是release版呢
azureblaze:這數值判斷...真有創意 11/07 19:47
azureblaze:浮點數運算大家都不照標準做,所以不同電腦可能會不同 11/07 19:49
azureblaze:數值相等最好使用fabs(a - b) < 0.000001之類的方式 11/07 19:50
james732:我也覺得這種判斷法真可怕... 11/07 19:57
感謝指點 其實這分數的比對(if score == "0.00")之後的程式 才是我負責的 算是蠻下游的 今天一直往上游追才看到前人留下的程式碼 小弟浮點數的運算是都有採用azureblaze說的那樣 採用 fabs(a - b)<0.000001來做運算的 本來以為浮點數已經強迫轉為字串(CString) 字串"0.00"就是4個字元 這樣應該就沒有浮點數精度的問題了 沒想到還是漏算一著 那請問是否該把 score 轉回 float fabs(float(score) - 0.0) < 0.0001 做比較呢?
hilorrk:標題我以為是表情符號...XD 11/07 20:00
※ 編輯: jokingfish 來自: 122.117.112.106 (11/07 21:26)
uranusjr:其實轉都轉了不如直接加個判斷 -0.00 的條件就好了XD 11/07 22:14
uranusjr:如果他轉字串唯一的用途就是這個, 那當然換回正常法很好 11/07 22:15
uranusjr:如果這個字串還有用在其他地方的話就... 11/07 22:15
EdisonX:我倒覺得這問題後段處理較好耶,前段就處理的話等於是直接 11/07 22:18
EdisonX:預先定義了系統的最小誤差.另假設eps=1e-9,輸出只有兩個小 11/07 22:19
EdisonX:數,那 -0.00 出現也不意外. 11/07 22:19
loveme00835: http://ideone.com/Ehvx2o 11/08 02:06
loveme00835:std::signbit() 11/08 02:11
loveme00835:you should avoid to apply - operator on a zero val 11/08 02:25
linotwo:http://codepad.org/7Mpw2nn0 11/08 05:54
linotwo:或許可以改成 float a = 0 - (float)b; 11/08 05:54
BlazarArc:hilorrk +1 XD 11/08 09:15