le péché avec la série de taylor en python
C'est mon code :
import math
x=float(( input ('x ? ' )))
n = 1000 #a big number
b=0
for i in range (n):
a=(((((-1)**i))*(x**((2*i)+1)))/(math.factorial((2*i)+1)))
b+=a
print (b)
mais il ne fonctionne pas et affiche cette erreur:
"OverflowError: long int too large to convert to float"
- Quelle est la question?
math.factorial(1999)
est trop grande pour convertir un float. Il est à environ 10^5733. La valeur max defloat
estsys.float_info.max
, que je vais pari est d'environ 10^308 sur votre système. - vous pouvez calculer le
a
s en utilisant la récursivité:a[i] = -a[i-1] x**2 / 2i / (2i + 1)
- pour examaple quand je veux calculer le péché 30 mon entrée est performer 0.523 . mais il les "OverflowError: long int trop grand pour convertir flotter"
- avez-vous vu mon dernier commentaire ici ?!
- L'entrée est hors de propos, votre code calcule
factorial(1999)
(ainsi qu'un tas d'autres numéros qui sont trop gros pour convertirfloat
), indépendamment de la valeur d'entrée. Lorsque vous divisez unfloat
par un nombre entier, Python essaie de convertir l'entier à un flotteur. Il échoue.
Vous devez vous connecter pour publier un commentaire.
C'est une implémentation possible:
C'est juste pour le traçage:
Il souffre d'instabilité numérique et de dépassement de capacité, car après un certain temps (~100 boucles, dependig sur
x
)a
devient 0.réponse correcte des sinus de la série de taylor
y += ...
dans la boucle. Sinon, en dehors de quelques fautes de frappe, il semble bon.