Articles

Floating-Point Numbers

waarom floating-point numbers nodig zijn

omdat het computergeheugen beperkt is, kunt u getallen niet met oneindige precisie opslaan, ongeacht of u binaire breuken of decimale getallen gebruikt: op een gegeven moment moet u de waarde afsnijden. Maar hoeveel nauwkeurigheid is nodig? En waar is het nodig? Hoeveel gehele getallen en hoeveel breukcijfers?

  • voor een ingenieur die een snelweg bouwt, maakt het niet uit of het 10 meter of 10 is.0001 meter breed – hun metingen zijn waarschijnlijk niet zo nauwkeurig in de eerste plaats.
  • voor iemand die een microchip ontwerpt, is 0,0001 meter (een tiende van een millimeter) een enorm verschil – maar ze zullen nooit te maken hebben met een afstand groter dan 0,1 meter.
  • een natuurkundige moet de lichtsnelheid (ongeveer 300000000) en de gravitatieconstante van Newton (ongeveer 0,0000000000667) samen gebruiken in dezelfde berekening.

om de ingenieur en de chip-ontwerper tevreden te stellen, moet een getalformaat nauwkeurigheid bieden voor getallen met zeer verschillende groottes. Er is echter alleen relatieve nauwkeurigheid nodig. Om de natuurkundige tevreden te stellen, moet het mogelijk zijn om berekeningen te doen waarbij getallen met verschillende groottes betrokken zijn.

in principe is het hebben van een vast aantal gehele getallen en fractionele cijfers niet nuttig – en de oplossing is een formaat met een drijvende komma.

hoe floating-point getallen werken

het idee is om een aantal twee hoofddelen samen te stellen:

  • een significand die de cijfers van het getal bevat. Negatieve betekenissen staan voor negatieve getallen.
  • een exponent die aangeeft waar het decimale (of binaire) punt is geplaatst ten opzichte van het begin van de significand. Negatieve exponenten vertegenwoordigen getallen die zeer klein zijn (dat wil zeggen dicht bij nul).

een dergelijk formaat voldoet aan alle vereisten:

  • het kan getallen weergeven op wild verschillende groottes (beperkt door de lengte van de exponent)
  • Het biedt dezelfde relatieve nauwkeurigheid op alle groottes (beperkt door de lengte van de significand)
  • het maakt berekeningen over groottes mogelijk: het vermenigvuldigen van een zeer groot en een zeer klein getal behoudt de nauwkeurigheid van beide in het resultaat.

decimale floating-point getallen hebben meestal de vorm van wetenschappelijke notatie met een expliciet punt altijd tussen het 1e en 2e cijfer. De exponent is ofwel expliciet geschreven met inbegrip van de basis, of een e wordt gebruikt om het te scheiden van de significand.

de standaard

bijna alle hardware-en programmeertalen gebruiken floating-point getallen in dezelfde binaire formaten, die zijn gedefinieerd in de IEEE 754-standaard. De gebruikelijke formaten zijn 32 of 64 bits in totale lengte:

Format Total bits Significand bits Exponent bits Smallest number Largest number
Single precision 32 23 + 1 sign 8 ca. 1.2 ⋅ 10-38 ca. 3.4 ⋅ 1038
Double precision 64 52 + 1 sign 11 ca. 2.2 ⋅ 10-308 ca. 1.8 ⋅ 10308

merk op dat er enkele eigenaardigheden zijn:

  • de werkelijke bitreeks is eerst het tekenbit, gevolgd door de exponent en ten slotte de significand bits.
  • de exponent heeft geen teken; in plaats daarvan wordt een exponent bias afgetrokken (127 voor enkele en 1023 voor dubbele precisie). Dit, en de bitsequentie, maakt het mogelijk om floating-point getallen te vergelijken en correct te sorteren, zelfs wanneer ze worden geïnterpreteerd als gehele getallen.
  • het meest significante cijfer van de significand wordt weggelaten en aangenomen dat het 1 is, behalve voor subnormale getallen die zijn gemarkeerd door een all-0 exponent en een getallenbereik toestaan buiten de kleinste getallen die in bovenstaande tabel zijn gegeven, ten koste van precisie.
  • Er zijn afzonderlijke positieve en negatieve nulwaarden, verschillend in het teken bit, waar alle andere bits 0 zijn. Deze moeten als gelijk worden beschouwd, ook al zijn hun bitpatronen verschillend.
  • Er zijn speciale positieve en negatieve oneindigheidswaarden, waarbij de exponent alle 1-bits is en de significand alle 0-bits. Dit zijn de resultaten van berekeningen waarbij het positieve bereik van de exponent wordt overschreden, of deling van een regelmatig getal door nul.
  • Er zijn speciale niet een aantal (of NaN) waarden waar de exponent is alle 1-bits en de significand is niet alle 0-bits. Deze zijn het resultaat van verschillende ongedefinieerde berekeningen (zoals het vermenigvuldigen van 0 en oneindigheid, elke berekening met een NaN-waarde, of toepassingsspecifieke gevallen). Zelfs bit-identieke NaN-waarden mogen niet als gelijk worden beschouwd.

als dit te abstract lijkt en je wilt zien hoe sommige specifieke waarden eruit zien in IEE 754, probeer dan het Float Toy, of de IEEE 754 visualisatie, of Float Exposed.