Het schrikkeljaar-probleem is geen probleem maar een tamelijk eenvoudige rekenregel. Microsoft heeft zich daar niets aan gelegen laten liggen en rekent het jaar 1900 tot schrikkeljaar.
Erwin Jesterhoudt behandelt in zijn artikel Paus Gregorius en het ‘jaar 2000’-probleem (6juni 1997) in feite twee onderwerpen: het ‘jaar 2000’-probleem en het schrikkeljaar. Voor het onderwerp ‘datums en computers’ is stof genoeg om een boekwerk te vullen.
Bij de bespreking van het ‘jaar 2000’-probleem geeft Jesterhoudt gedetailleerd aan hoe men te werk kan gaan bij een bepaalde aanpak en wat voor kosten daarmee gemoeid zijn. Hij legt de verantwoordelijkheid voor het – eigenlijk gênante – verschijnsel bij de programmeurs. De oorzaak ligt echter dieper en vloeit voort uit de beperking van de technologie, gecombineerd met de inertie van de gehele IT-industrie. Vroeger werd bijvoorbeeld op een schrijfmachine de letter x voor het maal-teken gebruikt en de letter l voor het cijfer 1. Nog altijd beschikt het toetsenbord niet over het ‘maal’-teken. Blijkbaar is de computer er voornamelijk voor tekst. Op de ponskaarten moest zuinig worden omgesprongen met de beschikbare tachtig posities. Veel computertermen herinneren nog aan deze tijden, zoals CR/LF voor Carriage Return/Line Feed, in het Nederlands ‘wagen terug en nieuwe regel’ of ‘omhaal’, nog steeds als zodanig getekend op de Enter-toets. De Tab-toets wordt in een Windows-omgeving nog altijd net zo gebruikt als vroeger op de schrijfmachine: om van kolom (venster) naar kolom (venster) te springen. Nog altijd zijn er analisten die hun scherm indelen in vierentwinitg bij tachtig kolommen.
Zo zijn er nog heel wat fossiele overblijfselen uit het schrijfmachine- en ponskaartentijdperk, maar de pound foolish penny wise-houding is nooit bijgesteld. Een serie artikelen over het ‘jaar 2000’-probleem is te vinden in Communications (mei, 1997), het officiële orgaan van de ACM (Association for Computing Machinery).
Schrikkeljaar
Bij het probleem met het schrikkeljaar beschrijft Jesterhoudt eenduidig de wijze waarop sinds 1582 een jaar als schrikkeljaar wordt bepaald. Het schrikkeljaar-probleem is dus geen probleem maar een tamelijk eenvoudige rekenregel. Microsoft heeft zich daar overigens niets aan gelegen laten liggen en rekent het jaar 1900 als schrikkeljaar. Microsoft heeft dit niet zelf bedacht: het komt voort uit het vroegere spreadsheet-programma Multi Plan. Daarmee is Microsoft voor wat het schrikkeljaar betreft in het gezelschap van Lotus en IBM gekomen.
Als een automatiseerder nu, met het oog op het jaar 2000, zou kiezen voor een seriële datum-opslag en hij zou een juiste conversie doen, dan zit hij bij de genoemde spreadsheet-leveranciers fout. Zijn dag wordt gepresenteerd als de dag van gisteren! 1 Maart 1900 is in de telling van Multi Plan, die begint op 1 januari 1900, de zestigste dag in plaats van de 59ste. Dat is weliswaar al lang geleden, maar bijvoorbeeld pensioenfondsen, verzekeringsmaatschappijen of notariskantoren hebben nog altijd met die datum te maken. Er zijn nog heel wat deelnemers, klanten dus, die vóór die datum geboren zijn. Dit soort instellingen heeft al eens met een eeuwwisseling te maken gehad en wordt straks geconfronteerd met het onderscheid tussen drie eeuw-perioden: de negentiende, de twintigste en de eenentwintigste eeuw.
Computer-algoritme
Het interessantste van automatiseren is het vinden van een computer-algoritme voor de beschrijving van een probleem. Het algoritme voor de bepaling van een schrikkeljaar is:
Stap 1. Bepaal de restwaarde bij deling (modulo) van het jaar door achtereenvolgens 4, 100 en 400;
Stap 2. Vergelijk de uitkomsten met 0 (zijn ze deelbaar?);
Stap 3. Tel de drie (boolean) uitkomsten op;
Stap 4. Bepaal van deze som de modulo 2, identiek aan even of oneven.
De uitkomst ligt tevens in het domein ‘waar of niet waar’ en geeft in dit geval aan of het om een schrikkeljaar gaat of niet.
In de computertaal J [1](een APL-dialect, niet te verwarren met Microsofts J++) vervult het Ascii-teken ‘|’ de functie van restwaarde. J is array-georiënteerd; men kan bijvoorbeeld schrijven:
4 100 400 | 1996 met als uitkomst: 0 96 396.
Een ‘/’ achter de ‘|’ zorgt ervoor dat de operatie over alle elementen van het rechterargument wordt uitgevoerd. We schrijven nu:
4 100 400 |/ 1900 1996 1997 2000
en krijgen daarmee de matrix:
0 | 0 | 1 | 0 |
0 | 96 | 97 | 0 |
300 | 396 | 397 | 0 |
vergelijking met 0 geeft:
1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
0 | 0 | 0 | 1 |
optelling over de kolommen door +/
2 | 1 | 0 | 3 |
en tenslotte modulo 2 met 2|
0 | 1 | 0 | 1 |
waaruit resulteert dat uit de beschouwde reeks alleen 1996 en 2000 schrikkeljaren zijn.
Volgende tijdbom
In één regel het beschrijvende èn op de computer uitvoerbare alogritme:
2|+/0=4 100 400|/ arg
(De executie verloopt van rechts naar links; de interpreter zorgt voor een juiste binding tussen functie en argument)
Voor arg kan elke numerieke array worden ingevuld.
Desgewenst geeft:
365+2|+/0=4 100 400|/ arg: het totaal aantal dagen in de in arg voorkomende jaren in die jaren;
28+2|+/0=4 100 400|/ arg : het aantal dagen in februari in die jaren;
(2|+/0=4 100 400|/ arg) # arg : de uit arg geselecteerde schrikkeljaren
( # selecteert uit de reeks die elementen waarvoor de conditie waar is).
De volgende tijdbom tikt reeds [2]. Op een 32-bits-woord computer waar de secondentelling begon op 1 januari 1970 (zoals bij Unix), tikt deze klok in 2035 voor het laatst; dan is het woord ‘vol’.
Jan Karman, Almere
karman@knoware.nl
[1]. K.E. Iverson, Hui, R.: J Introduction and Dictionary
[2]. R.L. Glass: The next date crisis, ACM Communications, jan. 1997