Premium

Het zit ’m in het fruit

Waarom ontketende de eens zo vredelievende Mahatma Gandhi een kernoorlog? Wanneer rijdt er een spooktrein op het Zwitserse spoor? En hoe zit het nou eigenlijk met level 256 van Pac-Man? Een voorpublicatie van De Eenzaamheid van Pi, over de wiskunde die onze wereld draaiende houdt.

Pi

Mahatma Gandhi is beroemd geworden als de pacifist die India naar onafhankelijkheid van het Verenigd Koninkrijk leidde. Maar sinds 1991 heeft hij ook de naam een oorlogszuchtige leider te zijn die onuitgelokte kernaanvallen lanceert.

Dit komt door het computerspel Civilization, waarvan 33 miljoen exemplaren zijn verkocht. De bedoeling is dat je het grootste rijk ter wereld opbouwt, met historische wereldleiders als tegenstrevers, waar de doorgaans zo vredelievende Gandhi er een van is. Maar al bij de eerste paar versies van het spel viel het spelers op dat Gandhi een beetje een etterbak was. Vanaf het moment dat zijn land de atoomtechnologie onder de knie had, bestookte hij andere landen met kernbommen.

Dit kwam door een fout in de computercode. De makers van het spel hadden Gandhi bewust een zo laag mogelijke agressieniveau die niet nul was toebedeeld: 1. Zoals we Gandhi kennen. Maar later in het spel, toen alle wereldrijken, tja, hoe zal ik het noemen, wat beschaafder werden, zakte de agressiviteit van alle leiders met twee punten. In het geval van Gandhi, die met een score van 1 was begonnen, resulteerde dit in 1 - 2 = 255, waardoor hij ineens op het maximale agressieniveau kwam. Hoewel deze fout inmiddels is hersteld, speelt Gandhi in latere versies nog altijd de rol van fervent kernbomsmijter.

Spooktrein

Dat de computer met een uitkomst van 255 kwam, had dezelfde oorzaak als dat computers moeite hebben om de tijd bij te houden: het digitale geheugen is eindig. De agressieniveaus werden opgeslagen als een binair getal van acht tekens. Als je begint bij 00000001 en daar twee van aftrekt, krijg je eerst 00000000 en dan 11111111 (wat als decimaal getal 255 is). In plaats van een negatief getal te worden, zal een getal dat is opgeslagen in een computer juist omslaan naar de hoogste mogelijke waarde. Dit wordt wel een roll-over error genoemd en zulke fouten kunnen op heel interessante manieren schade toebrengen aan een computercode.

In Zwitserland mogen treinen geen 256 assen hebben. Heel curieus, maar het is niet zo dat de Zwitserse regelgevers zijn doorgedraaid. Om alle treinen op hun spoornet in de gaten te kunnen houden, hebben de Zwitsers detectoren bij de rails geplaatst. Het is een simpel mechanisme dat bespeurt wanneer er een wiel over de rails rolt en telt hoeveel wielen het in totaal zijn, om zo wat basale informatie te krijgen over de trein die zojuist gepasseerd is. Spijtig genoeg telt de detector met behulp van een binair getal van acht tekens, dus als de teller bij 11111111 is, begint hij weer opnieuw, dus bij 00000000. De trein die de telling weer terug bij nul brengt, wordt niet gesignaleerd en rijdt rond als een spooktrein.

Ik zocht in de Zwitserse regelgeving naar de regel over 256 assen en vond die tussen andere voorschriften over maximale belasting van treinstellen en de communicatie tussen conducteurs en machinisten. Ik denk dat zoveel mensen vroegen waarom ze die 256ste as niet aan hun trein mochten toevoegen, dat men besloot duidelijk aan te geven waarom dat niet kon. Dat is blijkbaar makkelijker dan de code herstellen. Het gebeurt wel vaker dat een hardwareprobleem wordt aangepakt met een softwareoplossing, maar wat ze in Zwitserland deden, een bug herstellen met een bureaucratische patch, was voor mij nieuw.

Muuroplossing

Er zijn manieren om roll-over errors te voorkomen. Als programmeurs een 256-probleem zien aankomen, kunnen ze een barrière opwerpen waardoor de waarde niet verder dan 255 gaat. Dit gebeurt aan de lopende band en het is grappig om mensen in verwarring te zien raken door deze ogenschijnlijk willekeurige blokkade. Toen WhatsApp het maximaal aantal leden van een groep van honderd naar 256 opschroefde, omschreef The Independent de wijziging als volgt: ‘Het is niet duidelijk waarom WhatsApp juist dat specifieke aantal heeft gekozen.’

Maar veel mensen wisten het wel. Deze opmerking verdween kort daarna van hun website, met de aantekening dat ‘een aantal lezers heeft opgemerkt dat 256 een van de belangrijkste getallen in de computerbranche is’. Ik heb te doen met degene die die middag de Twitteraccount van The Independent beheerde.

Ik noem dit de ‘muuroplossing’. Als je in een WhatsAppgroep met 256 leden zit (jij en 255 vrienden) en je probeert een 257ste persoon toe te voegen, loop je simpelweg tegen een muur op, je krijgt het niet voor elkaar. Maar aangezien je al op 255 vrienden zit, zal nummer 257 een dusdanig vage kennis zijn dat hij of zij het niet persoonlijk zal opvatten. De dreiging van een roll-over error is ook de reden waarom Minecraft een maximale hoogte van 256 blokken heeft. Een echte muur dus, in dit geval.

Je kunt ook met deze roll-overs omgaan door een loop te maken, zodat 00000000 na 11111111 komt. Dat is precies wat er in Civilization en bij het Zwitserse spoor gebeurt. Maar in beide gevallen leverde dat onbedoelde neveneffecten op. Computers volgen blindelings de opdrachten die ze krijgen en doen wat ‘logisch’ is, zonder oog te hebben voor wat misschien ‘redelijker’ is. Dit betekent dat je bij het schrijven van een computercode rekening houdt met elke mogelijke uitkomst en zorgt dat de computer weet wat hij doen moet. Ja, als programmeur moet je een degelijke wiskundige basiskennis hebben, maar naar mijn idee is het vooral het vermogen om scenario’s logisch door te denken wat programmeurs verbindt met wiskundigen.

Level 256

De programmeurs achter de oorspronkelijke arcadeversie van Pac-Man lieten het level opslaan als een binair getal van acht tekens dat bij het eindpunt opnieuw begon. Maar ze dachten niet goed na over de gevolgen daarvan en op level 256 komt er een lawine van kleine storingen op gang waardoor het spel crasht. Niet dat dat heel erg is, want aangezien de meeste mensen niet eens voorbij het eerste level komen, lijken die 255 levels wat te veel van het goede. Maar degenen met alle tijd en geld van de wereld kunnen op ontdekkingsreis gaan door honderden niveaus (toegegeven, ze zijn allemaal hetzelfde, op het gedrag van de spoken na). Ik ben trouwens nooit verder dan level 7 gekomen. Ik moet hoognodig mijn skills bijschaven.

Het is niet zo dat Pac-Man op level 256 ontspoort omdat het spel het levelgetal niet kan opslaan. Zoals gebruikelijk tellen programmeurs vanaf 0, dus level 1 wordt opgeslagen als getal 0, level 2 als getal 1 enzovoorts (met ‘getal’ verwijs ik dus naar het level zoals dat wordt opgeslagen en dus niet naar het level dat de speler feitelijk ziet). Level 256 wordt opgeslagen als getal 255, wat in binaire code 11111111 is. Geen probleem. Als we doorgaan naar level 257 gaat het getal terug naar nul en wordt Pac-Man weer in het eerste doolhof gedropt. Op die manier kan het spel een eeuwigheid duren. Maar waarom gaat het bij level 256 dan mis?

Het zit ’m in het fruit. Voor de afwisseling wordt op elk level twee keer fruit ingevoegd (naast een klok en een sleutel, die Pac-Man met evenveel gemak opeet als een appel of een aardbei). Er zijn acht soorten fruit in het spel en elk level heeft zijn eigen fruitsoort, die onder in het scherm getoond wordt, samen met het fruit dat Pac-Man al heeft weggewerkt. Deze fruitkraam zorgt ervoor dat het spel ontspoort.

Kraam vol exotisch fruit

In oude computersystemen was de digitale ruimte nog dermate schaars dat Pac-Man tijdens het spel maar drie getallen opslaat: op welk level je zit, hoeveel levens je nog hebt en wat je score is. Alle andere informatie wordt tussen de levels verwijderd. Dus op elk level speel je tegen spoken met geheugenverlies: ze weten helemaal niets meer van alle uren die je al met ze in gevecht bent. Het spel moet dus uitdokteren welk fruit Pac-Man op de andere levels verorberd heeft. Er is slechts ruimte voor zeven stuks fruit, dus het spel moet het fruit van het huidige level en dat van de zes voorgaande levels laten zien (uiteraard afhankelijk van hoeveel levels er al gespeeld zijn).

In het computergeheugen zit een menu van het fruit en de volgorde waarin het op je scherm kan komen. Dus als het level onder de 7 zit, kiest het net zoveel stukken fruit als het levelgetal (daarboven kiest het de laatste zeven). Het probleem doet zich voor als de code de levelindex neemt en die omzet in een levelgetal door er één bij op te tellen. Level 256 correspondeert met getal 255, waar één bij wordt opgeteld en dan krijg je dus... level 0. Nul zit onder de zeven, dus probeert het spel net zoveel stukken fruit te kiezen als het levelgetal. Als het nul stukken fruit kiest, is dat geen probleem, maar spijtig genoeg kiest het spel eerst en gaat daarna pas tellen. De code kiest fruit en trekt dan één van het levelgetal af tot het bij nul komt.

De computer probeert nu 256 stukken fruit te kiezen in plaats van de zeven of minder die hij normaal kiest. Ik zeg nu wel ‘fruit’, maar na twintig rijen is de fruitkraam al leeg. Voor het 21ste stuk fruit kijkt de code naar het volgende stukje van het computergeheugen en probeert daar een stuk fruit in te zien. Vervolgens loopt hij het hele geheugen door alsof het een hele kraam vol exotisch fruit is en kiest zoveel als hij kan. Een deel van dit exotische fruit correspondeert met andere symbolen die het spel kan laten zien, dus er verschijnen allerlei letters en leestekens op het scherm.

Als gevolg van een eigenaardigheid in het coördinatiesysteem van Pac-Man begint het spel, als de onderkant van rechts naar links met fruit gevuld is, vanaf de rechter bovenhoek het scherm met de ene na de andere kolom te vullen. Tegen de tijd dat de code 256 stukken fruit gekozen heeft, is het scherm voor de helft met zulke kolommen gevuld. Je zult het nauwelijks kunnen geloven, maar op dat moment begint het spel het volgende level, terwijl het systeem het level pas als voltooid beschouwd als Pac-Man 244 stippen heeft opgeslokt. Op dit laatste, defecte level heeft het gemuteerde fruit hele ladingen stippen vernietigd, dus Pac-Man kan met geen mogelijkheid de vereiste 244 stippen opslokken en is gedoemd door het gehalveerde doolhof te dwalen tot de verveling toeslaat en hij zich overgeeft aan de spoken die hem achtervolgen. Toevalligerwijs precies wat veel programmeurs overkomt wanneer ze hun code proberen te voltooien. 

De Eenzaamheid Van Pi, Matt Parker, Nijgh & Van Ditmar, €21,50

Premium
Je hebt zojuist een premium artikel gelezen.

Online onbeperkt lezen en Nieuwe Revu thuisbezorgd?

Abonneer nu en profiteer!

Probeer direct