python — вычисление большого целого числа в c ++ с использованием логарифмов

Я читаю Руководство по разработке алгоритмов Стивена С. Шиена и натолкнулся на тему логарифмов. Меня просто поразило, что вместо использования 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;
}

-1

Решение

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 или используйте массивы, как вы сказали.

0

Другие решения

Понял. Да. Если вы видите результат этого, после 5! все выходы должны иметь конечные нули, но некоторые из них не имеют. Итак long double s не должен захватывать полную стоимость log(.), Иррациональность e также, безусловно, одна из причин этого.

0

По вопросам рекламы [email protected]