ho digitato questo in shell pitone:comportamento sconosciuto con carri e conversione di stringhe
>>> 0.1*0.1
0.010000000000000002
I prevede che 0,1 * 0,1 non è 0,01, perché so che 0.1 in base 10 è periodico in base 2.
>>> len(str(0.1*0.1))
4
Mi aspettavo di ottenere 20 come ho visto 20 caratteri sopra. Perché ottengo 4?
>>> str(0.1*0.1)
'0.01'
Ok, questo spiega perché ho len
mi dà 4, ma perché str
ritorno '0.01'
?
>>> repr(0.1*0.1)
'0.010000000000000002'
Perché str
turno, ma non repr
? (Ho letto this answer, ma vorrei sapere come hanno deciso quando str
arrotonda un galleggiante e quando non lo fa)
>>> str(0.01) == str(0.0100000000001)
False
>>> str(0.01) == str(0.01000000000001)
True
Così sembra essere un problema con la precisione dei carri allegorici. Pensavo che Python usasse i float IEEE 754 single precicion. Così ho controllato in questo modo:
#include <stdint.h>
#include <stdio.h> // printf
union myUnion {
uint32_t i; // unsigned integer 32-bit type (on every machine)
float f; // a type you want to play with
};
int main() {
union myUnion testVar;
testVar.f = 0.01000000000001f;
printf("%f\n", testVar.f);
testVar.f = 0.01000000000000002f;
printf("%f\n", testVar.f);
testVar.f = 0.01f*0.01f;
printf("%f\n", testVar.f);
}
ho ottenuto:
0.010000
0.010000
0.000100
Python mi dà:
>>> 0.01000000000001
0.010000000000009999
>>> 0.01000000000000002
0.010000000000000019
>>> 0.01*0.01
0.0001
Perché Python mi danno questi risultati?
(. Io uso Python 2.6.5 Se siete a conoscenza di differenze nelle versioni di Python, vorrei anche essere interessati a loro.)
non so perché gli utenti hanno cancellato le loro risposte, ma in realtà il comportamento è spiegato in [tutorial] (http://docs.python.org/2/tutorial/floatingpoint.html) – SilentGhost
'float ('4.1') * 100 == 409.99999999999994' – Hugo