Re: [心得] 為了玄妙的0.000000001 快哭出來了

看板b97902HW作者 (安弗尼恩)時間17年前 (2008/10/02 00:38), 編輯推噓3(301)
留言4則, 3人參與, 最新討論串3/3 (看更多)
大家好,我是路人甲阿南(咦) 在我慘烈地傳了N次之後總算是過了,感謝森林真強者(奇怪我又叫不一樣的稱呼了XD) 提供幾個浮點數誤差的修正點,供大家參考囉 1. 第一個位置(也就是輸入進來的),這個不用修正。 (理應不用修正吧,他又沒有做任何的事囧) 2. 跑迴圈的次數 計算跑迴圈的次數有很多種方式,可以用加減乘除,反正想的到得都可以(咦) 我是用減的,於是我的code出現了 while(T >= dt) { [...] T -= dt; } 這樣的寫法必須要修正成 T + 1e-10 >= dt才會過 請注意如果修正太小例如 1e-15的話,第六組測資會爆 然後據我剛剛的實驗結果,不加等於也是會過的,不過我覺得加上去比較好 比較符合真正的意涵 如果是除法的修正,我想這篇原PO已經給的很清楚了 強制轉換型別的(int)記得要跟後面要轉的東西連好,不然他不會理你 for(j=1; j<=(int)(T / dt + 1e-10); j++) 小小的建議是可以把中間部分先在外面寫好,畢竟除法也是挺花時間的~ T /= dt; T += 1e-10; 偷懶寫成 T /= dt, T += 1e-10;也是可以的 這應該是coding style的問題,強者們有要PO教學文嗎XD (還是已經PO過了囧?) 3. 輸出的部份 這篇的原PO也提過了,因為有可能有-0.000的情況 所以在printf()那裡要修正1e-10。 (這個部份可以修正1e-15沒有問題) 4. 比較的部份 呃,這題在比較大小時沒有誤差造成的問題,所以可以不用修正XD 有時候如果有等於之類的就要注意一下了~(像剛剛2.我的寫法就是) 大致的誤差點應該就只有這樣,如果這幾個地方都對了但是還沒有過, 那可能要檢查一下其他的地方,然後找真強者們幫忙啦XD 好了,路人甲的廢言就到此結束了 請大家看在我這麼認真PO文的份上,明天要記得來幫女籃加油唷囧/ 我去睡了,各位晚安XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.50.107

10/02 00:46, , 1F
我也是找森林真強者問問題的呢 !!
10/02 00:46, 1F

10/02 01:09, , 2F
噢大家都找森林真強者耶,有PO文有差XD
10/02 01:09, 2F

10/02 01:15, , 3F
Q_____Q 謝謝大家
10/02 01:15, 3F

10/02 01:40, , 4F
結果找我的都是殺鋼彈XDDD
10/02 01:40, 4F
文章代碼(AID): #18uwU61X (b97902HW)
文章代碼(AID): #18uwU61X (b97902HW)