求 开方sqrt() / 对数log() 实现的源码或思路,该如何处理
求 开方sqrt() / 对数log() 实现的源码或思路
如题
------解决方案--------------------
这个应该找数学系的牛人帮写算法的。
------解决方案--------------------
开放可以用牛顿迭代(?)那个求对数就不清楚了,数学书上好像可以用泰勒公式?自己找找吧
------解决方案--------------------
记忆中似乎有迭代公式。
------解决方案--------------------
对于log()函数有一点想法;(只能得到整数值,要更精确的话,暂时想不到了)
对于log(n,m)
首先将m转换成n进制, 然后第一个不是0的最高位所在位置数就是log(n,m)的整数值
至于如何求精确的结果,需要更专业的算法了
------解决方案--------------------
double _sqrt(double a)
{
double x1 = 0.0;
double x2 = a/2;
while(x1! = x2)
{
x1 = x2;
x2 = (x1 + a/x1)/2;
}
return x1;
}
------解决方案--------------------
可以用ln(m)/ln(n)
如果|m|> 1就化作:-ln(1/m)
然后用ln(1+x)(其中|x| <1)展开:x - x^2/2 + x^3/3 -......就和e^x展开类似
ln(m)和ln(n)一个循环求和就可以了
不过如果m或n接近1,精确比较慢,效率不定
------解决方案--------------------
傅立叶变换,泰勒展开,牛顿迭代等
如题
------解决方案--------------------
这个应该找数学系的牛人帮写算法的。
------解决方案--------------------
开放可以用牛顿迭代(?)那个求对数就不清楚了,数学书上好像可以用泰勒公式?自己找找吧
------解决方案--------------------
记忆中似乎有迭代公式。
------解决方案--------------------
对于log()函数有一点想法;(只能得到整数值,要更精确的话,暂时想不到了)
对于log(n,m)
首先将m转换成n进制, 然后第一个不是0的最高位所在位置数就是log(n,m)的整数值
至于如何求精确的结果,需要更专业的算法了
------解决方案--------------------
double _sqrt(double a)
{
double x1 = 0.0;
double x2 = a/2;
while(x1! = x2)
{
x1 = x2;
x2 = (x1 + a/x1)/2;
}
return x1;
}
------解决方案--------------------
可以用ln(m)/ln(n)
如果|m|> 1就化作:-ln(1/m)
然后用ln(1+x)(其中|x| <1)展开:x - x^2/2 + x^3/3 -......就和e^x展开类似
ln(m)和ln(n)一个循环求和就可以了
不过如果m或n接近1,精确比较慢,效率不定
------解决方案--------------------
傅立叶变换,泰勒展开,牛顿迭代等