floating-pointAan de slag met drijvend punt


Opmerkingen

Deze sectie geeft een overzicht van wat drijvende komma is en waarom een ontwikkelaar het misschien wil gebruiken.

Het moet ook alle grote onderwerpen binnen drijvende komma vermelden en een link naar de gerelateerde onderwerpen. Aangezien de documentatie voor drijvende komma nieuw is, moet u mogelijk eerste versies van die gerelateerde onderwerpen maken.

Overzicht

Wat is drijvend punt?

Er zijn twee soorten nummers:

  • vast punt waar een bepaald aantal cijfers beschikbaar is voor en na het radixpunt.
  • drijvend punt waar een bepaald aantal cijfers beschikbaar is voor de mantisse en voor de exponent.

Een voorbeeld met decimale cijfers met drie cijfers achter de komma en twee cijfers achter de komma:

  • 0 zou worden weergegeven als 000,00
  • 0.123 zou worden weergegeven als 000.12
  • 0.00123 zou worden voorgesteld als 000.00
  • 1 zou worden weergegeven als 001,00
  • 1.123 zou worden weergegeven als 001.12
  • 1.00123 zou worden weergegeven als 001.00
  • 123.456 zou worden weergegeven als 123.45
  • 1234.56 is een fout omdat deze zou worden opgeslagen als 234.56 en dat is gewoon verkeerd

Een voorbeeld met decimale cijfers met vijf decimalen voor de mantisse en één decimaal voor de exponent:

  • 0 kan worden weergegeven als .00000 x 10 ^ 0
  • 0.1 kan worden weergegeven als .10000 x 10 ^ 0
  • 0.0000123456 kan worden weergegeven als .12345 x 10 ^ -4
  • 0.000000000123456 kan worden weergegeven als .12345 x 10 ^ -9
  • 0.00000000001 is een fout omdat de exponent niet groot genoeg is om het nummer op te slaan
  • 1 kan worden weergegeven als .10000 x 10 ^ 1
  • 1.123 kan worden weergegeven als .11230 x 10 ^ 1
  • 1.00123 kan worden weergegeven als .10012 x 10 ^ 1
  • 123.45678 kan worden weergegeven als .12345 x 10 ^ 2
  • 123456789.1 kan worden weergegeven als .12345 x 10 ^ 9
  • 1000000000 is een fout omdat de exponent niet groot genoeg is om het nummer op te slaan

Een getal met drijvende komma kan dus getallen met zeer verschillende groottes (0,000000000123456 en 123456789.1) vertegenwoordigen met dezelfde hoeveelheid relatieve nauwkeurigheid.

Vaste-puntnummers zijn handig wanneer een bepaald aantal decimalen altijd nodig is, ongeacht de grootte van het nummer (bijvoorbeeld geld). Drijvende-kommagetallen zijn handig wanneer de grootte varieert en de nauwkeurigheid nog steeds nodig is. Bijvoorbeeld: voor een wegenbouwer zijn afstanden gemeten in meters en 0,01 van een meter is onbeduidend, maar voor een microchipontwerper is het verschil tussen 0,0000001 meter en 0,000000001 meter enorm - en een fysicus moet misschien enorme aantallen gebruiken en heel, heel, heel kleine getallen in dezelfde berekening. Nauwkeurigheid op veel verschillende grootten is wat drijvende kommagetallen nuttig maakt.

Hoe het werkt

Computers gebruiken geen decimalen - ze gebruiken binair getal en dat veroorzaakt problemen voor het drijvende komma omdat niet elk decimaal getal exact kan worden weergegeven door een drijvend punt en dat introduceert afrondingsfouten in de berekeningen.

Na alle voorbeelden in decimalen te hebben gedaan, is het belangrijk op te merken dat omdat ze binair zijn, in plaats van een drijvende-kommagetal op te slaan als een som van decimale breuken:

123.875 = 1/10^-2 + 2/10^-1 + 3/10^0 + 8/10^1 + 7/10^2 + 5/10^3
 

computers slaan drijvende kommagetallen op als een som van binaire breuken:

123.875 = 1/2^-6 + 1/2^-5 + 1/2^-4 + 1/2^-3 + 1/2^-1 + 1/2^0 + 1/2^1 + 1/2^2 + 1/2^3
 

Er zijn veel verschillende manieren om bitpatronen op te slaan die deze breuken vertegenwoordigen, maar degene die de meeste computers nu gebruiken, is gebaseerd op de IEEE-754-standaard. Het heeft regels voor het opslaan van zowel decimale als binaire representaties en voor gegevenstypen van verschillende grootte.

De manier waarop normale nummers worden opgeslagen met behulp van de IEEE-standaard is:

  • één bit voor het teken - opgeslagen in de MSB, 1 betekent negatief en 0 betekent positief
  • enkele bits voor de exponent - de afwijking wordt afgetrokken om zowel positieve als negatieve exponenten te krijgen
  • enkele bits voor de mantisse - cijfers achter de komma met een impliciete 1 voor de komma.

Om een meer geleidelijke onderloop mogelijk te maken, worden gedenormaliseerde getallen (wanneer de exponent-bits allemaal nul zijn) speciaal behandeld: de exponent wordt ingesteld op -126 en de impliciete leidende 1 voordat de decimale plaats NIET wordt toegevoegd aan de mantisse.

32 bit IEEE-754 Floating Point Numbers

Voor een normaal 32-bits IEEE-754 drijvend puntnummer:

  • bit 32 is het teken
  • bits 24-31 zijn de exponent - de afwijking is 127
  • bits 1-23 zijn de mantisse

Dus een normaal aantal wordt berekend als:

-1^sign * 2^(exponent-bias) * 1.mantissa
 

Als het bitpatroon was:

0 10000101 11101111100000000000000
 

Dan is de waarde:

-1^0 * 2^(133-127) * 1.111011111
-1^0 *     2^6     * (1 + 1/2 + 1/4 + 1/8 + 1/32 + 1/64 + 1/128 + 1/256 + 1/512)
   1 *      64     * 991/512
         123.875
 

Er zijn enkele speciale waarden:

0 11111111 11111111111111111111111 = NaN
0 11111111 00000000000000000000000 = +infinity
1 11111111 00000000000000000000000 = -infinity
0 00000000 00000000000000000000000 = +Zero
1 00000000 00000000000000000000000 = -Zero
 

Bijzonderheden over het 32-bits IEEE-754-formaat zijn te vinden op: