Pyhton 10.1 + 10.2 = 20.29999
Re: Pyhton 10.1 + 10.2 = 20.29999
round() i all ära - men för vidare arbete med värdet kan float-problemet komma upp igen.
En avrundning till t.ex. 2 decimaler blir likaväl en float vilket igen ger problem med exakta värden.
En avrundning till t.ex. 2 decimaler blir likaväl en float vilket igen ger problem med exakta värden.
- Lennart Aspenryd
- Tidigare Lasp
- Inlägg: 12607
- Blev medlem: 1 juli 2011, 19:09:09
- Ort: Helsingborg
Re: Pyhton 10.1 + 10.2 = 20.29999
De kan ju bara ettor och nollor! Så vad kan du förvänta dig?
Eller som en jornalist skrev inför milleliumskiftet. Det blir värre när de skall få plats med tvåor också!
Eller som en jornalist skrev inför milleliumskiftet. Det blir värre när de skall få plats med tvåor också!
Re: Pyhton 10.1 + 10.2 = 20.29999
Datorer ÄR bra på att räkna, men det är inte alltid programmerarna har koll på numeriken. Många är de som trott att flyttal är "rätt" och därefter gått på pumpen.
64-bitars IEEE-flyttal är en bra kompromiss, men man måste minnas att de är just det, en kompromiss mellan hastighet, lagringsutrymme, energi och noggrannhet.
64-bitars IEEE-flyttal är en bra kompromiss, men man måste minnas att de är just det, en kompromiss mellan hastighet, lagringsutrymme, energi och noggrannhet.
Re: Pyhton 10.1 + 10.2 = 20.29999
Jag råkade se något som jag tyckte var tillräckligt underbart för att platsa här, även om det är en bit off topic.
Lite på tal om hastighet för flyttalsberäknngar...
Jag kom på att jag har gjort ett mattepaket för en minidator för länge sedan. sin, cos, exp och liknande. Då var det viktigt att ha koll på precisionen i flyttalsberäkningarna.
/Pi
Lite på tal om hastighet för flyttalsberäknngar...
https://www.retrotechnology.com/herbs_s ... 008fpp.pdfFLOATING-POINT PACKAGE FOR
INTEL 8008 AND 8080 MICROPROCESSO
Jag kom på att jag har gjort ett mattepaket för en minidator för länge sedan. sin, cos, exp och liknande. Då var det viktigt att ha koll på precisionen i flyttalsberäkningarna.
/Pi
Re: Pyhton 10.1 + 10.2 = 20.29999
Det här är vad jag förväntar mig att en normal dator gör om den får tid på sig. Direkt i alla programspråk.
In 2019, we calculated 31.4 trillion digits of π.
https://cloud.google.com/blog/products/ ... ogle-cloud
In 2019, we calculated 31.4 trillion digits of π.
https://cloud.google.com/blog/products/ ... ogle-cloud
Re: Pyhton 10.1 + 10.2 = 20.29999
En snävare avrundning i print.
Kod: Markera allt
from platform import python_version
print python_version()
a=10.1
b=10.2
c=a+b
print c
format_float_3 = "{:.15f}".format(c)
print(format_float_3)
Kod: Markera allt
2.7.16
20.3
20.299999999999997
1/3 med 4 decimaler blir 0.3333. Multiplicerar vi det med 3 blir det 0.9999, alltså inte 1. Tar vi n decimaler, så blir det fortfarande fel motsvarande den sista decimalen, oberoende på hur stort n vi väljer.
Utan att gå in på jee-jee flyttalsdetaljer, så har vi bara exempelvis 64 bits att tillgå, så det blir alltid en avrundning när man konverterar från decimaltal, om det inte råkar gå jämnt ut (som t.ex. 0.5 och 0.75).
Divisioner:
1/5 decimal .2 ____ 5|10 10 -- binär: .00110011001100... ______________ 101|1000 101 110 101 1000 101 110
Re: Pyhton 10.1 + 10.2 = 20.29999
Du kan titta på decimal lib
https://docs.python.org/3/library/decimal.html
https://docs.python.org/3/library/decimal.html
Re: Pyhton 10.1 + 10.2 = 20.29999
Det har inte direkt med programspråket att göra, utan snarare vilken datatyp man använder för att representera tal. De flesta vill inte ha en jätteoverhead i alla beräkningar utifall man möjligen vill beräkna pi med miljarder decimaler utan föredrar att "vanliga" beräkningar går snabbt och effektivt. Därav kompromissen. Det finns lastbilar och det finns racerbilar. De är bra på olika saker.Det här är vad jag förväntar mig att en normal dator gör om den får tid på sig. Direkt i alla programspråk.
In 2019, we calculated 31.4 trillion digits of π.
Prova räkna stora heltal med Python istället och låt dig förundras!
Re: Pyhton 10.1 + 10.2 = 20.29999
Om man för ett ögonblick bortser från dom behov som föreligger om man ska beräkna pi med miljardtals decimaler, så kanske man kan sammanfatta det ungefär så här?
I datorer är dom vanligaste talsystem som används dessa.
– Heltal.
– Flyttal.
– Decimala tal, ofta med ett fixt antal decimaler.
Typiska tillämningar, när dessa används är.
– Matematiska beräkningar där heltalsvariabler ingår.
– Fysikaliska eller tekniska beräkningar.
– När ekonomi hanteras, såsom av banker och i redovisningssystem.
Alla alternativ har styrkor och svagheter. Precisionen kan variera, men några få alternativ är väldigt vanliga.
Här är några exempel.
– 8, 16, 32 eller 64-bits heltal.
– 32 eller 64-bits flyttal.
– 64-bitars heltal, skalat t.ex. en faktor 100.
– Decimal lagring, t.ex. med 4 bit per decimal siffra.
Programmeringsspråk har ofta stöd för val av talsystem och några alternativ för noggrannhet eller max storlek på tal som kan lagras. Man väljer som programmerare efter aktuellt behov.
Det senaste så att talet representerar t.ex. ören eller cent även om det i huvudsak handlar om t.ex. kronor eller dollar.
Detta med pengar påminde mig om något "roligt" som måste ha ställt till det lite när det skulle programmeras.
Under ganska lång tid fanns både gamla mynt, där baserna var 20 och 12, och nya mynt, där basen var 100. Då fanns det gamla pence och nya pence, som hade helt olika värde.
/Pi
I datorer är dom vanligaste talsystem som används dessa.
– Heltal.
– Flyttal.
– Decimala tal, ofta med ett fixt antal decimaler.
Typiska tillämningar, när dessa används är.
– Matematiska beräkningar där heltalsvariabler ingår.
– Fysikaliska eller tekniska beräkningar.
– När ekonomi hanteras, såsom av banker och i redovisningssystem.
Alla alternativ har styrkor och svagheter. Precisionen kan variera, men några få alternativ är väldigt vanliga.
Här är några exempel.
– 8, 16, 32 eller 64-bits heltal.
– 32 eller 64-bits flyttal.
– 64-bitars heltal, skalat t.ex. en faktor 100.
– Decimal lagring, t.ex. med 4 bit per decimal siffra.
Programmeringsspråk har ofta stöd för val av talsystem och några alternativ för noggrannhet eller max storlek på tal som kan lagras. Man väljer som programmerare efter aktuellt behov.
Det senaste så att talet representerar t.ex. ören eller cent även om det i huvudsak handlar om t.ex. kronor eller dollar.
Detta med pengar påminde mig om något "roligt" som måste ha ställt till det lite när det skulle programmeras.
https://www.nottingham.ac.uk/manuscript ... money.aspxUntil 1971, British money was divided up into pounds, shillings and pence. One pound was divided into 20 shillings. One shilling was divided into 12 pennies. One penny was divided into two halfpennies, or four farthings.
Under ganska lång tid fanns både gamla mynt, där baserna var 20 och 12, och nya mynt, där basen var 100. Då fanns det gamla pence och nya pence, som hade helt olika värde.
/Pi
Re: Pyhton 10.1 + 10.2 = 20.29999
Alltså jag förstår att tal som 10/3 måste avrundas någonstans annars skulle program aldrig komma vidare.
MEN:
10.1 + 10.2 är 10.3! Det finns inget efter första decimalen så det behöver inte avrundas.
Men nu skiter jag i det för det fanns en lösning på problemet
import decimal
from decimal import Decimal
x = Decimal('0.1')
Så får man använda Decimal istället för int eller float.
När man använder den här import funktionen. Vart ligger dom här classerna som man hämtar? Sticker Pycharm ut på nätet och hämtar om man behöver något som inte är "standard" eller hur gör man?
MEN:
10.1 + 10.2 är 10.3! Det finns inget efter första decimalen så det behöver inte avrundas.
Men nu skiter jag i det för det fanns en lösning på problemet
import decimal
from decimal import Decimal
x = Decimal('0.1')
Så får man använda Decimal istället för int eller float.
När man använder den här import funktionen. Vart ligger dom här classerna som man hämtar? Sticker Pycharm ut på nätet och hämtar om man behöver något som inte är "standard" eller hur gör man?
Re: Pyhton 10.1 + 10.2 = 20.29999
För att "Import" ska fungera så behöver modulen vara med i Python installationen som man kör.
Den finns alltså redan där i din dator, men om man alltid skulle ladda alla hundratals Python
moduler med automatik, så skulle uppstarten bli seg och minnesbehovet större. Därför laddar
("importerar") man de moduler (som inte är inlänkade i grunden) vid behov.
EDIT:
Jag vet inte var decimal.py ligger i just din installation, men det kan se ut så här i en annan:
Filen decimal.py (eller .pyc, om den finns) är det som läses in då du gör "Import". Kolla gärna i filen för lite mer bakgrund och dokumentation...
Den finns alltså redan där i din dator, men om man alltid skulle ladda alla hundratals Python
moduler med automatik, så skulle uppstarten bli seg och minnesbehovet större. Därför laddar
("importerar") man de moduler (som inte är inlänkade i grunden) vid behov.
EDIT:
Jag vet inte var decimal.py ligger i just din installation, men det kan se ut så här i en annan:
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.
>>>
>>> import decimal
>>>
>>> Exit
$
$
$ dir python_root:[lib]decimal
Directory PYTHON_ROOT:[lib]
decimal.py;1 432/432 23-OCT-2014 13:26:50.52 (RWED,RWED,RE,RE)
decimal.pyc;1 333/336 4-JUL-2015 17:11:25.76 (RWED,RWED,RE,RE)
Total of 2 files, 765/768 blocks.
$
Senast redigerad av sodjan 11 juli 2022, 00:05:43, redigerad totalt 1 gång.
Re: Pyhton 10.1 + 10.2 = 20.29999
> 10.1 + 10.2 är 10.3
Ja, men om du använder float, så är 10.1 och 10.2 bara approximationer internt.
Det är inte exakt 10.1 resp 10.2 som du tycks tro...
Ja, men om du använder float, så är 10.1 och 10.2 bara approximationer internt.
Det är inte exakt 10.1 resp 10.2 som du tycks tro...
Re: Pyhton 10.1 + 10.2 = 20.29999
Begrunda mitt tidigare inlägg en gång till och notera att talen inte lagras decimalt, de lagras binärt.
\(0.2=\frac{1}{5}=\frac{0b1}{0b101}=0b0.001100110011001100110011001100110011001100110011...\)
\(0.2=\frac{1}{5}=\frac{0b1}{0b101}=0b0.001100110011001100110011001100110011001100110011...\)
Re: Pyhton 10.1 + 10.2 = 20.29999
Det är inga problem att få datorer att räkna exakt rätt med decimaler om man använder rätt verktyg, men floats och doubles är inte exakta och har aldrig varit tänkta att vara det.
Vill man representera decimaler exakt, så har man i praktiken två val - antingen hanterar man det själv med fixed point och eller så använder man GMP (med den integration man har i språket man föredrar).
Vill man representera decimaler exakt, så har man i praktiken två val - antingen hanterar man det själv med fixed point och eller så använder man GMP (med den integration man har i språket man föredrar).