為什麼這篇java開根號鄉民發文收入到精華區:因為在java開根號這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者swind (swind)看板java標題Re: [問題] 不用Math函式有辦法開根號嗎?時間...
我不知道原PO的數學老師有教過哪些
不過電腦老師沒教Math(),數學老師沒有教過逼近法
那真的就只能建議求Google大神瞭解一下數學原理了
不過就先不嘴砲,其實這個很好玩
我覺得用程式實現數學的一些公式與方法是非常有趣的事情
除了前面的十分逼近法之外(應該沒有記錯吧 Orz)
這邊來使用牛頓逼近法
首先 因為我們想計算根號n的近似值,所以可以考慮f(x) = x^2 - x = 0
一開始的起頭數為a,
這個數可以亂取只要在這個方程式中在根號x右側即可,
因為我先不想處理小於1的情況,所以直接取x為起頭
然後從(x,f(x))作一切線,切線跟x軸的交點b就是下一個近似值
簡化處理之後就是b = (a^2+x)/2a
然後重複上面的步驟
所以就是 c = (b^2+x)/2b
依此類推,公式找完之後就可以來實做程式了
public static void sqrt(double x)
{
double ans = x;
//當我逼近值誤差小於多少以下時候我才停止
//好吧其實我根本忘記double的精準度是多少了,所以隨便設個數 XD
//1e-10好像是1^-10的表示法 ?
while(ans*ans-x>1e-10)
ans=(ans*ans+x)/(2*ans);
return ans;
}
然後ans回傳後就是答案可以收工了
牛頓逼近法的速度非常快,弄個100000000的數字
也可以在約19次之後誤差逼近到1^-10
雖然不太健康就是,想改進的話可以想一下怎樣取第一數方便
然後這個判斷式也沒有辦法處理小於1的情況
更不用說負數會無限迴圈的問題 XD
希望原PO也可以享受寫程式的樂趣,動手試試看如何改進
以前學到找質數方法時
還會跟同學PK看誰找n以內的所以質數比較快
-------
我不會承認我是因為不能在魔獸版發文
只好來這裡回答問題 ......
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.124.181.98
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.124.181.98