FileMaker Tip 327

Vreemde zaken met de Modulus-functie

 

De Modulus-functie is een tamelijk eenvoudig dingetje: ze geeft de rest aan wanneer we een deeltal gedeeld hebben door een deler.

Voorbeeld:

we delen 7 door 5, dat geeft rest 2
we delen 15 door 8, dit geeft rest 7.

We schrijven het zo

Mod(7;5) = 2
Mod(15;8) = 7

Een toepassing vinden we in Tip 181.

Maar vandaag willen we het over iets anders hebben: we kregen een mailtje van de univerisiteit van Yutacán met dit toch wel verrassende bericht:

In FileMakerversies lager dan 7 gedraagt deze functie zich anders dan in de recente versies.

Onderstaande tabel brengt dit in schema: de eerste kolom geeft het deeltal, de tweede de deler, de derde het resultaat in FileMaker 6 de vierde het resultaat vanaf FileMaker 7-8.5*.

10

3

1

1

10

-3

1

-2

-10

3

-1

2

-10

-3

-1

-1

FileMaker had dit wel aangekondigd, maar toch is het bevreemdend dat we er daarna weinig of niets meer over gehoord hebben...

Met dank aan Jean W.

Kort na het verzenden van deze tip kregen we volgende reactie van Theo Tromp:

Even een interpretatie:
  • Mod(10:3). Het algoritme is dat je steeds 3 aftrekt van 10 totdat de rest kleiner is dan 3. Geen probleem, rest is 1.
  • Mod(10;-3). Filemaker 6 neemt de absolute waarde van deler dus +3. Resultaat is dus hetzelfde als hiervoor. Filemaker 7+ neemt de negatieve deler en telt steeds de negatieve deler bij het grondtal totdat de rest groter is dan de deler (-2 is groter dan -3).
  • Mod(-10;3). Filemaker 6 neemt de absolute waarde van grondtal (10) en trekt daar absolute waarde van deler (3) af tot resultaat kleiner is dan deler (1). Vervolgens wordt de deler weer vermenigvuldigd met -1, resultaat -1. Filemaker 7 telt weer op en gaat door totdat het absolute resultaat kleiner is dan de deler. Het resultaat blijft absoluut.
  • Mod(-10;-3). FM 6 neemt absolute waarden (10:3) en berekent het resultaat als bij (-10:3) dus neemt weer de negatieve waarde -1 als resultaat. Filemaker 7 trekt -3 af van -10 (2x optellen = aftrekken) totdat het resultaat (-1) groter is dan grondtal (-3).
  • Enfin, het is maar wat de definitie is van modulo. Ik heb deze functie nooit met negatieve getallen gebruikt, wellicht is het verstandig om de absolute waarden van zowel grontal als deler te gebruiken voor een voorspelbaar resultaat Mod(Abs(Grondtal);Abs(deler))


* En misschien nog verder: dat zullen we later zien.

 

Terug naar het selectiemenu voor de tips.