看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《yauhh (喲)》之銘言: : 接著你的討論,想問個問題. : 計算放到現實總是相當討厭,會碰到具體的限制. 就一般所知道,浮點數 : 在加減法方面會有一點點不精確性,而在乘除法方面則會因此產生成倍數的不精確. : 於是,你將一個 e 遞迴在除法上,則除一次,除二次,除三次, ..., : 不精確性一直累積出來. : 同樣一個 e, 我可能拆成 1 + 1/1! + 1/2! + 1/3! + ... + 1/n!, : 分母先自己乘,因為都是整數所以分母沒有不精確性,然後每項分別除,然後加總. : 雖然除了蠻多次,但是因為除法是包含在同一層加法裡頭,所以不精確性比連除好幾次 : 少很多(吧?). : 那麼,請問你解這個問題,該如何檢查先加再除或先除再加的精確性? 不可否認,先算出每個1/n!再加總其精確度較高。 不過在程式裡有一個關鍵,就是resize()這個方法。 當每個1/n一開始都算到算到小數點以下2000位時, 之後的2000位乘上2000位會是4000位左右,我只再取前2000位。 所以,如果不resize(),一直遞迴下去, 總位數會很龐大,速度會很慢。 當初的想法就是覺得這應該已經比2000位精確很多了。(不負責任的直覺) 至於為什麼我不想先做1/n!係因為我很想避開惱人的大數除法。 而n和精確度p取一樣的數值只是我很懶得去精算n和p的關係。 最後我把為什麼我會想寫這程式的原因交代一下, 因為我在對岸看到了這個網頁:http://wenwen.soso.com/z/q211633839.htm 上面的牛人把e的小數點以下2000位都列出來了。 除了最後一位數以外(我猜他4捨5入),2000位應該沒什麼大問題。 不過前提是他列出來的是對的答案。 題外話,其實我也寫了(1 + 1/n)^n,當n趨近無限大時計算e值, 不過效率不彰,n = 10000000000000000LL作D&C精確度也不超過100位。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.25.251.97
firejox:我覺得精確度沒什麼差別如果你是先乘完最後一次除的話 05/03 21:18