Non proprio specifico per l'implementazione di Python ma dovrebbe applicarsi a qualsiasi float per le funzioni di stringa decimale.
Un numero in virgola mobile è essenzialmente un numero binario, ma in notazione scientifica con un limite fisso di cifre significative.
L'inverso di qualsiasi numero che ha un fattore di numero primo che non è condiviso con la base si tradurrà sempre in una rappresentazione del punto punto ricorrente. Ad esempio 1/7 ha un fattore primo, 7, che non è condiviso con 10, e quindi ha una rappresentazione decimale ricorrente, e lo stesso vale per 1/10 con i fattori primi 2 e 5, quest'ultimo non è condiviso con 2 ; ciò significa che 0,1 non può essere rappresentato esattamente da un numero finito di bit dopo il punto.
Poiché 0,1 non ha una rappresentazione esatta, una funzione che converte l'approssimazione in una stringa di punti decimali generalmente tenterà di approssimare determinati valori in modo che non ottengano risultati non intuitivi come 0.1000000000004121.
Poiché il virgola mobile è in notazione scientifica, qualsiasi moltiplicazione per una potenza della base influisce solo sulla parte esponente del numero. Ad esempio 1.231e + 2 * 100 = 1.231e + 4 per la notazione decimale e similmente, 1.00101010e11 * 100 = 1.00101010e101 nella notazione binaria. Se moltiplico per una non-potenza della base, anche le cifre significative saranno influenzate. Ad esempio 1.2e1 * 3 = 3.6e1
A seconda dell'algoritmo utilizzato, potrebbe provare a indovinare i decimali comuni basandosi solo su cifre significative. Sia 0.1 che 0.4 hanno le stesse cifre significative in binario, perché i loro float sono essenzialmente troncamenti di (8/5) (2 ^ -4) e (8/5) (2 ^ -6) rispettivamente. Se l'algoritmo identifica il modello sigfig 8/5 come il decimale 1.6, allora funzionerà su 0,1, 0,2, 0,4, 0,8, ecc. Potrebbe anche avere modelli sigfig magici per altre combinazioni, come il float 3 diviso per float 10 e altri schemi magici statisticamente probabili che si formeranno per divisione per 10.
Nel caso di 3 * 0,1, le ultime cifre significative saranno probabilmente diverse dalla divisione di un galleggiante 3 per il galleggiante 10, facendo sì che l'algoritmo non riesca a riconoscere il numero magico per la costante 0,3 a seconda della sua tolleranza per la perdita di precisione.
Modifica:
https://docs.python.org/3.1/tutorial/floatingpoint.html
È interessante notare che ci sono molti numeri decimali diversi che condividono la stessa frazione binaria approssimativa più vicina. Ad esempio, i numeri 0.1 e 0.10000000000000001 e 0.1000000000000000055511151231257827021181583404541015625 sono tutti approssimati di 3602879701896397/2 ** 55. Dal momento che tutti questi valori decimali condividono la stessa approssimazione, è possibile visualizzare uno qualsiasi di essi mantenendo comunque il valore invar ( ) == x.
Non c'è tolleranza per la perdita di precisione, se float x (0.3) non è esattamente uguale a float y (0.1 * 3), allora repr (x) non è esattamente uguale a repr (y).