Sida 1 av 1
Konstigt matte resultat i python
Postat: 30 sep 2011, 19:46
av Rasmus
Jag brukar dra python som miniräknare eftersom det är så mycket snabbare än att leta upp den grafiska i nån meny. Men när jag satt och räknade idag fick jag två "konstiga svar", visserligen så lite "fel" att det inte spelar nån större roll men ändå intressant.
Kod: Markera allt
>>> 156 * 0.1
15.600000000000001
>>> 156 * 0.2
31.200000000000003
>>> 156 * 0.3
46.8
Som ni ser blir * 0.3 normal men både * 0.1 och * 0.2 ger ett väldigt litet decimalfel. Varför då?
Felet verkar inte upprepa sig på andra heltal än 156 (har visserligen inte testat spec. många)
Re: Konstigt matte resultat i python
Postat: 30 sep 2011, 20:11
av gusnan
Det har med binära talsystemet att göra - se
http://stackoverflow.com/questions/1089 ... -in-binary (engelska)
Re: Konstigt matte resultat i python
Postat: 30 sep 2011, 21:01
av Rasmus
Okej, tack. Det kan vara bra att hålla i minnet.
Är det likadant i alla språk? Och är det nått språk som kan få ännu märkligare företeelser?
Re: Konstigt matte resultat i python
Postat: 30 sep 2011, 22:04
av David Andersson
Rasmus skrev:
Är det likadant i alla språk? Och är det nått språk som kan få ännu märkligare företeelser?
Ja. Räkneenheten i de flesta datorer representerar flyttal med IEEE-standard (
http://sv.wikipedia.org/wiki/IEEE_754 ) och de flesta programspråk använder flyttalsrepresentation i datorn den kör på för att det är snabbast och enklast så.
Tips
Räkna med att flyttal i program aldrig är exakta. (Vissa tal är exakta, men antag alltid att de inte är det). Se till att värdet avrundas till lämpligt antal decimaler vid presentation, så ser det exakt ut för användaren. (Det är så svårt att förklara IEEE för slutanvändaren så det är okej att luras). Jämför aldrig flyttal med likhets-operation. Exempel: x och y borde vara lika
Kod: Markera allt
python
>>> x=3+0.31 # matematiskt 3.31
>>> y=3.31/144*144 # matematiskt 3.31
>>> x
3.3100000000000001
>>> y
3.3099999999999996
>>> x-y
4.4408920985006262e-16
>>> x==y # exakt jämförelse
False
>>> abs(x-y)<0.000001 # ungefärlig jämförelse
True
Re: Konstigt matte resultat i python
Postat: 01 okt 2011, 00:11
av Rasmus
Tackar. Känns som det förr eller senare hade letat sig in några riktigt luriga buggar om ni inte hade förklarat det för mig.