Computers kunnen moeite hebben om intelligent gedrag te vertonen, maar blindelings rekenkundige berekeningen uitvoeren is zeker hun voordeel. Of is het?

Het falen van Google's online calculator en Excel's schijnbare onvermogen om juiste antwoorden te geven op eenvoudige berekeningen zijn beide bekende problemen bij programmeurs, maar dit zijn geen echte fouten in de normale betekenis van het woord. In plaats daarvan zijn ze slechts een gevolg van het feit dat computers slecht zijn voor wiskunde.

Computers voeren berekeningen op een heel andere manier uit dan de methoden die mensen gebruiken om rekenwerk te doen - en dat betekent dat ze gewoonlijk met het verkeerde antwoord komen. Hier onderzoeken we enkele van de schokkende gevolgen van deze openbaring voordat we ons verdiepen in de reden waarom computers slecht zijn in wiskunde.

  • 10 berekenende samenzweringstheorieën onderzocht

Sluiten is niet dichtbij genoeg

Voor iedereen die nog steeds overtuigd is dat computers geen simpel rekenkundig recht kunnen krijgen, laten we beginnen met enkele voorbeelden die u zelf kunt uitproberen.

Eerst de rekenmachine van Google. Als je het nog nooit hebt uitgeprobeerd, surf dan naar www.google.co.uk, typ 5 * 9 + (sqrt 9) ^ 3 in het zoekvak en klik op 'Zoeken' . Je zult zien dat het terug komt met het juiste antwoord: '5 * 9 + (sqrt 9) ^ 3 = 72'.

Laten we nu een andere berekening proberen. Typ in 599.999.999.999.999 - 599.999.999.999.998. Het is duidelijk dat dit een antwoord van 1 moet zijn. Ongelooflijk echter, antwoordt Google hiermee: '599.999.999.999.999 - 599.999.999.999.998 = 0'. Gewoon een zeldzaam en ongelukkig voorbeeld, misschien?

OK dan, laten we nog een eenvoudige berekening proberen. Typ = 850 * 77.1 in cel A1 van een Excel 2007-werkmap (deze werkt niet - of zou dat wel werken - in eerdere versies van Excel). Een beetje hoofdrekenen suggereert dat het antwoord in de buurt van 60.000 zou moeten zijn; in feite is het juiste antwoord 65.535.

Excel heeft andere ideeën. Het zal je vertellen dat het resultaat van deze vermenigvuldiging 100.000 is, wat neerkomt op een enorme 34.465. En om te bewijzen dat dit geen flits in de pan is, wat dacht je van het gebruik van een selectie van online calculators om 1,0 - 0,9 - 0,1 uit te werken?

Je zult waarschijnlijk merken dat minstens de helft van hen een antwoord zal geven van -2.77555756 E-17 - wetenschappelijke notatie voor -0.0000000000000000277555756. (Als iedereen die u probeert het goede antwoord geeft, kijk dan op www.calculator.net.)

SLECHTE MATHS: Aangezien 1.0 - 0.9 - 0.1 gelijk is aan 0, waarom zijn zoveel online calculators ervan overtuigd dat deze waarde het antwoord is?

OK, dit antwoord is misschien niet ver verwijderd van het juiste antwoord van 0, maar waarom kan de rekenmachine niet met het juiste antwoord komen - een antwoord dat overduidelijk is voor iedereen die vertrouwd is met eenvoudige rekenkunde?

Hoe computers wiskunde doen

Hoewel computers integers (hele getallen) kunnen verwerken, bewaren ze voor algemene rekenkundige bewerkingen getallen in drijvende-komma-indeling omdat het zoveel efficiënter is in geheugengebruik.

Laten we de drijvende-kommaweergave met dubbele precisie als voorbeeld nemen. Het gebruikt 64 bits om elk nummer op te slaan en staat toe dat waarden van ongeveer -10308 tot 10308 (minus en plus 1 gevolgd door 308 nullen, respectievelijk) worden opgeslagen. Bovendien kunnen fractionele waarden zo klein als plus of min 10-308 (dat is een komma gevolgd door 307 nullen en dan een 1) worden opgeslagen.

Als contrast, als dezelfde 64 bits werden gebruikt om gehele getallen op te slaan, zou het bereik zijn −9.223.372.036.854.775.808 tot +9.223.372.036.854.775.807, en fractionele waarden konden niet worden weergegeven.

Het geheim van deze ogenschijnlijk verbazingwekkende efficiëntie is een benadering. Van die 64 bits vertegenwoordigt één het teken (dus of de waarde positief of negatief is), vertegenwoordigen 52 bits de mantisse (dat zijn de werkelijke getallen) en vertegenwoordigen de resterende 11 bits de exponent (hoeveel nullen zijn er of waar de komma is).

Dus hoewel een veel groter bereik van getallen kan worden opgeslagen met behulp van zwevende-komma-notatie, is de precisie eigenlijk minder dan in een geheel getal-indeling kan worden bereikt, omdat er slechts 52 bits beschikbaar zijn. In feite vertegenwoordigen 52 bits van binaire informatie een 16-bits decimaal getal, dus alle waarden die alleen verschillen in hun 17de decimaalteken worden feitelijk als identiek beschouwd.

De situatie waarbij Google denkt dat 599.999.999.999.999 - 599.999.999.999.998 gelijk is aan 0 is vergelijkbaar, hoewel het duidelijk is dat de calculator van Google eigenlijk minder dan de normale 52 bits gebruikt voor de mantisse. Dat sommige rekenmachines een niet-nul resultaat geven voor de berekening 1.0 - 0.9 - 0.1 lijkt misschien anders, omdat we lijken te dicht bij de limiet van 64-bits floating point rekenkunde te zijn.

Maar dat is een belangrijk feit vergeten - dat computers in binair formaat werken. En hoewel 0.1 misschien maar één significant cijfer in decimaal heeft, is de mantisse in binaire notatie een herhalende reeks. Dit betekent dat 0.1 nooit nauwkeurig in binair getal kan worden weergegeven, ongeacht hoeveel bits u gebruikt.