Pyhton 10.1 + 10.2 = 20.29999

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Pyhton 10.1 + 10.2 = 20.29999

Inlägg av GeekJoan »

Kan någon förklara varför det blir så här?
pyhton.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
AndLi
Inlägg: 17050
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av AndLi »

Ja, flyttal i datavärlden är inte exakt, du kan helt enkelt inte representera 20.3 utan det närmaste datorn klarar av är 20.2999999997, nära nog...

Men man får ju tänka efter lite när man jämför flyttal med varandra, == är sällan ett vinnande koncept...

https://sv.wikipedia.org/wiki/Flyttal

Så ska man skriva ut flyttal vill man gärna ha med någon typ av formatering, så hade det sett ut som datorn räknat ut det svar du ville ha...
Användarvisningsbild
pi314
Inlägg: 5680
Blev medlem: 23 oktober 2021, 19:22:37
Ort: Stockholm

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av pi314 »

Float är inte exakt.
Float i Python lagras i 64 bitar, varav 53 bitar för mantissan.
Ett 53 bitars binärt tal motsvarar ungefär 16 siffrors noggranhet.

När du skriver ut "hela" talet, får du med ända till slutet, där det finns ett litet fel.

Testa att skriv ut med:

format(sum, '.15g')

Hur blir det då?

/Pi
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av GeekJoan »

Funkar dåligt
pyhton2.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
pi314
Inlägg: 5680
Blev medlem: 23 oktober 2021, 19:22:37
Ort: Stockholm

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av pi314 »

Det ska inte vara "print format", utan bara "format"
Skärmavbild 2022-07-09 kl. 00.01.23.png
/Pi
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av GeekJoan »

format(sum, '.16g')
print(sum)


Blir samma: 20.299999999999997
Bara format... så blir det inget resultat.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43150
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av sodjan »

Det är alltid rekommenderat att visa en komplett "reproducer" som går att köra direkt utan att gissa det som saknas.
Inklusive versioner av Python som används...

EDIT: Och inga skärmkopior/klipp som det inte går att kopia text från...

EDIT2: Du ser ut att köra en V3. I V2.7.8 ger det "rätt" svar. Inte en susning varför, men:

Kod: Markera allt

$ python
Python 2.7.8 (default, Oct 31 2014, 14:12:12) [DECC] on OpenVMS
Type "help", "copyright", "credits" or "license" for more information.
>>> first = input("First:")
First:10.1
>>> second = input("Second:")
Second:10.2
>>> sum = float(first) + float(second)
>>> print first, second, sum
10.1 10.2 20.3
>>>
EDIT3:
Den naturliga frågan är så klart också, *varför* du behöver float värden.
Om du faktiskt behöver det, så betyder det också med automatik att du
inte är intresserad av exakta värden.
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av GeekJoan »

Inser att ni kör i någon texteditor som direkt kör koden. Eftersom jag försöker lära mig så kör jag PyCharm 2022.1.3, den funkar mer som när jag kodar till Arduino. Skriver koden på ett ställe och sen "kör" man koden.
Så jag håller på med denna bok nu:
learningpyhon.jpg
och i den så står det:
spam.png
Men om jag gör det i PyCharm så händer inte ett skit.
pyhton3.png
Om jag däremot gör det i terminalfönstret direkt så funkar det:
pyhton5.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av GeekJoan »

sodjan, om jag kopiera din kod så blir det så här: Fick lov att lägga till () runt print annars funkade det inte alls.
pyhton4.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av GeekJoan »

Ah, inser att om man skriver direkt i terminalfönstret så behövs inte print kommandot, den presenterar resultatet i alla fall. Vilket inte den editorn jag kör i gör.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av Icecap »

Flyttal har i alla computerbaserade ställt till det genom tiderna.

Ska man vara petig får man avrunda till känd decimal, något som Python fint klarar - eller skriva ut med formattering:

print("Sum: {1.0f}").format(Sum)

Ska man jämföra ska man kolla om skillnaden är under den acceptabel gräns, helt enligt de gällande tumregler som finns.

Detta är såklart även anledningen till att man generellt försöker jobba i heltal i μC sammanhang, behöver man högre upplösning multiplicerar man till till att närmaste heltal motsvarar lägsta decimal man vill ha.
Användarvisningsbild
rvl
Inlägg: 5721
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av rvl »

GeekJoan skrev: 9 juli 2022, 15:13:13 Men om jag gör det i PyCharm så händer inte ett skit.
pyhton3.png
Om jag däremot gör det i terminalfönstret direkt så funkar det:
pyhton5.png
Finns även Python Console (längst ned), men i editorn händer ingenting förrän du kör.
Screenshot 2022-07-09 170542.png
Ja print utan parenteser är en stor skillnad i numera nästan utdöda python 2. :vissla:

Edit: i den vanliga terminalen blir det nog inte Python, om du inte skriver python först!
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43150
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av sodjan »

Jo, "print sum" och "print (sum)" i Python 2 resp 3 ger uppenbarligen olika resultat.
Så förutom skillnaden i syntax så är det skillnad i funktion också...

Men igen, behövs verkligen float? Och som sagt, om man behöver float så
accepterar man ju även att det inte är exakt i alla lägen. Bara att gilla läget...
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av GeekJoan »

Eller varför inte bara använda round() vilket är precis vad det säger.
first = input("1:")
second = input("2:")
sum = round(float(first) + float(second), 2)
print (sum)
Användarvisningsbild
pi314
Inlägg: 5680
Blev medlem: 23 oktober 2021, 19:22:37
Ort: Stockholm

Re: Pyhton 10.1 + 10.2 = 20.29999

Inlägg av pi314 »

min slutsats av detta är:

– Om man ska använda flyttal är det bra att veta hur det fungerar.

Här är ett par exempel, som jag tycker belyser varför man måste veta vilken precision flyttal tillhandahåller.

Kod: Markera allt

>>> 
>>> x1 = 1 + 1e-15
>>> x2 = 1.0
>>> diff = x1-x2
>>> print(diff)
1.11022302463e-15
>>> 
>>> x1 = 1 + 1e-16
>>> x2 = 1.0
>>> diff = x1-x2
>>> print(diff)
0.0
>>> 
Såg just att det var en jättegammal python (2.7.10) som jag har på den här antika burken som jag sitter med just nu.
3.10.5 är väl aktuell version?

/Pi
Skriv svar