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

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:

Getallen omzetten
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: Download deze code  File: voorb640.zip, 2981 bytes.

 
terug

html-640; Laatste wijziging: 25 augustus 2021