gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:57:28 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com