c++ - 如何计算大数的正弦

标签 c++ math boost trigonometry

几天来,我一直想知道如何计算幅度在 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/

相关文章:

c++ - ECDSA 未正确签名/验证

math - 两个圆之间的交面积

c++ - boost/Netbeans : Recursive Includes Related to BSD on Linux Mint 17. 2

c++ - 为什么 nvcc 无法使用 boost::spirit 编译 CUDA 文件?

c++ - 限制 boost make_shared 采用的参数

c++ - 集合中的随机元素

c++ - MAC OS Eclipse C++ 启动二进制文件失败

c++ - FreeGlut(类似于 OpenGL)正在拍摄我的桌面而不是绘制形状

database - 什么是检查一个数字是否存在于多个集合中而不搜索所有集合的好算法?

java - 如何在java中使用高斯分布计算靶心上的随机点