b'\n_START_ARTICLE_\nZwevendekommagetal\n_START_SECTION_\nComputers\n_START_PARAGRAPH_\nHet gegevenstype dat zwevendekommagetallen voorstelt, wordt opgeslagen in een vast aantal bits. De notatie als zwevendekommagetal maakt het mogelijk getallen van verschillende orden van grootte op te slaan. Niet ieder getal is echter als zodanig representeerbaar, zodat er in bijna alle gevallen een afrondfout is.\n_START_SECTION_\nZwevendekommagetallen als foutbron\n_START_PARAGRAPH_\nOm deze reden is het niet aan te raden twee zwevendekommagetallen direct met elkaar te vergelijken, zoals in het volgende voorbeeld, dat in C is geschreven:_NEWLINE_#include <math.h>#include <stdio.h>int main(void){_NEWLINE_  float foo = 2 * M_PI /  3;_NEWLINE_  float bar = 8 * M_PI / 12;_NEWLINE_  /* FOUT */_NEWLINE_  if (foo == bar)_NEWLINE_  {_NEWLINE_    printf("ja, hij doet het\\n");_NEWLINE_  }_NEWLINE_  return 0;}_NEWLINE_Nog erger is het in een lus:_NEWLINE_#include <math.h>#include <stdio.h>int main(void){_NEWLINE_  float foo;_NEWLINE_  float bar = 8 * M_PI / 12;_NEWLINE_  /* FOUT */_NEWLINE_  for (foo = 0.0; foo != bar; foo += M_PI / 10)_NEWLINE_  {_NEWLINE_    printf("En nog een keer...\\n");_NEWLINE_  }_NEWLINE_  return 0;}_NEWLINE_Omdat de niet-significante bits wel verschillen, maar toch worden meegenomen in de vergelijking, kunnen foo en bar van elkaar verschillen. Dit levert bijna gegarandeerd niet het resultaat waar men op rekent. Erger nog, het kan op verschillende computers verschillend gedrag vertonen._NEWLINE_Een correcte manier om twee zwevendekommagetallen met elkaar te vergelijken is:_NEWLINE_#include <math.h>#include <stdio.h>#define EPSILON  (1E-10)int main(void){_NEWLINE_  float foo = 2 * M_PI /  3;_NEWLINE_  float bar = 8 * M_PI / 12;_NEWLINE__NEWLINE_  if (abs(foo - bar) < EPSILON)_NEWLINE_  {_NEWLINE_    printf("natuurlijk doet hij het...\\n");_NEWLINE_  }_NEWLINE_  return 0;}_NEWLINE_Als de absolute waarde van het verschill tussen foo en bar kleiner is dan een schatting van de maximale fout, zijn ze aan elkaar gelijk. Deze fout, epsilon (), verschilt per toepassing, aangezien de aard van de toepassing en de berekeningen die deze met zich meebrengt, de cumulatieve fout bepaalt._NEWLINE_Een andere bron voor vreemde resultaten is het aftrekken van twee waarden die bijna aan elkaar gelijk zijn. Aangezien de meer significante cijfers aan elkaar gelijk zijn, blijft in het resultaat een veel geringer aantal, of zelfs helemaal geen, significante cijfers over. Men spreekt in dit geval van een "gedegenereerd getal"._NEWLINE_#include <stdio.h>int main(void){_NEWLINE_  float foo = 1.000001E-12;_NEWLINE_  float bar = 1.000002E-12;_NEWLINE__NEWLINE_  printf("%g\\n", (bar - foo));_NEWLINE_  return 0;}_NEWLINE_Levert onverwachte resultaten:_NEWLINE_$ ./try_float_NEWLINE_9.75782e-19_NEWLINE_Dus niet 10\xe2\x81\xbb\xc2\xb9\xe2\x81\xb8, zoals eigenlijk zou moeten. De oorzaak is dat 1.000001E-12 en 1.000002E-12 intern niet representeerbaar zijn en daarom worden afgerond, en dat vervolgens deze afrondfouten doorwerken in het verschil; de resulterende fout is relatief groot in gevallen waarbij de absolute waarde van het resultaat veel kleiner is dan die van de oorspronkelijke getallen, zoals hier.\n_START_SECTION_\nIn het algemeen\n_START_PARAGRAPH_\nEen zwevendekommagetal  kan in een systeem met grondtal  worden gerepresenteerd door twee getallen  en , namelijk als . In elk dergelijk systeem wordt een basis (grondtal of radix)  gekozen en een nauwkeurigheid  (het aantal cijfers dat moet worden opgeslagen).  (de significant of mantisse) is een -cijferig getal van de vorm  (waarin elk cijfer  een geheel getal is uit het interval van 0 tot en met ). Als het eerste cijfer van  ongelijk is aan 0, wordt het getal genormaliseerd genoemd. Veel systemen gebruiken een aparte tekenbit (, die \xe2\x88\x921 of +1 representeert) en vereisen dat  niet-negatief is. Daarbij is  de exponent._NEWLINE_Deze methode maakt het mogelijk dat een groot bereik aan waarden wordt gerepresenteerd binnen een gegeven veldgrootte, wat niet mogelijk is in een vastekommanotatie._NEWLINE_Voorbeeld: een zwevendekommagetal met vier decimale cijfers ( en een exponentbereik van \xc2\xb14 kan worden gebruikt om 43210, 4,321, of 0,0004321 te representeren, maar heeft niet genoeg nauwkeurigheid om 432,123 en 43212,3 te representeren (wat afgerond zou worden tot 432,1 en 43210). Vanzelfsprekend is in de praktijk het aantal cijfers groter dan vier._NEWLINE_Voorts kennen zwevendekommarepresentaties vaak de bijzondere waarden +\xe2\x88\x9e, \xe2\x88\x92\xe2\x88\x9e (plus en min oneindig) en NaN (Not a Number, geen getal). Oneindigheden worden gebruikt als de resultaten te groot zijn om te worden gerepresenteerd en NaN\'s geven een ongeoorloofde bewerking aan of een uitkomst die niet is te representeren als een re\xc3\xabel getal.\n_START_SECTION_\nIEEE 754\n_START_PARAGRAPH_\nHet IEEE heeft in 1985 de standaard gedefinieerd (IEEE 754) voor het representeren van binaire zwevendekommagetallen. Er is een enkeleprecisievariant (single) van 32 bits (1 tekenbit, 8 exponentbits en 23 mantissebits) en een dubbeleprecisievariant (double) van 64 bits (1 + 11 + 52). Een re\xc3\xabel getal wordt gerepresenteerd als . We leggen hier uit hoe de enkele-precisievariant in detail werkt. De strekking van de dubbele precisie is hetzelfde.\n_START_SECTION_\nTeken, exponent en mantisse\n_START_PARAGRAPH_\nDe tekenbit is 1 voor een negatief getal en 0 voor een positief getal._NEWLINE_De exponent van 8 bits is gecodeerd met een offset van 127. Normaal representeren de 8 bits de getallen 0 (binair 00000000) tot en met 255 (11111111). Daar moet nu 127 van afgetrokken worden. Dat wil zeggen dat nu de getallen \xe2\x80\x93127 tot en met 128 weergegeven kunnen worden. Dus het getal 127 (01111111) betekent nu 0._NEWLINE_In een genormaliseerd binair getal is de eerste bit altijd 1, dus deze hoeft niet daadwerkelijk opgeslagen te worden. Dit cijfer wordt ook de \'hidden bit\' genoemd.'