Pregunta

Todas las funciones matemáticas en JavaScript utilizan radianes en lugar de grados. Sin embargo, son ya sea desigual, o estoy fuera de base.

La conversión de grados a un radián es:

var rad = angle * Math.PI / 180

A ángulo de 90 grados es igual a 1,57079633 radián

El coseno de un ángulo de 90 grados es igual a 0.
El coseno de un 1.57079633 radian es igual -3.20510345 × 10-9.

Tenga en cuenta que en el Javascript, todo se hace en un solo paso para evitar errores de redondeo:

var cos = Math.cos(angle * Math.PI / 180);

Obviamente estoy perdiendo algo obvio aquí, pero el muchacho es él para atornillar el código.

¿Fue útil?

Solución

todo se hace en un solo paso para evitar errores de redondeo

¿Cómo evitar que los errores de redondeo? Sólo significa que los errores de redondeo no están disponibles en una variable independiente, eso es todo.

La true valor de PI puede no representados con precisión como un número de coma flotante, por lo que el verdadero valor de pi / 2 tampoco. Así que no se puede dar Math.cos el valor exacto necesario para obtener 0. Pero bueno - 10 -9 es un muy, muy pequeño número. Esto significa que si estuviera dibujando una línea de 10.000 kilómetros de longitud, que terminarías virando 1 cm de distancia del eje correspondiente.

Este es exactamente el tipo de cosas que debe esperar cuando se trata de números de punto flotante. No se puede comparar con la igualdad -. Comparar dentro de una cierta tolerancia

Otros consejos

Siempre habrá errores de redondeo. Y el punto flotante no es matemáticamente exacta de todos modos, es sólo exacta a una cierta cantidad de dígitos significativos.

Cambiar su código para que no "meter la pata" cuando se tiene errores en el orden de 1/1000000000.

Para la mayoría de nosotros haciendo sumas graves en los ordenadores 0 ES igual a -3.20510345 x 10 ^ -9 a un grado razonable de la exactitud que usted tiene el derecho de esperar cuando se trabaja con coma flotante números. Este es un tema que se cubre regularmente en SO.

Sí, usted está perdiendo datos sobre las conversiones de tipos aquí.

90 Degress en radianes no es exactamente igual a 1,57079633. Si hubiera más lugares decimales, que convertiría la espalda recta como se esperaba.

Siempre se tiene que tener cuidado con este tipo de cosas. Como se mencionó anteriormente, la 10 ^ -9 está lo suficientemente cerca a cero.

también tomada de MSDN :

Además, el resultado de operaciones aritméticas y de asignación con valores Double puede variar ligeramente según la plataforma debido a la pérdida de precisión del tipo doble. Por ejemplo, el resultado de asignar un valor doble literal puede diferir en las versiones de 32 bits y 64 bits de .NET Framework. El siguiente ejemplo ilustra esta diferencia cuando el valor literal -4.42330604244772E-305 y una variable cuyo valor es -4.42330604244772E-305 se asignan a una variable doble. Tenga en cuenta que el resultado del método Parse (String) en este caso no sufre de una pérdida de precisión.

En las computadoras, pi / 2 radianes no pueden es exactamente igual a 90 grados, ya que p es un número infinitamente largo. Por lo tanto, no se puede esperar presicion perfecto con p, a menos que el equipo es 8 bits.

Me acabo de dar cuenta:

-3,20510345 × 10-9 es el mismo que -0,00000000320510345, que es muy cercano a cero.

conversiones de Google a radián es redondeada, y que hace que el redondeo err.

Mi conjetura es que Javascript, que es notoria por su falta de precisión con números, también crea un radián incorrecta, y por tanto su sirva de fiador está muy lejos.

No está seguro de cómo iba a resolver esto, sin embargo -. Redondeo no es aceptable, ya que eso no funciona para otros ángulos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top