免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9049 | 回复: 6
打印 上一主题 下一主题

[算法] 求助~如何计算高精度开方的算法~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-17 06:49 |只看该作者 |倒序浏览
比如根号2,要精确到小数点后1000位以上的算法~

曾经考虑用笔算的算法,但精度不够~郁闷~

论坛徽章:
0
2 [报告]
发表于 2005-06-17 13:36 |只看该作者

求助~如何计算高精度开方的算法~

楼主是干什么用的阿?
#include <math.h>;
{
……
a=sqrt(2)
}这样还用什么算法吗?有不是在考高等数学。

论坛徽章:
0
3 [报告]
发表于 2005-06-18 09:34 |只看该作者

求助~如何计算高精度开方的算法~

楼主要的是小数点后面1000位,直接sqrt用double也就15位吧

好像有现成的处理大数的程序,基本思想都是用字符串吧
然后自己写一遍计算机计算开方的程序,无穷级数。。。
应该可以实现了

随口说的,可能有未知问题。。。楼主实现了贴心得上来=,=

论坛徽章:
0
4 [报告]
发表于 2005-06-18 10:23 |只看该作者

求助~如何计算高精度开方的算法~

利用 (10*a + b)* (10*a + b) = 100*a*a + 20*a*b + b*b
直接计算, eg. 121 = 100 + 21 = 100*1*1 + 20*1*1 + 1*1
计算机是2进制可改用 (2*a + b)* (2*a + b) = 4*a*a + 4*a*b + b*b

unsigned int SqrRoot(unsigned int n)
{
unsigned int m, q, t;
m=q=0;
    for (int i=0;i<16;i++) {
        q=(q<<2)|((n>;>;(30-(i<<1)))&3);
        m<<=1;
        t=(m<<1)|1;
        if (t<=q) {
            m|=1;
            q-=t;
        }
    }
    return m;
}

上面只用了一个unsigned int去作, 改成数组便成.

论坛徽章:
0
5 [报告]
发表于 2005-06-18 12:18 |只看该作者

求助~如何计算高精度开方的算法~

无穷级数里面有好方法。

论坛徽章:
0
6 [报告]
发表于 2005-06-18 13:36 |只看该作者

求助~如何计算高精度开方的算法~

正数n的平方根可以通过计算一系列近似值来获得,每个近拟值都比前一个更加接近准确值.每一个近似值是1.接下来的近拟值则可以能过下面的公式来获得.
a=(a+n/a)/2

公式在这里,但怎样解决浮点数精度的问题就要问其它各位大大了

论坛徽章:
0
7 [报告]
发表于 2005-06-19 11:11 |只看该作者

求助~如何计算高精度开方的算法~

可以采用大数乘除的办法。有一个MAX???的开源数学软件可以帮你实现。有个encyptlib里面也有大数的乘除。

如果想得到2千位准确,然后将2乘10的4000次方,然后用大数除的办法可以得到你想要的结果,如果没有提供直接的开方的算法,可以用encyptlib编程,不断逼近。

如果找不到大数的算法,那就自己写,不麻烦的:)

(除法也可以用乘法代替)

我脑袋里面一片模糊,但我想能解决问题。那些名字我都忘记了:(
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP