Question

Toutes les fonctions mathématiques en JavaScript utilisent radians en place des diplômes. Pourtant, ils sont soit inégale, ou je suis tout à fait farfelu.

La conversion de degrés en radian est:

var rad = angle * Math.PI / 180

Un angle de 90 degrés est égal à 1,57079633 radian

Le cosinus d'un angle de 90 degrés est égal à 0.
Le cosinus d'un 1.57079633 radian égale -3,20510345 × 10-9.

Notez que dans le Javascript, tout est fait en une seule étape pour éviter les erreurs d'arrondi:

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

Il me manque évidemment quelque chose d'évident ici, mais le garçon est vissant le code.

Était-ce utile?

La solution

  

tout est fait en une seule étape pour éviter les erreurs d'arrondi

Comment éviter que des erreurs d'arrondi? Il signifie simplement que les erreurs d'arrondi ne sont pas disponibles dans une variable séparée, c'est tout.

true valeur de pi ne peut pas représenter fidèlement un nombre à virgule flottante, de sorte que la vraie valeur de pi / 2 ne peut pas non plus. Donc, vous ne pouvez pas donner Math.cos la valeur exacte nécessaire pour obtenir 0. Mais bon - 10 -9 est un très, très petite nombre. Cela signifie que si vous dessiniez une ligne de 10.000 kilomètres de long, vous finiriez virant 1cm loin de l'axe concerné.

Ceci est exactement le genre de chose que vous devriez vous attendre lorsqu'ils traitent avec des nombres à virgule flottante. Ne comparez pas avec l'égalité -. Comparer à l'intérieur une certaine tolérance

Autres conseils

Il y aura toujours des erreurs d'arrondi. Et virgule flottante n'est pas mathématiquement précise de toute façon, il est seulement précis à un certain nombre de chiffres significatifs.

Modifier votre code afin qu'il ne « bousiller » lorsque vous avez des erreurs dans l'ordre de 1/1000000000.

Pour la plupart d'entre nous faire des sommes sérieux sur les ordinateurs 0 IS égal à -3,20510345 × 10 ^ -9 à un degré raisonnable de l'exactitude que vous disposez d'un droit d'attendre quand on travaille avec à virgule flottante Nombres. Ceci est un sujet qui est couvert régulièrement sur le SO.

Oui, vous êtes juste de perdre des données sur les conversions de type ici.

90 degress en radians ne correspond pas exactement à 1,57079633. S'il y avait des endroits les plus décimales, qui convertirait le dos droit comme prévu.

Vous devez toujours être prudent avec les choses comme ça. Comme mentionné ci-dessus, la 10 ^ -9 est suffisamment proche de zéro.

Il est également tenu de MSDN :

  

En outre, le résultat des opérations arithmétiques et d'affectation des valeurs doubles peut différer légèrement par la plate-forme en raison de la perte de précision du type Double. Par exemple, le résultat d'attribuer une valeur double littérale peut différer dans les versions 32 bits et 64 bits du .NET Framework. L'exemple suivant illustre cette différence lorsque la valeur littérale de -4.42330604244772E-305 et une variable dont la valeur est -4.42330604244772E-305 sont affectés à une variable double. Notez que le résultat de la méthode Parse (String) dans ce cas, ne souffre pas d'une perte de précision.

Dans les ordinateurs, n / 2 radians ne peuvent pas exactement égale à 90 degrés, parce que p est un nombre infiniment long. Par conséquent, on ne peut pas attendre presicion parfaite avec p, à moins que l'ordinateur est 8 bits.

Je viens de réaliser:

-3,20510345 × 10-9 est le même que -0,00000000320510345, qui est très proche de zéro.

La conversion de Google à radian est arrondie et que l'arrondi provoque la err.

Je pense que Javascript, qui est connu pour son manque de précision avec des nombres, crée également un radian incorrect, et donc son CoSign est loin.

Je ne sais pas comment je résous ce bien -. Arrondi n'est pas acceptable, car cela ne fonctionnerait pas pour d'autres angles

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top