作者swind (swind)
看板java
标题Re: [问题] 不用Math函式有办法开根号吗?
时间Fri Nov 6 22:59:26 2009
我不知道原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
1F:推 hwChang:推 牛顿法 11/07 12:35