mam wpisane to w python shell:Dziwne zachowanie z pływaków i konwersji ciąg
>>> 0.1*0.1
0.010000000000000002
Spodziewałem się, że 0,1 * 0,1 nie jest 0,01, bo wiem, że 0,1 w podstawy 10 jest okresowa w bazie 2.
>>> len(str(0.1*0.1))
4
Spodziewałem się uzyskać 20, ponieważ widziałem 20 znaków powyżej. Dlaczego otrzymuję 4?
>>> str(0.1*0.1)
'0.01'
Ok, to wyjaśnia dlaczego len
daje mi 4, ale dlaczego str
powrót '0.01'
?
>>> repr(0.1*0.1)
'0.010000000000000002'
Dlaczego str
rundę, ale nie repr
? (Czytałem this answer, ale chciałbym wiedzieć, jak oni zdecydowali gdy str
zaokrągla pływaka, a kiedy nie)
>>> str(0.01) == str(0.0100000000001)
False
>>> str(0.01) == str(0.01000000000001)
True
Więc wydaje się być problem z dokładnością pływaków. Myślałem, że Python użyje pojedynczych prefiksów IEEE 754. Więc sprawdziłem to tak:
#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);
}
mam:
0.010000
0.010000
0.000100
Python daje mi:
>>> 0.01000000000001
0.010000000000009999
>>> 0.01000000000000002
0.010000000000000019
>>> 0.01*0.01
0.0001
Dlaczego Python dać mi te wyniki?
(. Używam Python 2.6.5 Jeśli znasz różnice w wersjach Pythona, chciałbym być także zainteresowany w nich).
Nie wiem, dlaczego użytkownicy usunęli swoje odpowiedzi, ale zachowanie jest wyjaśnione w [tutorialu] (http://docs.python.org/2/tutorial/floatingpoint.html) – SilentGhost
'float ('4.1') * 100 == 409.99999999999994' – Hugo