推 suhorng : ln(1+x^2)=x^2-x^4/2+O(x^6) x small 05/06 17:04
→ wohtp : 忽大忽小一定是你算錯了 05/06 18:03
推 t0444564 : 樓上的scale也太大了吧, 如果尺度放在-.005至.0005 05/07 10:27
推 suhorng : 尺度很小的話不是 = 1/2 - x^2/3 + x^4/4 - x^6/5 05/07 11:23
→ suhorng : + O(x^8) 嗎? 05/07 11:23
→ suhorng : 數值計算器正常來講都是有限精度的計算喔 05/07 11:33
→ wohtp : 級數展開得到 \sum (-x^2)^n/(n+2) 05/07 14:30
→ wohtp : 跟 log(1+x^2) 的級數相比就知道它在 |x| < 1 時都 05/07 14:31
→ wohtp : 絕對收斂 05/07 14:31
→ wohtp : 所以級數跟函數可以掛等號沒問題 05/07 14:33
→ wohtp : 然後級數的和會被 1/2 +- log(1-x^2) 上下綁住 05/07 14:34
→ wohtp : 所以在 x = 0 附近不應該震盪,更不會爆炸 05/07 14:35
→ wohtp : 注意分子是兩個很靠近的數字相減。若 x = O(10^-4) 05/07 14:40
→ wohtp : 分子兩邊的leading order是 x^2,減完剩下 x^4 05/07 14:41
→ wohtp : 一來一往就先噴掉整整八位的有效位數 05/07 14:42
→ wohtp : 然後離開 x -> 0 極限多遠是下一項在控制的,所以又 05/07 14:44
→ wohtp : 要再噴掉額外的八位有效位數才能開始看到這個。 05/07 14:45
→ wohtp : 所以你需要遠多出16的有效位數才能精確計算 0.0001 05/07 14:46
→ wohtp : 附近的函數走向 05/07 14:46
→ wohtp : 但是32bit double也不過給你16位數,爆炸很正常 05/07 14:47
→ kerwinhui : 是64bit double吧?32bit是single (Cray除外) 05/07 20:46
推 t0444564 : 好像有道理耶Q 05/07 23:51
→ wohtp : 好唄我記錯了是64bit 05/08 00:45
→ wohtp : 不過16位數沒錯,所以以上推論還是對的 05/08 00:46
→ wohtp : 如果你要用電腦計算這個函數在 |x| < 0.0001 與極限 05/08 00:53
→ wohtp : 值的差異,正確的做法是用手先幫電腦減掉1/2,然後 05/08 00:54
→ wohtp : 級數展開到 x^6,這樣你才可以保住全部16個有效位數 05/08 00:55
→ kerwinhui : 我猜原PO是直接叫log(1+x^2)而非log1p(x^2) 05/08 15:26
→ wohtp : 其實我也是直接叫log(1+x^2),不過wolframe alpha 05/08 22:15
→ wohtp : 夠聰明的樣子 XD 05/08 22:15
→ wohtp : 如果那個 1 也有差的話,還要再多噴掉x^2有效位數 05/08 22:16
→ wohtp : 那應該會更早爆炸 05/08 22:16
→ wohtp : 所以我恨死數值計算了,明明數學都是對的,搬到電腦 05/08 22:19
→ wohtp : 上面這裡不行那裏不行... 05/08 22:19