gpt4 book ai didi

c - 手动 Math.pow() 使用 float 失去精度

转载 作者:太空宇宙 更新时间:2023-11-04 04:48:37 25 4
gpt4 key购买 nike

我正在尝试用 C 语言执行手动操作(相当于 Math.pow()),所以在这里,它是:41619^6

  float sum = 41619;
float a = sum;
int k;
for (k = 0; k < 5; k++) {
sum = sum * a;
}
printf("%f", sum);
// sum should be 41619 ^ 6 now

但是,我在这里失去了精度。我收到 5196966085285475633789403136,而答案应该是 5196965646007524312007756281

我尝试将 sum 更改为 double,但我仍然失去精度。

如何在不使用 Math.pow()(对于我尝试运行的测试来说太慢)的情况下实现这一点,并且不损失精度?

最佳答案

看来你想做 computations on Big Integers .大整数是一个整数,其值大于 2^64 .计算机体系结构本身不支持大整数,因为它们需要比 CPU 中的寄存器更多的位。在每种计算机语言中都有很多使用大整数的方法。对于 C ,你将不得不使用图书馆。

我推荐 GNU Multiple Precision (GMP) 库。它通常预装在大多数 C 中编译器,只需要 #include <gmp.h>和编译器标志 -lgmp .

阅读GMP manual获取大量受支持的函数。

在这个应用领域,许多很多比你我拥有更明确的优化重点的协作思想已经使 GMP 库在不损失精度的情况下尽可能高效。

需要注意的是pow()通常在协处理器中使用硬件查找表,并且仅限于 float 。对于以浮点形式表示的非常大的数字,这可能会导致明显的不精确。 Big Integer 库将使用各种数学技术来最大化计算效率而不损失精度,例如 exponentiation by squaring .

当标准轮子出现故障时,不要重新发明轮子,只需寻找一个不同的、更专业的轮子。

关于c - 手动 Math.pow() 使用 float 失去精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18301339/

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