[問題] 請問0.0 和-0.0

看板C_and_CPP作者 (ㄚ魚!!)時間13年前 (2012/11/07 19:21), 編輯推噓1(1017)
留言18則, 8人參與, 最新討論串1/4 (看更多)
開發平台(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

11/07 19:37, , 1F
有可能是 debug 版跟 release 版的差異。
11/07 19:37, 1F
一樣都是release版呢

11/07 19:47, , 2F
這數值判斷...真有創意
11/07 19:47, 2F

11/07 19:49, , 3F
浮點數運算大家都不照標準做,所以不同電腦可能會不同
11/07 19:49, 3F

11/07 19:50, , 4F
數值相等最好使用fabs(a - b) < 0.000001之類的方式
11/07 19:50, 4F

11/07 19:57, , 5F
我也覺得這種判斷法真可怕...
11/07 19:57, 5F
感謝指點 其實這分數的比對(if score == "0.00")之後的程式 才是我負責的 算是蠻下游的 今天一直往上游追才看到前人留下的程式碼 小弟浮點數的運算是都有採用azureblaze說的那樣 採用 fabs(a - b)<0.000001來做運算的 本來以為浮點數已經強迫轉為字串(CString) 字串"0.00"就是4個字元 這樣應該就沒有浮點數精度的問題了 沒想到還是漏算一著 那請問是否該把 score 轉回 float fabs(float(score) - 0.0) < 0.0001 做比較呢?

11/07 20:00, , 6F
標題我以為是表情符號...XD
11/07 20:00, 6F
※ 編輯: jokingfish 來自: 122.117.112.106 (11/07 21:26)

11/07 22:14, , 7F
其實轉都轉了不如直接加個判斷 -0.00 的條件就好了XD
11/07 22:14, 7F

11/07 22:15, , 8F
如果他轉字串唯一的用途就是這個, 那當然換回正常法很好
11/07 22:15, 8F

11/07 22:15, , 9F
如果這個字串還有用在其他地方的話就...
11/07 22:15, 9F

11/07 22:18, , 10F
我倒覺得這問題後段處理較好耶,前段就處理的話等於是直接
11/07 22:18, 10F

11/07 22:19, , 11F
預先定義了系統的最小誤差.另假設eps=1e-9,輸出只有兩個小
11/07 22:19, 11F

11/07 22:19, , 12F
數,那 -0.00 出現也不意外.
11/07 22:19, 12F

11/08 02:06, , 13F
11/08 02:06, 13F

11/08 02:11, , 14F
std::signbit()
11/08 02:11, 14F

11/08 02:25, , 15F
you should avoid to apply - operator on a zero val
11/08 02:25, 15F

11/08 05:54, , 16F

11/08 05:54, , 17F
或許可以改成 float a = 0 - (float)b;
11/08 05:54, 17F

11/08 09:15, , 18F
hilorrk +1 XD
11/08 09:15, 18F
文章代碼(AID): #1GcaGomM (C_and_CPP)
文章代碼(AID): #1GcaGomM (C_and_CPP)