Re: [問題] vector遇到小數點的問題!!!?
※ 引述《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
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章