Python:以高达 100 万位的精度计算正弦/余弦
Posted
技术标签:
【中文标题】Python:以高达 100 万位的精度计算正弦/余弦【英文标题】:Python: Calculate sine/cosine with a precision of up to 1 million digits 【发布时间】: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
模块。
calculate sine and cosine functions with precision的可能重复
你能证明任何努力实现你所链接的算法吗?
“python 任意精度”的两个前两个 dadduckgo 命中是 mpmath.org 和 pythonhosted.org/bigfloat 。看来您在询问之前甚至都懒得上网搜索。
Scott Hunter 和 euxodos:也许在发布之前阅读,我说它应该在 vanilla python 上运行,没有额外的模块。
【参考方案1】:
mpmath是这样的:
from mpmath import mp
precision = 1000000
mp.dps = precision
mp.cos(0.1)
如果无法安装 mpmath 或任何其他模块,您可以按照建议尝试多项式逼近。
Rn 是 拉格朗日余数
请注意,只要 x 远离中心 x0,Rn 就会快速增长,因此尝试计算 任意值的 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 :(以上是关于Python:以高达 100 万位的精度计算正弦/余弦的主要内容,如果未能解决你的问题,请参考以下文章
英伟达首席科学家:5nm实验芯片用INT4达到INT8的精度,每瓦运算速度可达H100的十倍...