Domanda

Tutte le funzioni matematiche in JavaScript utilizzano radianti al posto di gradi. Eppure sono sia disuguale, o io sono fuori strada.

La conversione da gradi in un radiante è:

var rad = angle * Math.PI / 180

Un angolo di 90 gradi uguale 1,57,079633 millions radianti

Il coseno di un angolo di 90 gradi uguale 0.
Il coseno di un 1.57079633 radianti uguale -3,20510345 × 10-9.

Si noti che in Javascript, tutto è fatto in un solo passo per evitare errori di arrotondamento:

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

Sono ovviamente manca qualcosa ovvio qui, ma il ragazzo è esso strizzando il codice.

È stato utile?

Soluzione

  

tutto è fatto in un solo passo per evitare errori di arrotondamento

In che modo che evitano errori di arrotondamento? Significa solo che gli errori di arrotondamento non sono disponibili in una variabile indipendente, questo è tutto.

true valore di pi non può essere rappresentato esattamente come un numero in virgola mobile, in modo che il valore reale di pi / 2 non possibile. Quindi non posso dare Math.cos il valore esatto necessario per ottenere 0. Ma hey - 10 -9 è un molto, molto piccolo numero. Ciò significa che se si stesse disegnando una linea lunga 10.000 chilometri, che ci si finisce per virando 1 centimetro di distanza dal relativo asse.

Questo è esattamente il tipo di cosa si dovrebbe aspettare quando si tratta di numeri in virgola mobile. Non confrontare con l'uguaglianza -. Confrontare entro una certa tolleranza

Altri suggerimenti

Ci saranno sempre errori di arrotondamento. E in virgola mobile non è matematicamente preciso in ogni modo, è preciso solo a un certo numero di cifre significative.

modificare il codice in modo che non "rovinare" quando si dispone di errori nell'ordine di 1/1000000000.

Per la maggior parte di noi fare gravi somme su computer 0 Uguale a -3,20510345 × 10 ^ -9 a qualsiasi ragionevole grado di precisione che si ha il diritto di aspettarsi quando si lavora con virgola mobile numeri. Questo è un argomento che è coperto regolarmente su SO.

Si, stai solo perdendo i dati sulle conversioni di tipo qui.

90 degress in radianti non è uguale a esattamente 1,57,079633 millions. Se ci fossero posti più decimali, che sarebbe convertire schiena dritta come previsto.

Avrete sempre stare attenti con cose come questa. Come accennato in precedenza, il 10 ^ -9 è abbastanza vicino a zero.

MSDN :

  

Inoltre, il risultato di operazioni aritmetiche e assegnazione con valori Double può differire leggermente da piattaforma a causa della perdita di precisione di tipo doppio. Ad esempio, il risultato di assegnare un valore Double letterale può variare nelle versioni a 32 bit e 64 bit di .NET Framework. Il seguente esempio illustra questa differenza quando il valore letterale -4.42330604244772E-305 e una variabile il cui valore è -4.42330604244772E-305 sono assegnati ad una variabile doppia. Si noti che il risultato del metodo Parse (String) in questo caso non soffre di una perdita di precisione.

Nel computer, n / 2 radianti non possono esattamente uguale a 90 gradi, a causa p è un numero infinitamente lungo. Di conseguenza, non ci si può aspettare perfetta presicion con p, a meno che il computer è 8 bit.

Ho appena realizzato:

-3,20510345 × 10-9 è la stessa -0,00000000320510345, che è molto vicino a zero.

conversioni di Google per radiante è arrotondata, e che l'arrotondamento fa sì che l'err.

La mia ipotesi è che Javascript, che è noto per la sua mancanza di precisione con i numeri, crea anche un radianti non corretta, e quindi la sua CoSign è lontano.

Non so come avrei risolvere questo anche se -. Arrotondamento non è accettabile, in quanto tale non sarebbe lavoro per altri angoli

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top