【问题标题】:Python: Calculate sine/cosine with a precision of up to 1 million digitsPython:以高达 100 万位的精度计算正弦/余弦
【发布时间】:2017-07-18 14:28:14
【问题描述】:

问题是不言自明的。我已经看到了几个 pi 的例子,但没有看到 trigo 函数的例子。也许可以使用泰勒系列as done here,但我不完全确定如何在 python 中实现它。尤其是如何存储这么多数字。 我应该提一下:理想情况下,这将在 vanilla python 上运行,即没有 numpy 等。

谢谢!

编辑:如前所述,我知道之前有人问过这个问题,但它是在 java 中,我正在寻找一个 python 实现:)

编辑 2:哇,我不知道这里的人可以如此自私。我确实尝试了几种方法,但没有一个可行。我以为这是一个你可以寻求建议的地方,我猜我错了

最后一次编辑:对于任何可能觉得这很有用的人:许多角度可以计算为 sqrt(2)、sqrt(3) 和 Phi (1.61803..) 的倍数,因为这些数字广泛可用,精度高达10mio 数字,将它们放在文件中并直接在程序中读取它们很有用

【问题讨论】:

  • 你应该检查decimal模块。
  • 你能证明任何努力实现你所链接的算法吗?
  • “python 任意精度”的两个前两个 dadduckgo 命中是 mpmath.orgpythonhosted.org/bigfloat 。看来您在询问之前甚至都懒得上网搜索。
  • Scott Hunter 和 euxodos:也许在发布之前阅读,我说它应该在 vanilla python 上运行,没有额外的模块。

标签: python trigonometry


【解决方案1】:

mpmath是这样的:

from mpmath import mp
precision = 1000000
mp.dps = precision
mp.cos(0.1)

如果无法安装 mpmath 或任何其他模块,您可以按照建议尝试多项式逼近。

Rn拉格朗日余数

请注意,只要 x 远离中心 x0Rn 就会快速增长,因此尝试计算 任意值的 sin(x)cos(x) 时小心使用 Maclaurin 级数(以 0 为中心的泰勒级数) x.

【讨论】:

    【解决方案2】:

    试试这个

    import math
    from decimal import *
    
    
    def sin_taylor(x, decimals):
        p = 0
        getcontext().prec = decimals
        for n in range(decimals):
            p += Decimal(((-1)**n)*(x**(2*n+1)))/(Decimal(math.factorial(2*n+1)))
        return p
    
    
    def cos_taylor(x, decimals):
        p = 0
        getcontext().prec = decimals
        for n in range(decimals):
            p += Decimal(((-1)**n)*(x**(2*n)))/(Decimal(math.factorial(2*n)))
        return p
    
    if __name__ == "__main__":
        ang = 0.1
        decimals = 1000000
        print 'sin:', sin_taylor(ang, decimals)
        print 'cos:', cos_taylor(ang, decimals)
    

    【讨论】:

      【解决方案3】:
      import math
      x = .5
      def sin(x):
          sum = 0
          for a in range(0,50): #this number (50) to be changed for more accurate results
              sum+=(math.pow(-1,a))/(math.factorial(2*a+1))*(math.pow(x,2*a+1))
          return sum
      
      ans = sin(x)
      print(str.format('{0:.15f}', ans)) #change the 15 for more decimal places
      

      这是一个使用上面建议的 python 实现泰勒级数的示例。之后改成cos就不会太难了。

      编辑:

      在最后一行的格式中添加,以便实际打印出更多小数位。

      【讨论】:

      • OverflowError: long int too large to convert to float when try your code with range 0 to 500 :(
      猜你喜欢
      • 2017-10-06
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 2015-05-24
      相关资源
      最近更新 更多