Cuando cos(x) se calcula para una cantidad razonablemente pequeña de x Se obtiene un número como 0,9999999994598649857etc; el estándar IEEE de doble precisión define una forma de redondear este número a aproximadamente 16 decimales. Así sale algo como 0,99999999999995. No he contado los dígitos, pero te haces una idea (y de todos modos, el redondeo se hace en base 2). Esto no parece catastrófico. Pero ahora reste 1 a ambos números, y verá que un enorme error relativo se ha comprometido a ese resultado. La división por x2 le da más o menos este error relativo, porque cuando x es pequeño, entonces cos(x)≈1−12x2 (según Serie Taylor ). Así que cuando x es muy pequeño, cos(x) se redondea a 1 (sin dígitos después de la coma), lo que explica la meseta en su gráfico.
Seguimiento de la petición de la OP: Para formalizar esto, dejemos fl para "aritmética de punto flotante", sea la función que redondea un número real al número máquina más cercano ( = un número representable como número IEEE de doble precisión, de los que sólo hay un número finito). Aunque tal vez no sea estrictamente preciso (puede haber optimización; puede haber cálculo de precisión extendida oculto; y el redondeo no siempre es al número más cercano de la máquina), la máquina calcula no (1−cos(x))/x2 pero fl(fl(1−fl(cos(x)))/fl(x2)), Suponiendo que se comience con x tal que x=fl(x) . La cuestión se origina en la aplicación de la fl que está marcado en rojo, porque fl(cos(x))=cos(x)(1+δ) donde |δ|≤eps≈10−16 , y eps es el menor número positivo tal que fl(1+eps)≠1. Por lo tanto, 1−fl(cos(x))=1−cos(x)+δcos(x)≈12x2+δ cuando x no es demasiado pequeño (de lo contrario fl(cos(x))=1 ). Cuando x es de orden √eps≈10−8 (como en su imagen), este resultado 12x2 está contaminado por un error absoluto de δ o un error relativo de 2δ/x2 . Así que el resultado final (1−cos(x))/x2 está contaminado por un error absoluto de δ/x2≈1 cuando x≈√eps que, de nuevo, es lo que se ve en la imagen.
ps. Ha habido consecuencias infames de la aritmética de precisión finita.
2 votos
Si se traza 1−cosx en el mismo rango de x No verás la cancelación porque es de orden x2 alrededor del origen.
0 votos
Para que nadie sospeche, como hice yo, que esto era un artefacto del programa de trazado utilizado, aquí está el mismo resultado extraño procedente de (lo que espero que sea) un programa de trazado completamente diferente: a.pomf.se/inobme.png
0 votos
Esta pregunta relacionada parece sugerir que bajo algunas condiciones el mismo problema puede se producen con 1−cosx .
10 votos
Sospecho que la máquina quería castigarte por haber utilizado la Comic Sans. ;-)
0 votos
Veo lo mismo en R. Esto apoya la idea de que esto es un problema con los números de punto flotante.
0 votos
@MichaelLugo Sé que se trata de un problema de punto flotante (de hecho, el nombre es "cancelación catastrófica", no es un nombre que me invente). Le pedía a SE que me ayudara a entender este problema conocido.
0 votos
En la actualidad, el redondeo es la única forma viable de calcular, por ejemplo, matrices grandes sobre los reales (por ejemplo, multiplicación matriz-matriz, solución de sistemas lineales grandes). Desde este punto de vista, no es un problema o una cuestión, sino una solución a un problema que resulta tener efectos secundarios. El ejemplo (1−cos(x))/x2 pretende ilustrar una de ellas.
0 votos
Wolfram|α hace exactamente lo mismo .