Я читаю Руководство по разработке алгоритмов Стивена С. Шиена и натолкнулся на тему логарифмов. Меня просто поразило, что вместо использования 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;
}
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
или используйте массивы, как вы сказали.
Понял. Да. Если вы видите результат этого, после 5! все выходы должны иметь конечные нули, но некоторые из них не имеют. Итак long double s
не должен захватывать полную стоимость log(.)
, Иррациональность e
также, безусловно, одна из причин этого.