Breuken zonder fouten
In het item Onnauwkeurigheden bij rekenen met JavaScript wordt beschreven op
welke wijze herhaalde berekeningen met gebroken getallen kunnen ontsporen. Dat is gedaan aan de hand van de formule:
getal = (n + 1)×getal - 1, waarbij getal = 1 / n. De oorzaak is dat het vaak niet mogelijk is om de fractie
(dat zijn de cijfers achter de komma) te beschrijven als een eindige reeks machten van 2.
Iets vergelijkbaars is er bij machten van 10: ½ kun je ook schrijven als 0.5; ⅓ kun je schrijven als 0.33333333...
waarbij het aantal drieën oneindig doorloopt.
Op deze pagina wordt een methode besproken die dit bezwaar niet heeft. De getallen worden geschreven met behulp van een reeks faculteiten. Feitelijk is dit een ander getal-stelsel dat is afgeleid van het 10-tallige stelsel. Beide stelsels gebruiken dezelfde cijfers, waardoor gemakkelijk verwarring ontstaat.
Deze methode ziet er nieuw en baanbrekend uit, maar toch is het al oud. Hij is in 1869 voor het eerst beschreven door de Duitse wiskundinge Georg Cantor (1845 - 1918), bekend van de naar hem genoemde fractal.
Notatie
Neem het getal 234.625
- In het gebruikelijke 10-tallige stelsel betekent 234.625: 2×102 + 3×101 + 4×100 + 6/101 + 2/102 + 5/103. De notatie voor het 10-tallige stelsel wordt in dit verhaal aangegeven met de index 10, dus 234.62510.
- In het tweetallige (binaire) stelsel wordt de index 2 gebruikt. 234.62510 (exact) wordt voorgesteld met 1110 1010.1012. Het betekent: 1×27 + 1×26 + 1×25 + 0×24 + 1×23 + 0×22 + 1×21 + 0×20 + 1/21 + 0/22 + 1/23.
- Een getal, geschreven als de som van een serie faculteiten heeft de index F. 234.62510 wordt 14300.103F. Het betekent:1×5! + 4×4! + 3×3! + 0×2! + 0×1! + 1/2! + 0/3! + 3/4!.
Het begrip 'faculteit' is niet bij iedereen even bekend. Via deze link krijg je summier wat uitleg over Faculteit in de Wiskunde
Er is iets vreemds aan de hand met de cijfers in de faculteit-notatie:
- Het eerste cijfer voor de komma is 0 of 1.
- Het tweede cijfer voor de komma is 0, 1 of 2.
- Het derde cijfer voor de komma is 0, 1, 2 of 3.
- Het vierde cijfer voor de komma is 0, 1, 2, 3 of 4.
- enzovoort.
- Het eerste cijfer na de komma is 0 of 1.
- Het tweede cijfer na de komma is 0, 1 of 2.
- Het derde cijfer na de komma is 0, 1, 2 of 3.
- Het vierde cijfer na de komma is 0, 1, 2, 3 of 4.
- enzovoort.
- Het bovenstaande wordt veroorzaakt door de faculteiten. Als je bijvoorbeeld 4×3! zou schrijven, heb je 4!, en dat staat al links van 3!. Als je 5/4! zou schrijven, heb je een breuk die niet vereenvoudigd kan worden.
Getallen omzetten
Het rekenen met getallen in dit faculteiten-stelsel is lastig, niet in het minst om getallen om te zetten naar en van het
faculteitenstelsel. Daarom is er een JavaScript-applicatie ontwikkeld die decimale getallen omzet in equivalenten met faculteiten
en omgekeerd. Druk op de knop hiernaast.
Praktisch nut
Op het moment dat dit geschreven wordt (augustus 2021), is deze aanpak niet praktisch inzetbaar. Voor handmatig rekenwerk
is het al helemaal ongeschikt, omdat je in een heel ander getal-stelsel moet gaan denken. Effectief implementeren in computerhardware
vergt de ontwikkeling van speciale processoren. Emuleren met software vergt heel veel (te veel?) rekenkracht (lees: capaciteit)
van de computer.
Kijkend naar de huidige ontwikkelingen op computergebied (met.o.a. Q-bits) is een grootschalige toepassing in de wat verdere
toekomst niet ondenkbaar. Dan moet er nog veel werk worden verzet om de algoritmes voor de berekeningen te verbeteren. Het
werkt nl. niet met getallen vóór de komma, zie de laatste alinea.
Bronnen
Dit verhaal leunt zwaar op een artikel van Peter Wayner in het blad Byte, juni 1988 pag 289 e.v., met de titel 'Error-Free
Fractions'. Dit artikel bevat de source-code van een PASCAL-programma, dat laat zien dat de afrondingsfouten die optreden
bij het werken met gebroken getallen wegblijven als de fractie van die getallen worden geschreven met faculteiten.
Dit programma werkt met een breuk p / q, bijvoorbeeld 5/8 of 21/11. Alleen het deel achter de komma wordt
omgezet in faculteiten. Voor het deel vöör de komma is dat niet nodig. Dat is nl. een geheel getal, waarbij het
probleem met de onnauwkeurigheid niet speelt.
Voor de liefhebbers
Een .PDF-bestand van het artikel kan ik je toesturen, samen met de oorspronkelijke PASCAL-code.
Om het programma te kunnen gebruiken is een compiler nodig die met de oorspronkelijke PASCAL-implementatie (van Niklaus Wirth)
overweg kan. Het werkt niet met dialecten als Turbo-Pascal. In de aanloop naar dit verhaal heb ik de compiler van Kappsmart
gebruikt op een Android-tablet, te vinden op Google Play. Ook voor iOS zijn er compilers beschikbaar in de App-store. Voor
Windows heb ik geen bruikbare compiler kunnen vinden.
Ik heb ook een conversie gemaakt naar Visual Basic 2010 (Console-applicatie). De code is op verzoek beschikbaar. De JavaScript-code
van het conversie programma kun je direct van deze site downloaden.
Ik heb geprobeerd een applicatie te bouwen waarmee je kunt rekenen, zoals optellen, aftrekken en vermenigvuldigen. Dat is
niet gelukt omdat er een denkfout in het PASCAL-programma zit, die pas aan het licht komt als je met getallen voor de komma
gaat werken. Er vindt nl. geen overdracht plaats naar het getal voor de komma. Als je bijvoorbeeld 0.7510 (= 0.112)F
optelt bij 0.510 (= 0.024)F is het resultaat 1.2510 (= 1.012)F. Maar de overdracht
van 1 naar de positie voor de komma wordt niet gedaan en achter de komma ontstaat bagger. Ik heb daar geen oplossing
voor gevonden.
Ik heb nog gezocht naar vervolg op het artikel van Peter Wayner, maar ik heb niets gevonden. Kennelijk is dit terecht gekomen
in de rubriek: "Leuk geprobeerd maar toch niet echt bruikbaar".
Downloaden:
Druk op de knop:
File: voorb640.zip, 2981 bytes.