2010-09-19 8 views
5

Todas las funciones matemáticas en JavaScript usan radianes en lugar de grados. Sin embargo, son desiguales o estoy fuera de la base.cos de grados que no coinciden con los cos de radianes equivalentes

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

var rad = angle * Math.PI/180 

Un ángulo de 90 grados equals 1,57079633 radián

el coseno de un ángulo de 90 grados equals 0.
el coseno de un radián equals 1,57079633 -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 chico que está arruinando el código.

Respuesta

11

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

¿Cómo se evitan errores de redondeo? Simplemente significa que los errores de redondeo no están disponibles en una variable separada, eso es todo.

El verdadero valor de pi no puede representarse con precisión como un número de coma flotante, por lo que el verdadero valor de pi/2 no puede tampoco. Por lo tanto, no puede dar Math.cos el valor exacto necesario para obtener 0. Pero hey - 10 -9 es un número muy, muy pequeño número. Significa que si estuvieras dibujando una línea de 10,000 kilómetros de largo, terminarías virando a 1 cm del eje correspondiente.

Esto es exactamente el tipo de cosas que debe esperar al tratar con números de coma flotante. No compare con la igualdad, compare dentro de cierta tolerancia.

+0

218k !? ¡No he estado prestando atención, la última vez que te vi, estabas en 10k! –

+2

Esta es mi primera pregunta que Jon Skeet consideró digna de respuesta. – SamGoody

+0

La tolerancia que mencionó Jon a menudo se conoce como epsilon en documentos formales –

1

Siempre habrá errores de redondeo. Y el punto flotante no es matemáticamente preciso de todos modos, solo es preciso para una cierta cantidad de dígitos significativos.

Cambie su código para que no se "arruine" cuando tenga errores del orden de 1/1000000000.

1

Para la mayoría de nosotros hacer sumas serias en computadoras 0 IS igual a -3.20510345 × 10^-9 en cualquier grado razonable de la precisión que tiene derecho a esperar al trabajar con números de coma flotante. Este es un tema que se cubre regularmente en SO.

-3

Me acabo de dar cuenta:

-3,20510345 × 10-9 es el mismo que -0.00000000320510345, que está muy cerca de cero.

La conversión de Google a radian se redondea, y ese redondeo causa el error.

Supongo que Javascript, que es notorio por su falta de precisión con los números, también crea un radianes incorrecto, y por lo tanto su cosign está muy lejos.

No estoy seguro de cómo resolvería esto, el redondeo no es aceptable, ya que eso no funcionaría para otros ángulos.

+2

No creo que JS sea más "notorio por su falta de precisión con los números" que cualquier otra cosa que use aritmética de coma flotante. También sería mejor si agregas esto como una edición a tu pregunta en lugar de publicarla como respuesta. –

+0

Cuando comencé a escribirlo como respuesta, no hubo otras respuestas. Y responde la pregunta: si lo hubiera agregado como edición, la gente se quejaría de que no hay una pregunta válida. – SamGoody

1

Sí, solo está perdiendo datos sobre las conversiones de tipo aquí.

90 grados en radianes no es exactamente igual a 1.57079633. Si hubiera más lugares decimales, eso convertiría directamente hacia atrás como se esperaba.

Siempre tendrá que tener cuidado con cosas como esta. Como se mencionó anteriormente, el 10^-9 está lo suficientemente cerca de cero.

también tomada de MSDN:

Además, el resultado de las operaciones aritméticas y de asignación con valores Double pueden diferir ligeramente por 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 pérdida de precisión.

0

En las computadoras, π/2 radianes no puede exactamente iguales a 90 grados, ya que π es un número infinitamente larga. Por lo tanto, no se puede esperar una precisión perfecta con π, a menos que la computadora tenga ∞ bits.

Cuestiones relacionadas