gpt4 book ai didi

c - 17 后的截断。C 上的数字

转载 作者:行者123 更新时间:2023-11-30 19:16:49 24 4
gpt4 key购买 nike

我试图在C上编写一个简单的程序,讲述国王、棋盘和米粒之间的古典历史。填满棋盘所需的米粒总数为:18 446 744 073 709 551 615

但我得到:18 446 744 073 709 552 000。在 C 上。

有没有办法提高17位分辨率?

这是我的代码。

#include <stdio.h>
#include <math.h>

int main( void )
{
double i=1.0;
while(i<=64)
{
printf("%2.0lf.Casilla = %.0lf\n", i, pow(2.0,(i-1.0)));
i++;
}
printf("\n\n***En Total = %.0lf Granos.\n\n",pow(2.0,64.0)-1);
return 0;
}

提前致谢!

最佳答案

double 精度约为 17 位十进制数字(52bit+1)。因此您将使用具有 64 位或更高精度的类型。

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

uint64_t pow_2_i(int n){//2^n
if(0 > n || n >= 64)
return 0;
uint64_t x = 1;
return x << n;
}

int main(void){
int i;
uint64_t x, sum = 0;
for(i = 1; i <= 64; ++i){
sum += (x = pow_2_i(i-1));
printf("%2d.Casilla = %" PRIu64 "\n", i, x);
}
printf("\n\n***En Total = %" PRIu64 " Granos.\n\n", sum);//No Cheat^-^
return 0;
}
<小时/>

如果long double的精度比double

#include <stdio.h>

int main( void ){
long double x=1.0;//1.0L
int i;
for(i=1; i<=64;++i){
printf("%2d.Casilla = %.0Lf\n", i, x);
x *= 2.0L;
}
printf("\n\n***En Total = %.0Lf Granos.\n\n", x-1.0L);//2^64-1:Σar^k (k=0->n) =a(r^(n+1)-1)/(r-1):1(2^(63+1)-1)/(2-1)
return 0;
}

关于c - 17 后的截断。C 上的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29388592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com