我正在阅读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;
}
答案 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
,然后返回另一个double
或float
或long double
。
使用log
时,您基本上使用浮点数进行计算。这有一些问题。
x
大于double
或long double
可以容纳的数字,则输入无法正确投放。double
或long double
可以容纳的输出,则输出无法正确投射0.1 + 0.2 == 0.3
1.8e308
即使您没有进行数论理论计算,只想使用一些大数字(< 1.8e308
),那么您最好使用double
或long double
进行计算。与使用log
相比,速度要快得多。
如果您需要使用大数而不会丢失精度,那么您将不得不使用一些专门的库,例如gmp
或使用数组,如上所述。
答案 1 :(得分:0)
知道了。是。如果你看到5的输出,那么!所有输出必须有尾随零,但其中一些不具有。因此long double s
一定不能捕获log(.)
的完整值。 e
的非理性也是其中一个原因。