首页 > 解决方案 > 为什么10位数字变成9,999,999,999?

问题描述

这是我获取 2 的根的代码

#include <stdio.h>
unsigned long long root(int n);
int main()
{
    int n,i;
    unsigned long long c;
    n=10;
    for(i=1;i<=n;i++)
    {
        c=root(i);
        printf("%d decimal digits:%llu\n",i,c);
    }
    return 0;
}

unsigned long long root(int n)
{   unsigned long long int m,d;
    d=pow(10,n);
    m=2*pow(10,2*n);
    while (pow(d,2)<=m)
    {
        d++;
    }
    return d-1;

}

Unsigned long long int 可以支持从 0 到 $2^64-1$。我认为这足以计算 10 位小数。

我希望 10 位十进制的输出应该是14142135623

标签: c

解决方案


  1. 你实际上要去10 ** 20,而不是10 ** 10,因为这条线,它使用2 * nn你传递去的地方10):

    m=2*pow(10,2*n);
    

    因此,即使忽略您的其他问题,这也行不通(2 ** 64不足以处理 20 位数字)。

  2. pow是根据 实现的doubledouble通常只有 53 位整数精度。所以你实际上并没有得到 64 位的精度。

如果您想对超出double准确表示的数字进行整数幂运算,则需要编写自己的基于整数的pow.


推荐阅读