Есть ли способ использовать boost::multiprecision::pow с двумя значениями cpp_int в качестве параметров? Все, что я могу найти в документации, имеет параметры типа cpp_int для базы и int для экспоненты. Это кажется очень ограничивающим.
boost::multiprecision::pow с двумя значениями cpp_int
Ответы (2)
Комментарий: Как это ограничивает? Будете ли вы повышать степень выше MAXINT? Как?
Вопрос:
Что значит "как"? Разве смысл библиотек с высокой точностью не в том, чтобы обрабатывать такие огромные числа?
Нет. Такие огромные числа редко имеют смысл при точности без потерь.
Допустим, мы начинаем с достаточно небольшого числа, например 10
. Наименьший показатель степени, который не помещается в 64-битное целое число, будет 2^64. Итак, число равно 10^(2^64), что примерно равно 18446744073709551617 десятичных цифр ≈ 1,84467×10^19 десятичных цифр.
Чтобы напечатать это, вам понадобится бумага весом примерно 1,4757 × 10 ^ 11 метрических тонн, если предположить, что 5000 цифр на 80-граммовой странице. Это примерно эквивалентно общей биомассе на Земле (≈ 8×10^13 кг).
Ну, конечно, ты не глупый и не напечатаешь! Вам нужно только поместить его в ОЗУ, поэтому вы начали краудфандинг для ваших 7,6598 экзабайт ОЗУ. Не говоря уже об источнике питания для него, потому что запитывает его за один час будет стоить около 7 гигаватт-часов, что сравнимо с половиной выхода энергии ядерной бомбы Little Boy.
Что ты можешь сделать
Boost Multiprecision действительно позволяет вам использовать точное и без потерь представление огромного целого числа, но ресурсы ваших систем ограничивают общую емкость.
Как показано, показатели степени, превышающие 64-битные целые числа, не имеют смысла для этих типов.
Конечно, вы можете использовать десятичное/двоичное представление с плавающей запятой с произвольной точностью (конечно, с учетом ограничений физики и экономики), например boost::multiprecision::mpf_float_1000
.
Вы можете использовать boost::multiprecision::float и соответствующие реализации boost::multi Precision::pow.