Konstigt matte resultat i python

Här diskuteras programmering och utveckling
Användarvisningsbild
Rasmus
Inlägg: 2291
Blev medlem: 07 sep 2006, 18:33
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Svalsta

Konstigt matte resultat i python

Inlägg 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)
gusnan
Inlägg: 348
Blev medlem: 17 jan 2007, 08:20
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

Re: Konstigt matte resultat i python

Inlägg av gusnan »

Det har med binära talsystemet att göra - se

http://stackoverflow.com/questions/1089 ... -in-binary (engelska)
Användarvisningsbild
Rasmus
Inlägg: 2291
Blev medlem: 07 sep 2006, 18:33
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Svalsta

Re: Konstigt matte resultat i python

Inlägg 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?
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Konstigt matte resultat i python

Inlägg 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
Användarvisningsbild
Rasmus
Inlägg: 2291
Blev medlem: 07 sep 2006, 18:33
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Svalsta

Re: Konstigt matte resultat i python

Inlägg 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.
Skriv svar

Återgå till "Programmering och webbdesign"