gpt4 book ai didi

python正弦和余弦精度

转载 作者:行者123 更新时间:2023-12-05 07:43:16 25 4
gpt4 key购买 nike

如何提高python正余弦精度?例如,我想使用以下代码(只需为随机复向量 x 计算 y = cos(acos(x))):

import numpy as np
N = 100000
x = np.zeros(N)+1j*np.zeros(N)
for k in range(0,N):
x[k] = np.random.normal(0,500)+1j*np.random.normal(0,500)
y = np.cos(np.arccos(x))

m= np.max(np.abs(x))

print np.max(np.abs(x-y)/m)

y 必须等于 x。但我的差异大约是 1E-9。我觉得太大了。例如,对于同一测试,matlab 返回小于 1E-15。有什么方法可以提高 python 精度?谢谢!

最佳答案

在阅读本文之前:这可能不是一个正确的答案,因为它非常低效,但如果您需要额外的精度,这可能是最好的解决方案。

您可以使用 Decimal 类,您可以在其中使用您想要的任何精度进行计算(它使用字符串对象而不是整数进行计算)。

>>> from decimal import *
>>> getcontext().prec = 30
>>> Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857')

但问题是您必须实现自己的三角函数。还好python官网提供了例子:

https://docs.python.org/3/library/decimal.html#recipes

def cos(x):
"""Return the cosine of x as measured in radians.

The Taylor series approximation works best for a small value of x.
For larger values, first compute x = x % (2 * pi).

>>> print(cos(Decimal('0.5')))
0.8775825618903727161162815826
>>> print(cos(0.5))
0.87758256189
>>> print(cos(0.5+0j))
(0.87758256189+0j)

"""
getcontext().prec += 2
i, lasts, s, fact, num, sign = 0, 0, 1, 1, 1, 1
while s != lasts:
lasts = s
i += 2
fact *= i * (i-1)
num *= x * x
sign *= -1
s += num / fact * sign
getcontext().prec -= 2
return +s

请注意,这会影响程序的执行时间,因为使用字符串计算显然比使用 float 慢得多。

关于python正弦和余弦精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43848038/

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