作者anfranion (安弗尼恩)
看板b97902HW
標題Re: [心得] 為了玄妙的0.000000001 快哭出來了
時間Thu Oct 2 00:38:29 2008
大家好,我是路人甲阿南(咦)
在我慘烈地傳了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
推 benck:我也是找森林真強者問問題的呢 !! 10/02 00:46
→ sa072686:噢大家都找森林真強者耶,有PO文有差XD 10/02 01:09
推 iForests:Q_____Q 謝謝大家 10/02 01:15
推 sa072686:結果找我的都是殺鋼彈XDDD 10/02 01:40