c - 为什么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
解决方案
你实际上要去
10 ** 20
,而不是10 ** 10
,因为这条线,它使用2 * n
(n
你传递去的地方10
):m=2*pow(10,2*n);
因此,即使忽略您的其他问题,这也行不通(
2 ** 64
不足以处理 20 位数字)。pow
是根据 实现的double
,double
通常只有 53 位整数精度。所以你实际上并没有得到 64 位的精度。
如果您想对超出double
准确表示的数字进行整数幂运算,则需要编写自己的基于整数的pow
.
推荐阅读
- java - 如何使用 Java 使用 S3 对象 ARN 访问 S3 对象
- java - 在 MS 365 开发计划帐户中使用 disabledPlans 的 AssignedLicense
- jenkins - 如何在 jenkins maven 工作中禁止特定的 jar 版本?
- node.js - 如何在 PostgreSQL GEOMETRY 字段上创建空间索引?
- android - android studio颤振中未显示android项目结构
- html - 如何使用 boostrap 添加侧组输入?
- reactjs - React-Player 媒体控件不适用于 react .js 的较小宽度,例如 100px
- android - 使用 Chrome Devtools CSS Grid 检查器进行远程 webview
- google-apps-script - 在 Google 工作表中启用加载项
- measurement-protocol - 标准数据报告在使用测量协议的 GA4 项目中未显示任何内容