WeHack BBS
计算sqrt(2)精确到小数点后20位 - 可打印的版本

+- WeHack BBS (https://bbs.wehack.space)
+-- 版块: 计算机技术 (https://bbs.wehack.space/forum-5.html)
+--- 版块: 程序设计讨论区 (https://bbs.wehack.space/forum-14.html)
+--- 主题: 计算sqrt(2)精确到小数点后20位 (/thread-211.html)



计算sqrt(2)精确到小数点后20位 - nadebula - 12-11-2020

书上的一道习题,本人按照作者的提示,利用前N个奇数之和等于N^2这一关系,迭代找到这样一个N值,使得前N个奇数之和,即1+3+...+(2N-1)刚好大于或者等于2*10^40,则N等于sqrt(2)精确到小数点后20位的近似值乘以10^20。本人将大数按照8个十进制位进行分段,程序写出来大概是这个样子(变量及函数名用汉语拼音表示):
代码:
#include<stdio.h>
#define YI 100000000

int jinwei(int*);

int main(void)
{
    int he[6] = {0};
    int jishu[6] = {1};
    int xushu[6] = {1};
    while(1)
    {
        for(int i = 0; i <= 2; i++)
        {
            he[i] += jishu[i];
        }
        jinwei(he);
        if(he[5] >= 2)
        {
            break;
        }
        jishu[0] += 2;
        xushu[0]++;
        jinwei(jishu);
        jinwei(xushu);
    }
    for(int i = 5; i >= 0; i--)
    {
        printf("%08d", xushu[i]);
    }
    puts("");
    return 0;
}

int jinwei(int *p)
{
    for(int i = 0; i <= 4; i++)
    {
        if(p[i] >= YI)
        {
            p[i + 1] += p[i] / YI;
            p[i] %= YI;
        }
    }
}
如果是计算sqrt(2)精确到小数点后8位的近似值,上述程序尚可在合理的时间内完成,本人尝试达到小数点后12位的精度,耗时大约一天左右。如果想要达到20位的精度,假设总耗时和迭代步数呈线性关系,总共耗时大约是十万年左右。感兴趣的可以尝试编译一下上述程序,但是不要去运行它。如有更高效的算法(高效到可以在合理的时间内达到要求的精度)可以讨论。正确答案是1.41421356237309504880