Re: [問題] vector遇到小數點的問題!!!?

看板C_and_CPP (C/C++)作者 (Alien)時間16年前 (2009/07/20 12:31), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/4 (看更多)
※ 引述《CuBa818 (#酷拔#)》之銘言: : 請問版上大大~~ : 我在使用vector的原始碼如下: : ifstream fin(dataset.c_str()); //自行輸入的檔案名稱 : ofstream fout("output.data"); : string strLine; : vector<vector<double> > Data2D; [43] : 但程式執行後的結果變成這樣:(沒產生out.data,這是cout在cmd的擷取畫面) : 5 121 72 23 112 26 3.67348e-040 7.35281e-040 1 : 1 126 60 0 0 30 3.67348e-040 7.35287e-040 1 : 1 93 70 31 0 30 3.67348e-040 7.34933e-040 5.60254e-039 : 碰到小數點後,vector的存入就產生問題。 : 請問有哪裡寫錯嗎?? 我不肯定你說 "產生問題" 是什麼問題,因為我實在懶得 去看你的程式再慢慢猜你的 expected result 應該怎樣才對。 我猜你說有問題,是 3.67348e-040 這些?本來應該是 0 可是出現了這些怪東西吧? 是的話,那麼你沒有寫錯,你錯的只是對 double/float 這類 浮點數的認知不足而已。使用 double/float 的時候,要時刻 記在心中,它們只是大個大約數,會有誤差,我們的程式要自 已處理誤差的部份。(為什麼只是大約數,你去翻翻書應該有 很多資料了,不贅)比如你的 3.67348e-040, 那是小數後 40 位才出現數字,那的確 "大概" 是 0。 比如,double 的準確的範圍大概有15-16 個有效數位,即是 16 個位開始就可能有一些"不正常"的東西出現。 所以寫程式的時候,要定好自已需要處理的小數位數。比如我 定好我的數值只會去到小數位後8 個位 (那麼小數前就只有 15-8= 7 個位了),在的要顯示的時候,以此為標準顯示 e.g. printf("%0.8f", myDouble); 這樣顯示才會正確。 如果你顯示也搞錯的話,想必你做 double 的運算應該也會有錯. 比如你可能會寫 if (aDouble == bDouble) {...} 同理,因為 double 是約數,所以明明是相等的情況,用 == 也可能會變成不相等。解決方法嘛,和上面類似,定好小數位 8 位後,定義 const double EPSILON = 0.000000001; if (aDouble == bDouble) 改為 if (aDouble < bDouble + EPSILON && aDouble > bDouble -EPSILON) 有人寫 if (fabs(aDouble-bDouble) < EPSILON) 意思也是一樣 (>, <, >=, <=, != 的 case 就留給你自己了) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.77.15.66
文章代碼(AID): #1AO_CbEU (C_and_CPP)
文章代碼(AID): #1AO_CbEU (C_and_CPP)