Hur representeras flytande tal?
Hur representeras flytande tal: IEEE 754 och mantissa
Att förstå hur representeras flytande tal är grundläggande för att undvika oväntade avrundningsfel vid programmering och numeriska beräkningar. Genom att sätta sig in i datorns interna minneshantering skyddar du dina applikationer mot kritiska fel. Läs vidare för att upptäcka hur standarden fungerar i praktiken.
Vad är flytande tal och varför behövs de?
Flytande tal - ofta kallade flyttal - är det primära sättet som datorer hanterar decimaltal på. Utan dem skulle programmering av allt från grafiska gränssnitt till komplexa vetenskapliga simuleringar vara omöjligt.
Datorer arbetar enbart med ettor och nollor, vilket skapar en utmaning när vi vill representera bråktal eller mycket stora tal. Det är här standarden IEEE 754 kommer in i bilden, och här är det lätt att göra fel om man inte förstår grunderna.
Grundpotensform i det binära talsystemet
Principen bakom flyttal liknar den vetenskapliga notationen i matematiken, som när man skriver 3,4 gånger 10 i potensen 3. Skillnaden är att datorer använder basen 2 i stället för basen 10. (Talet representeras alltså i binär form istället för decimal form.)
Detta innebär att ett tal delas upp i fasta delar för att hålla reda på tecken, storleksordning och de signifikanta siffrorna. Det låter enkelt - men i praktiken leder det till subtila avrundningsfel som varje utvecklare förr eller senare springer på.
IEEE 754-standarden och dess tre delar
Standarden IEEE 754 delar upp varje flytande tal i tre distinkta komponenter: teckenbit, exponent och mantissa. Denna struktur gör det möjligt att lagra både extremt stora och extremt små tal i samma minnesutrymme.
Teckenbiten (Sign)
Teckenbiten består alltid av exakt 1 bit. Den avgör om talet i fråga är positivt eller negativt. Om biten är satt till 0 är talet positivt, och om den är satt till 1 är talet negativt.
Exponenten (Exponent)
Exponenten bestämmer talets storleksordning - det vill säga var kommatecknet ska placeras. För att kunna representera negativa exponenter utan en separat teckenbit används ett så kallat bias (ett fast tilläggsvärde).
Mantissan och den dolda ettan
Mantissan (eller fraktionen) representerar talets signifikanta siffror. I binär form börjar normaliserade tal nästan alltid med en etta före kommatecknet. Standarden utnyttjar detta genom att dölja denna etta i minnet, vilket sparar värdefullt utrymme.
Specialvärden i flyttalsstandarden
Standarden reserverar specifika bitmönster för att hantera matematiska undantag. Utan dessa skulle program krascha så fort en felaktig beräkning utförs.
Dessa specialfall inkluderar: Infinity (Oändligheten): Uppstår vid exempelvis division med noll. NaN (Not a Number): Visar ogiltiga beräkningar som kvadratroten ur ett negativt tal. Noll: Eftersom ettan i mantissan är dold finns ett eget mönster för noll, vilket ger både plus-noll och minus-noll.
Varför flyttal aldrig ska användas för pengar
Eftersom datorer räknar i basen 2 kan de inte representera alla decimaltal exakt. Precis som 1 dividerat med 3 blir oändligt i basen 10, blir tal som 0,1 oändliga periodiska tal i basen 2.
Detta skapar små avrundningsfel. Om du bygger en e-handelssajt och använder representation av flyttal för att räkna ut priser, kommer du till slut att sakna ören i kassan. Använd i stället heltal (öre) eller decimaltyper med fast precision för finansiella applikationer.
Jämförelse mellan enkel och dubbel precision
De två vanligaste precisionerna för flyttal i moderna datorsystem skiljer sig åt i minnesstorlek och exakthet.Enkel precision (Single / float)
- 1 bit för att styra positivt eller negativt värde
- 8 bitar för storleksordning och bias
- 32 bitar totalt minnesutrymme
- 23 bitar för signifikanta siffror
Dubbel precision (Double / double)
- 1 bit för tecken
- 11 bitar för utökat intervall
- 64 bitar totalt minnesutrymme
- 52 bitar för högre precision
Ett klassiskt misstag med flyttal i programmering
Johan, en nybliven systemutvecklare i Göteborg, skulle skriva en enkel kalkylator och testade att addera 0,1 och 0,2 i sin kod. Han förväntade sig att få exakt 0,3.
Till sin förvåning skrev konsolen ut 0,30000000000000004. Han trodde först att det var ett allvarligt fel i programmeringsspråket och slet sitt hår i flera timmar.
Efter att ha läst på om IEEE 754 förstod han att vissa decimaltal inte kan lagras exakt i binär form, vilket leder till små avrundningsfel.
Han lärde sig att avrunda värden vid utskrift och att aldrig använda vanliga flyttal för finansiella transaktioner, vilket räddade hans nästa projekt från kritiska buggar.
Kunskap att Ta Med
IEEE 754-standardenFlyttal representeras i datorer enligt standarden IEEE 754, uppdelat i teckenbit, exponent och mantissa.
Basen 2 skapar avrundningsfelEftersom datorer räknar binärt kan vissa vanliga decimaltal inte lagras helt exakt.
Undvik flyttal för pengarAnvänd aldrig flyttal till valutor eller finansiella system där exakthet är ett absolut krav.
Behöver Veta Mer
Varför blir 0,1 + 0,2 inte exakt 0,3 i datorer?
Det beror på att det decimala talet 0,1 blir en oändlig periodisk sekvens i det binära talsystemet. När datorn tvingas avbryta och avrunda för att få plats i minnet uppstår ett litet avrundningsfel.
Vad är skillnaden mellan enkel och dubbel precision?
Enkel precision använder 32 bitar och ger lägre noggrannhet, medan dubbel precision använder 64 bitar och ger betydligt högre precision samt ett större talintervall.
Vad betyder NaN i flyttalsberäkningar?
NaN står för Not a Number och uppstår när en beräkning är matematiskt ogiltig, till exempel om man försöker beräkna kvadratroten ur ett negativt tal.
- Hur mycket tjänar en elektriker efter 10 år?
- Måste man ändra adress hos Skatteverket?
- Måste man ha samma bank vid bolån?
- Vilket är det bästa språket i världen?
- Kan man tanka och betala med Swish?
- Hur betalar man på Circle K?
- Hur lång tid tar det att flyga från Sverige till San Francisco?
- Ska jag välja lokal valuta eller hemmavaluta?
- När är en förening bokföringsskyldig?
- Hur tankar man bensin med kort?
Feedback på svar:
Tack för din feedback! Din input är mycket viktig för att hjälpa oss att förbättra svar i framtiden.