使用对数在c ++中进行大整数计算

时间:2015-07-15 06:55:24

标签: python c++ biginteger factorial logarithm

我正在阅读Steven S. Skiena的算法设计手册,并且遇到了对数的主题。它只是打击了我,而不是在竞争性编程中使用python进行大注入,我可以使用log(。)函数!(至少我可以在哪里)。我编写了几个程序来计算一些大整数(20位)和一个数字的阶乘(我试过30! - > 32位数)的乘积,猜猜看,答案似乎是正确的!

现在我希望你们能告诉我这个想法可以面对所有可能出现的问题吗?

我经常看到人们使用python尤其是为了处理大整数而不必使用数组。将日志用于涉及大数字的操作是一个非常简单的想法,但仍未广泛应用于此目的AFAIK。因此,如果其他人之前已经想过并试图实施它,他们可以告诉我可能面临的问题。

为了找到阶乘,我的代码是:

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

int main() {
int i = 30;
long double s = 0;
for (int j = 1; j <= i; ++j)
    s += log(j);
cout << setprecision(300) << exp(s) << endl;
    return 0;
}

2 个答案:

答案 0 :(得分:0)

log中的cmath函数已重载,并具有以下原型

     double log (double x);
      float log (float x);
long double log (long double x);
     double log (T x);     // additional overloads for integral types

log函数会将输入转换为double,然后返回另一个doublefloatlong double

使用log时,您基本上使用浮点数进行计算。这有一些问题。

  • 如果您的输入数字x大于doublelong double可以容纳的数字,则输入无法正确投放。
  • 如果输出大于doublelong double可以容纳的输出,则输出无法正确投射
  • 浮点计算不准确。试试0.1 + 0.2 == 0.3
  • 您的程序受浮点精度限制。您不能拥有无限精度的浮点数或大于1.8e308
  • 的数字

即使您没有进行数论理论计算,只想使用一些大数字(< 1.8e308),那么您最好使用doublelong double进行计算。与使用log相比,速度要快得多。

如果您需要使用大数而不会丢失精度,那么您将不得不使用一些专门的库,例如gmp或使用数组,如上所述。

答案 1 :(得分:0)

知道了。是。如果你看到5的输出,那么!所有输出必须有尾随零,但其中一些不具有。因此long double s一定不能捕获log(.)的完整值。 e的非理性也是其中一个原因。