gpt4 book ai didi

c - pow() 似乎在这里被淘汰了

转载 作者:太空狗 更新时间:2023-10-29 16:19:50 25 4
gpt4 key购买 nike

这里发生了什么:

#include <stdio.h>
#include <math.h>
int main(void) {
printf("17^12 = %lf\n", pow(17, 12));
printf("17^13 = %lf\n", pow(17, 13));
printf("17^14 = %lf\n", pow(17, 14));
}

我得到这个输出:

17^12 = 582622237229761.000000
17^13 = 9904578032905936.000000
17^14 = 168377826559400928.000000

13 和 14 与 wolfram alpa 不匹配对比:

12: 582622237229761.000000
582622237229761

13: 9904578032905936.000000
9904578032905937

14: 168377826559400928.000000
168377826559400929

此外,它不是错了一些奇怪的分数 - 它恰好是一个错误!

如果这取决于我达到 pow() 可以为我做的事情的极限,是否有替代方案可以计算这个?我需要一个可以计算 x^y 的函数,其中 x^y 总是小于 ULLONG_MAX。

最佳答案

pow 使用 double 数字。这些表示形式为 s * 2^e 的数字,其中 s 是 53 位整数。因此 double 可以存储 2^53 以下的所有整数,但只能存储 一些 2^53 以上的整数。特别是,它只能表示大于 2^53 的偶数,因为对于 e > 0,该值始终是 2 的倍数。

17^13 需要 54 位才能准确表示,所以 e 设置为 1,因此计算出的值为偶数。正确的值是奇数,所以相差 1 也就不足为奇了。同样,17^14 需要 58 位来表示。它也相差 1 是一个幸运的巧合(只要您不应用太多数论),它恰好与 32 的倍数相差 1,这就是粒度那个大小的 double 数字四舍五入。

对于精确的整数求幂,你应该一直使用整数。编写您自己的 double 自由求幂例程。如果 y 可以很大,则通过平方求幂,但我认为它总是小于 64,因此这个问题没有实际意义。

关于c - pow() 似乎在这里被淘汰了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21452711/

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