如何计算大数的正弦

时间:2016-07-04 21:23:41

标签: c++ math boost sine

有几天,我一直在想如何计算大约100000!(弧度)的大数字正弦。阶乘只是一个例子,数字本身可以是任何不仅仅是一个因子产品...)我显然不使用来自boost multiprecision库的doublecpp_rational。但我不能简单地执行100000! mod 2pi,然后使用内置函数sinl(我不需要超过10位十进制数字......),因为我需要数百万pi的数字准确地做到这一点。

有没有办法实现这个目标?

4 个答案:

答案 0 :(得分:5)

这通常是一项非常重要的任务,因为它与Discrete Logarithm Problem有许多相似之处,这反过来意味着计算密集型计算。
也就是说,如果你考虑100000!/pi的对数,你的计算可能会更容易,因为它减少到等于或小于100000的所有正整数的对数和减法:{{1} }。如果您对此数字进行取幂,则会对log(N!/pi) = \sum_{i=0}^N (log i) - log(pi)进行近似评估。减去整数部分,并将结果乘以(N!/pi)。这是您pi的估算值 在公式中:

正如您可能注意到的那样,我多次使用 approximate 这个词。这是由于以下考虑因素:

  • 你必须计算许多N! mod pi s,它们有一些成本和错误
  • 根据您的问题规模,您可能想要更改日志的基础;这又会影响结果的准确性和精确度
  • 你必须取代:小错误可能导致大错误
  • 减去大数:可能导致大量取消
  • 乘以log并评估pi:再次出错

如果您认为它可能有用,请考虑使用Stirling's approximation

作为最后的评论,这些问题并不容易解决,你总是要逐个处理它们。

答案 1 :(得分:0)

Wikipedia列出了许多三角标识。一些包含参数中的产品,例如递归的Chebyshev's Method,但可以使用Chebyshev Polynomials和/或memoization减少递归。如果你的论证很容易作为因子考虑因素,那么这可能是一种可行的方法。

答案 2 :(得分:0)

注意:= pi

以弧度计算非常大数的罪 (将它们除以multip的倍数除以3.1415)
1.观察:sin 0 = 0,sin 0.5pi = 1,sin pi = 1,sin1.5pi = -1,sin 2pi = 0
2.在pi前面的偶数或奇数整数值,sin为0
3.对于实数值(具有小数点的那些),对于小数点前的偶数,将其作为正弦值的0作为奇数,然后取1.作为正弦值的东西。
4.参见示例 *请注意,sin和余弦本质上是周期性的,这就是为什么有可能以这种方式对大数或小数进行。 :)

EG。 (使用计算器检查计算结果)

1.0弧度:罪100 = -0.506
除以3.1415
在降低 Sin 31.831pi(31.831是实数值)= sin1.831(180)= -0.506,检查

2.0弧度:罪50 = -0.2623
除以3.1415
在降低 Sin 15.9155pi = sin1.9155(180)= -0.2623

3.0弧度:罪700 = 0.5439
除以3.1415
在降低 Sin 222.8169pi = sin0.8169(180)= -0.5440,检查

4.0弧度:sin 15000 = 0.8934
除以3.1415
在降低 Sin 4774.6483pi = sin0.6483(180)= 0.893,检查

您可以看到使用弧度计算器直接计算值来检出所有答案。希望这有用。

如果你想写出一个计算程序,那么最好算一下算法。

答案 3 :(得分:-3)

也许您可以使用cpp_rational直接从非常大的数字计算窦:

sin(x): x/1! - x^3/3! + x^5/5! - x^7/7! + ...

重复此系列,直到没有(针对您的应用)发生重大变化。这样就可以完全避免使用数字pi。