具有两个 cpp_int 值的 boost::multiprecision::pow

Posted

技术标签:

【中文标题】具有两个 cpp_int 值的 boost::multiprecision::pow【英文标题】:boost::multiprecision::pow with two cpp_int values 【发布时间】:2017-04-19 01:03:56 【问题描述】:

有没有办法使用 boost::multiprecision::pow 和两个 cpp_int 值作为参数?我在文档中可以找到的所有参数都有 cpp_int 类型的参数作为基数和 int 类型的参数。这似乎非常有限。

【问题讨论】:

这是如何限制的?你会提升到 MAXINT 之上的权力吗?怎么样? “如何”是什么意思?多精度库的意义不在于处理这样的大量数字吗? 有趣的是,超几何级数展开式可能有一个错误:coliru.stacked-crooked.com/a/6fb533f85641ff35 - 我将把它留在这里,以防您遇到此问题并想向上游报告。不过我可能会遗漏一些东西。 请说明您需要哪些附加功能。 【参考方案1】:

评论:这是如何限制的?你会提升到 MAXINT 之上的权力吗?怎么样?

: 你是什​​么意思'如何'?多精度库的意义不在于处理这样的大量数字吗?

没有。像这样的巨大数字在无损精度下几乎没有任何意义。

假设我们从一个相当小的数字开始,例如10。不适合 64 位整数的最小指数是 2^64。所以,这个数字是 10^(2^64),大约是 18446744073709551617 个十进制数字 ≈ 1.84467×10^19 个十进制数字。

假设5,000 digits per 80g page,要打印,您需要重约 1.4757×10^11 公吨的纸张。这大致相当于地球上的总生物量(≈ 8×10^13 kg)。

现在,你当然不傻,而且你不会打印它!您只需要将它安装到 RAM 中,这就是您开始为您的 7.6598 艾字节 RAM 进行众筹的原因。更别说它的供电了,因为powering that一小时的耗电量大约是7吉瓦时,相当于小男孩核弹的一半能量产量。

你能做什么

Boost Multiprecision确实允许您使用巨大整数的精确和无损表示,但是您的系统资源限制了总容量。

如图所示,超过 64 位整数的指数不适用于这些类型。

当然,您可以使用任意精度的十进制/二进制浮点表示(当然,仍然尊重物理学和经济学的限制),例如boost::multiprecision::mpf_float_1000

【讨论】:

作为熟悉大数的人,我赞成这个答案。 +1【参考方案2】:

您可以使用 boost::multiprecision::float 和相应的 boost::multiprecision::pow 实现。

【讨论】:

以上是关于具有两个 cpp_int 值的 boost::multiprecision::pow的主要内容,如果未能解决你的问题,请参考以下文章

如何从 cpp_dec_float_50 转换为 cpp_int?一般关于浮点数?

在 cpp_int 上设置位

使用 boost 库 (cpp_int) 时出现常量太大的错误

PyBind11:boost::multiprecision::cpp_int 到 Python

提升多精度 cpp_int 乘以浮点数

为啥在这里使用 boost::multiprecision::cpp_int 会影响尾调用优化