1

我正在尝试Math.pow()在 C 中进行手动操作(相当于 ),所以在这里,它是: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 更改为 a double,但我仍然失去精度。

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

4

1 回答 1

0

看来您想对 Big Integers 进行计算。Big Integer 是一个整数,其值大于2^64。计算机体系结构本身并不支持大整数,因为它们需要比 CPU 中的寄存器更多的位。在每种计算机语言中都有很多方法可以使用大整数。对于C,您将不得不使用库。

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

阅读GMP 手册以获取大量支持的功能。

与您或我在此应用程序领域中所拥有的相比,许多、许多、许多具有更明确优化重点的协作思想使 GMP 库在不损失精度的情况下尽可能高效。

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

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

于 2013-08-18T19:56:32.923 回答