gpt4 book ai didi

我可以在c语言中使用long double来计算整数吗

转载 作者:行者123 更新时间:2023-11-30 18:17:00 24 4
gpt4 key购买 nike

我尝试写一个阶乘函数来计算一个大数(factorial(105)),它的结果有168位,所以使用long double,但是这似乎是一个错误,不能这样使用吗?

#include <stdio.h>

long double factorial(long double n,long double base = 1){
if (n <= 1){
return 1*base;
}else{
return factorial(n-1,n * base);
}
}
int main(){
printf("%.0Lf\n",factorial(25)); // this result is correct

printf("%.0Lf\n",factorial(26));
//correct result is 403291461126605635584000000,but it return 403291461126605635592388608
return 0;
}

最佳答案

信封背面计算:25!略大于 1025;三个数量级大约为 10 位,因此即使只是为了精确表示结果,您也需要大约 83 位尾数。

鉴于 long double 在支持它的平台上,整个值通常为 80 位(不仅仅是尾数!),显然您无法有足够的尾数来以整数精度执行该数量级的计算。

但是:这里的阶乘有点神奇,因为许多因子都包含 2 的幂,只需在右侧添加二进制零,不需要尾数(它们最终会出现在指数中) )。特别是:

25! = 2   4   2   8   2    4    2    16    2    4     2    8    = 2²² · m
3 5 3 7 9 5 11 3 13 7 15 17 9 19 5 21 11 23 3 25

(m 为所有非 2 因子的乘积,即 m = 310 · 56 · 73 · 11< support>2 · 13 · 17 · 19 · 23,因此我们必须将数据有效地存储在尾数中)

因此,我们的初步估计超出了实际要求 22 位。

事实证明

log2(f) = 10·log23 + 6·log25 + 3·log27 + 2·log211 + log213 + log217 + log219 + log223 = 61.68

这确实略低于 80 位长 double (64 位)尾数的大小。但是,当您将其乘以 26(因此,排除因数 2(最终以指数形式出现)乘以 13)时,您将添加 log2(13) = 3.7 位。 61.7+3.7 是 65.4,所以从 26 开始!从那时起,您就不再具有精确执行计算的精度。

关于我可以在c语言中使用long double来计算整数吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53387206/

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