ATS schreef op 26 januari 2004 @ 17:33:
Het resultaat is weldegelijk correct in dit geval. Hoewel het bovenstaande over de beperkingen van doubles waar is, zijn de significante cijfers gewoon correct in je berekening: als je 1,1 + 1,1 doet, dan is het resultaat natuurlijk niet nauwkeuriger dan 2,2. 2,200 is al onzin, omdat je gegeven getallen niet zo precies waren. Zelfs 1 + 1,1 = 2,1 is onzin, het resultaat moet gewoon 2 zijn. De aanname dat 1=1,000000000 mag je niet zomaar doen. Alles meer dan wat je had aan nauwkeurigheid bij je begin getallen moet je negeren.
Dit is zo in de natuurkunde en scheikunde, waar men adhv meten aan waardes komt, die nooit exact bepaald kunnen worden (tenzij er geteld wordt natuurlijk, 3 appels + 11 appels is in de natuurkunde ook gewoon 14 appels en niet 1 * 10
1, de 3 en 11 zijn hier exacte telwaarden die niet af kunnen wijken.)
Wiskunde is daarentegen wel altijd exact, en daarvoor gaat jouw stelling ook niet op. Het hangt dus nogal van de toepassing van de getallen af, en die toepassing is niet bepaald door de mensen die het floating point formaat verzonnen hebben
Aanvullig op de post van iLs
Een double heeft een 53 bits mantissa en een 10 bits exponent. Aangezien het opgeslagen getal altijd de vorm heeft van [teken] [mantissa] * 2
[exponent], en de mantissa altijd een waarde in het bereik [1, 2> heeft (maw, het is iets als 1,03242384, waarbij de 1 voor de komma altijd vast staat), hoeft die 1 natuurlijk niet te worden opgeslagen. Maar de mantissa krijgt hierdoor wel een effectieve precisie van 54 bits
Welnu, 1.1 opslaan in 54 bits past gewoon niet. Sterker nog, het kan sowieso niet met een eindig aantal bits
Laten we de 1.1 eens even om gaan zetten naar een binaire representatie. De 1 hebben we natuurlijk al, dus nu moeten we 0.1 nog krijgen. Dat doen we als volgt:
• Kijk of het getal groter gelijk aan 1, zo ja: schrijf een 1 neer, en trek 1 van het getal af. Zo nee: schrijf een 0 neer. Als het getal 0 is stop dan
• Vermenigvuldig het getal met 2
0.1 -> 0
0.2 -> 0
0.4 -> 0
0.8 -> 0
1.6 -> 1 -> 0.6
1.2 -> 1 -> 0.2
0.4 -> 0
0.8 -> 0
1.6 -> 1
1.2 -> 1 -> 0.2
0.4 -> 0
.
.
Het lijkt me duidelijk dat dit een herhalend patroon is. Steeds kom je weer op 0.4 terecht, en dit blijft oneindig lang doorgaan. Conclusie: het getal is niet binair te representeren, met wat voor precisie dan ook
1.1 in binair wordt dus 1.000011001100110011001100110011001100110011...
[
Voor 4% gewijzigd door
.oisyn op 27-01-2004 00:55
]