25 mei 2016

Wiskunde

Vanmorgen kwam ik iets tegen wat weer typisch iets was van diep weggezonken kennis. Je brein werkt toch niet meer zo als 30 jaar geleden denk je dan.
Wat was het geval, in de morgen kreeg ik een berichtje van de SolarFarm dat het programma voor het LMQR dashboard voor de zoveelste keer opnieuw gestart was, dus om de 5 minuten. Er zit iets behoorlijk fout denk je dan. Vanmiddag en 50 berichten later kwam ik er achter wat dat was.

Om de aanduidingen voor de mate van bewolking een beetje ordelijk te houden had ik die in een rijtje (verzameling of ook wel array) gezet:

aTypeCloud = ("Extreme dark", "Very dark", "Dark","Overcast", "Cloudy", "Bright daylight") 

Nu moest ik dus het volgnummertje uitrekenen dat bij een bepaald bewolkingstype hoorde.
Wat me opgevallen was dat de classificatie voor bewolking werd gerelateerd aan het aantal lumen die de zon afgeeft. Van 0 tot +100.000. Wikipedia geeft dit rijtje:

107520       Bright sunlight
10752        Full Daylight
1075         Overcast Day
107          very dark day

Wat dat 752 er in moest negeer ik voor het gemak maar even. Opvallend was dat het machten van 10 waren, iedere hogere waarde is dus 10 keer groter. Kijk, daar kon ik wat mee. Een beetje duimen zuigend dacht ik: als je nu de logaritme met basis 10 uit 100 neemt is dat 2, uit 1000 is dat drie, enz. Dat zou precies de index voor mijn wolken rijtje zijn. Dat idee in een formule gegoten, zijn computertjes gek op:

      n = log(aantal_lumen, base 10)

Dat werkte perfect. De volgende morgen bleek dat het programma zich ergens in verslikt had en zag zo'n 100 fout meldingen in mijn mailbox en 100 regels in de rapportage file. Dan besef je dat 's nachts het aantal lumen 0 is en even later viel het kwartje. De logaritme uit 0 = oneindig. Dus dáár kon het programmaatje niet tegen. Snel even getest:
  • Test 1: lumen = 1000 komt er een getal uit van 3 = "Overcast" (de computer begint bij nul te tellen)
  • Test 2: lumen = 0, nacht dus, oeps!
Om de formule heen kwam een test voor een fout en weer een testje uitgevoerd:

   probeer:
      n = integer(logaritme(lumen,10))    # integer van 1027 geeft 3 geen 3,011
   als fout:
      n = 0

  druk af: n

De testen gaven: 3 en 0 af. Mooi, opgelost!

Doet je wel nadenken. Dan denk je een compacte elegante oplossing gevonden te hebben, ben je even een heel essentiëel ding vergeten. Waardoor het zaakje alsnog in de prak loopt. Die oude school kennis is toch wel heel erg diep weggezakt denk ik dan nog eens.

Leuk hoor dat programmeren, het houdt je brein soepel.

Geen opmerkingen: