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 远离中心 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 :(

以上是关于Python:以高达 100 万位的精度计算正弦/余弦的主要内容,如果未能解决你的问题,请参考以下文章

文章汇总索引与内容简介

快速半正弦逼近(Python/Pandas)

英伟达首席科学家:5nm实验芯片用INT4达到INT8的精度,每瓦运算速度可达H100的十倍...

英伟达首席科学家:5nm实验芯片用INT4达到INT8的精度,每瓦运算速度可达H100的十倍...

Python中的ifforwhilebreak练习题

在 ML 分类问题中以高精度预测结果