Как избежать катастрофической отмены для небольших чисел в f(x) = (1-cos(x))/x**2 в Python 3.7?
Это то, что я пытался до сих пор (ключ, я знаю, это некоторая тригонометрическая идентичность, которая позволяет вам избежать сокращения, и я также знаю, используя правило Лопиталя, что предел → 0 для f (x) равен 0,5 , поэтому правильный вывод программы очень близок к 0,5, что вы и получите, если, например, используете x = 1,2e-4, но вы получите отмену с меньшими числами, такими как 1,2e-8, и мне нужно сделать это так не бывает).
from math import *
def f(x): #these are all the same function using different identities
a = (1-(sin(x)/tan(x)))/(x**2)
b = (1-(sin(2*x)/(2*sin(x))))/(x**2)
c = (1-((1-((tan(x/2))**2))/(1+(tan(x/2))**2)))/(x**2)
d = (sin(x)**2+cos(x)**2-cos(x))/(x**2)
e = (sin(x)**2+cos(x)**2-(sin(2*x)/(2*sin(x))))/(x**2)
return a, b, c, d, e
print(k(1.2e-8))
#Output: (0.0, 0.7709882115452477, 0.0, 0.0, 0.0) - whereas need 0.5000...
numpy
с 64-битнымfloat64
. Это может помочь с отменой. - person Tim   schedule 21.02.2021