Programmeren in C/Datatypes: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
Kleuske (overleg | bijdragen)
Kleuske (overleg | bijdragen)
Regel 103:
* ''Signalling NaN'', Zodra deze variant voorkomt wordt een ''uitzondering'' gegenereerd (''an exception is raised''). Dit heeft in de regel een voortijdig afbreken van het programma tot gevolg.
 
Het is belangrijk te begrijpen dat een ''floating point''-getal niet hetzelfde is als het wiskindige concept ''Reëel Getal'' (<math>\mathbb{R}</math>). De laatstenlaatste zijnis continue, dat wil zeggen voor elk getal a en b een getal x bestaat zodat geldt:
 
<math> a < x < b </math>
Regel 130:
</source>
 
Bovenstaande code zalnietzal niet het resultaat opleveren dat de naïeve programmeur ervan verwacht, ondanks het feit dat 3*(1/3) wel degelijk 1 is. Over het algemeen kan men stellen dat het gebruik van de ''=='' (is-gelijk) operator met twee floating-point getallenuit den boze is. Dit ligt aan het feit dat een binaire representatie van 1/3 als floating point onmogelijk is en er dus een fout wordt geintroduceerd. Een hele kleine fout weliswaar (afhankelijk van de precisie van ''double'' op heet platform in kwestie, maar genoeg om de ''==is gelijk''-operator te ondermijnen. Over het algemeen kan men stellen dat het gebruik van de ''=='' (is-gelijk) operator met twee floating-point getallen uit den boze is.
 
De gebruikelijke oplossing ziet er (ongeveer) als volgt uit.
Regel 159:
</source>
 
En "''Hey, Presto!''". De code werkt zoals het de bedoeling is omdat we nu rekening houden met de inherente fout die het gebruik van floating-point getallen oplevert. Met behulp van "''fabs(x/3 - 1.0) < EPSILON''" wordt het absolute verschil uitgerekend en als dit kleiner is dan een voorgedefinieerd maximum ('''EPSILON''') zijn de twee waarden "gelijk" of in ieder geval "gelijk genoeg". In de wandeling staat deze techniek ook wel bekend als "''close-enough comparison''". Een goede waarde voor EPSILON hangt af van de toepassing en de implementatie van de compiler (dus "''[[:w:RTFM|RTFM]]''", nogmaals).
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.