2010-06-15 23 views
5

Ho letto la maggior parte dei post qui sul punto mobile, e capisco il problema di fondo che usando IEEE 754 (e solo per la natura di memorizzare numeri in binario) certe frazioni non possono essere rappresentate. Sto cercando di capire il seguente: Se entrambi Python e JavaScript utilizzano lo standard IEEE 754, perché è che eseguendo il seguente in PythonUn'altra domanda a virgola mobile

.1 + 0,1

Risultati in ,20000000000000001 (che è quello di prevedibile)

Dove, come in Javascript (almeno in Chrome e Firefox) la risposta è 0,2

Tuttavia l'esecuzione di

.1 + .2

In entrambi lingue risultati in 0,30000000000000004

Inoltre, eseguendo var a = 0,3; in JavaScript e la stampa di risultati in 0,3

Dove come fare a = 0,3 nei risultati Python in 0,29999999999999999

Vorrei capire il motivo di questa differenza di comportamento.

Inoltre, molti dei post sul sistema operativo si collegano a una porta JavaScript di Java BigDecimal, ma il collegamento è morto. Qualcuno ha una copia?

risposta

6

facendo un = 0,3 nei risultati Python in 0,29999999999999999

Non proprio - orologio:

>>> a = 0.3 
>>> print a 
0.3 
>>> a 
0.29999999999999999 

Come si vede, stampa ing a Mostrano 0.3 - perché di default print giri a 6 o 7 cifre decimali, mentre si digita un'espressione (qui a è una variabile singola espressione) al prompt mostra il risultato con oltre il doppio delle cifre (rivelando così le limitazioni intrinseche del punto mobile).

Javascript può avere regole di arrotondamento leggermente diverse su come visualizzare i numeri e i dettagli esatti degli arrotondamenti sono sufficienti per spiegare le differenze osservate. Nota, per esempio (su un Chrome javascript console):

> (1 + .1) * 1000000000 
    1100000000 
> (1 + .1) * 100000000000000 
    110000000000000.02 

vedere? se riesci a vedere più cifre, anche le anomalie (che inevitabilmente sono ) diventano visibili.

+0

Come sempre, una risposta chiara! –

+0

Grazie! Questo aiuta a chiarirlo. – jeffmax

+0

Non l'ho ancora provato, ma il nuovo collegamento alla classe JavaScript BigDecimal è http://stz-ida.de/index.php?option=com_content&view=article&id=18:bigdecimal-unterstuetzung-fuer-javascript&catid=4: software & Itemid = 32 – jeffmax

0

Mi piacerebbe capire il motivo di questa differenza di comportamento.

  1. Sono lingue diverse.

  2. Utilizzano diversi pacchetti sottostanti.

  3. Hanno diverse implementazioni.

Quando si dice "Python" - quale implementazione stai parlando? C, Jython, IronPython? Hai confrontato ognuno di questi?

Le persone Javascript sembrano gestire le ripetute frazioni binarie in modo diverso dal modo in cui le persone di Python gestiscono le frazioni binarie ricorrenti.

A volte, Javascript elimina silenziosamente i bit di errore alla fine. A volte no.

Questa è la ragione.

Hai il codice sorgente per entrambi. Se vuoi saperne di più, puoi farlo. Conoscere il codice sorgente non cambia molto, comunque.

3

e stampa.

Possono entrambi avere la stessa rappresentazione sottostante IEEE 754, ma ciò non significa che siano costretti a stampare nello stesso modo.Sembra che Javascript stia arrotondando l'output quando la differenza è abbastanza piccola.

Con i numeri in virgola mobile, la parte importante è il modo in cui sono strutturati i dati binari, non ciò che mostra sullo schermo.

Problemi correlati