几天来,我一直想知道如何计算幅度在 100000!
(弧度)左右的大数的正弦值。阶乘只是一个例子,数字本身可以是任意的,而不仅仅是阶乘积......)我显然不使用 double
而是使用来自 boost 多精度库的 cpp_rational
。但我不能简单地执行 100000! mod 2pi
然后使用内置函数 sinl
(我不需要超过 10 位十进制数字..)因为我需要几百万位 pi 才能准确地做到这一点。
有什么办法可以实现吗?
最佳答案
这通常是一项非常重要的任务,因为它与 Discrete Logarithm Problem 有很多相似之处。 ,这又意味着计算密集型计算。
也就是说,如果您考虑 100000!/pi
的对数,您的计算可能会更容易,因为它减少到等于或小于 100000
的所有正整数的对数之和,和一个减法:log(N!/pi) =\sum_{i=0}^N (log i) - log(pi)
。如果您对这个数字取幂,您将得到一个近似值 (N!/pi)
。减去整数部分,并将结果乘以 pi
。这是您的 N 的估计值!模数 pi
.
公式中:
您可能会注意到,我多次使用近似这个词。这是出于以下考虑:
- 你必须计算许多
log
,这有一些成本和错误 - 您可能想根据问题的大小更改日志的基础;这又会影响结果的准确性和精确度
- 你必须指数化:小错误可能导致大错误
- 减少大量:可能导致大量取消
- 乘以
pi
并计算sin
:再次出错
如果您认为它可能有益,请考虑使用 Stirling's approximation .
最后要说的是,这类问题没有简单的解决方案,您始终必须逐案处理。
关于c++ - 如何计算大数的正弦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38192391/