funciones coseno javascript flash actionscript-3 ecmascript-5

javascript - coseno - math.cos python



Math.cos(Math.PI/2) devuelve 6.123031769111886e-17 en JavaScript & AS3? (5)

¿Has mirado el valor que estás obteniendo? Esperas 0, pero obtienes algo así como

0.00000000000000012246063538223773

¿No es lo suficientemente cerca de cero para ti?

Básicamente, no debe esperar que las operaciones de punto flotante binario sean exactamente correctas cuando sus entradas no se pueden expresar como valores binarios exactos, lo que pi / 2 no puede, dado que es irracional. (No debe esperar que los resultados sean exactos incluso cuando las entradas se pueden expresar exactamente en binario, si la salida no se puede expresar exactamente ...)

Si entiendo esto correctamente, tanto JavaScript como ActionScript 3 funcionan con radianes.

Entonces, el resultado esperado de los siguientes códigos sería:

Math.PI //Expected 3.141592653589793, got 3.141592653589793 Math.sin(0) //Expected 0, got 0 Math.sin(Math.PI/2) //Expected 1, got 1 Math.sin(Math.PI) //Expected 0, got 1.2246063538223773e-16 Math.sin(Math.PI*3/2) //Expected -1, got -1 Math.sin(Math.PI*2) //Expected 0, got -2.4492127076447545e-16 Math.cos(0) //Expected 1, got 1 Math.cos(Math.PI/2) //Expected 0, got 6.123031769111886e-17 Math.cos(Math.PI) //Expected -1, got -1 Math.cos(Math.PI*3/2) //Expected 0, got -1.836909530733566e-16 Math.cos(Math.PI*2) //Expected 1, got 1

Este es el mismo comportamiento en Firefox, Chrome, Safari y también en Flash Professional CS5.5. Estoy usando Mac OS X 10.7.2.

Prueba:

http://jsfiddle.net/KA4VM/


Entonces tienes 1.xxxxx * 10 ^ -16

Esto sería 0.0000000000000001xxx (quince ceros después del punto decimal)

Apuesto a que es lo suficientemente cerca de cero para considerarlo como 0.

Obtienes ese error infinitesimal debido al error en el valor de pi (como deberías saber, se extiende a dígitos infinitos después del punto decimal)

No ha mencionado si obtiene esto en AS3 o JavaScript, aunque


Math.PI no es una representación 100% precisa de pi, simplemente porque pi es irracional y los números de punto flotante solo van tan lejos.

Entonces, debido a errores de redondeo, obtienes números extremadamente pequeños (tus números son #. ##### e-16 y #. ##### e-17, que son muy pequeños).

No puede hacer nada al respecto, pero acepte que 0.000000000000000006 está lo suficientemente cerca de 0.


Dado que PI es un número irracional (número real sin ser racional), es imposible calcular con el valor exacto. Como dijo Jon Skeet, los métodos trigonométricos del objeto matemático solo obtienen valores aproximados para PI y arrojan un valor aproximado. Los valores cero son importantes para su código, tiene que redondearlos. En casos como ese extiendo esos objetos Javascript por métodos propios para su conveniencia:

Math.Sin = function(w){ return parseFloat(Math.sin(w).toFixed(10)); };

Ahora mientras te haces con

Math.sin(Math.PI)

este extraño resultado

> 1.2246467991473532e-16

obtienes lo que esperabas

Math.Sin(Math.PI) > 0

Haz lo mismo con las otras funciones trigonométricas:

Math.Cos = function(w){ return parseFloat(Math.cos(w).toFixed(10)); };

y así.


Considere que estos errores son todos menos de 1e-15 , que es alrededor de 2**(-50) , por lo que podemos sumar y luego restar un número de magnitud 2**3 para redondear el resultado. Entonces, si seleccionamos 8 como el número, podríamos redefinir el sin y el cos siguiente manera:

function sin(x) { return Math.sin(x) + 8 - 8; } function cos(x) { return Math.cos(x) + 8 - 8; }

Esto debería completar el error, y es más rápido que el método toFixed .