Citat:
Ursprungligen postat av
B-programmerare
Med en sådan representation skulle bråktalet behöva förkortas, t.ex. så långt som möjligt efter varje operation eller litegrann när operationen skulle flöda över. Det skulle inte gå att låta en multiplikation bara gångra täljaren och en division bara gångra nämnaren, då fylls de två heltalen efter några loopar. Faktoriseringen vid förkortningen tar tid men man kunde bygga upp talet som en lista på primfaktorer från början, istället för två heltal. Processorer borde ha en sådan rationell-datatyp internt, och mänskligheten borde börja skriva tal så för att slippa den initiala faktoriseringen vid input. Addition/subtraktion vore inga problem eftersom nämnarna redan är faktoriserade.
Jodå, en sådan klass har jag skrivit som överlagrar operatorerna + - * och / plus kanske någon till, och mycket riktigt också en faktoriseringsalgoritm.
En sådan klass är inte svårt att skriva, den är bara "rakt på".
Det var dock länge sedan jag gjorde den, och jag tror att den ska ha postats till Dr Dobbs elr C++ Users Journal men koden kom inte med i publikation, utan det fanns en liten notis om den. Möjligen bara i något av deras forum. Den kunde iallafall expandera utrymmet som täljare och nämnare tog upp.
Jag använde den klassen för att räkna vissa matrisoperationer, tex inversion och multiplikation och representera talen korrekt.
Matematiska Institutionen i Sthlm liksom KTH tyckte den var lite kul att kämpa med
Men jag tror att jag hade problem med att skriva ut dessa tal med dåtidens skrivare minns dock ej varför.
I teorin så finns det faktiskt lite tid att spara med en sådan rationell klass, eftersom CPUn då hanterar heltal och inte behöver hantera flyttal och expandera decimalutvecklingen i varje steg. Och heltalshantering är ju snabbare.
Som ett numeriskt experiment så är den teoretiskt intressant eftersom den helt och hållet undviker felpropagering (felackumulering) i operationerna och i långa räknesekvenser om bara + - * och / ingår
Dock så kan ju inte sådana serieutvecklingar såsom sinus cosinus osv utvecklas som exakta rationella tal, utom bara sinus 90° = 1 och sinus 30° = 1/2, Eftersom man alltid erhåller en restterm och den är "oändligt lång" (*).
Fast klassens användbarhet som ett generellt verktyg det vet jag inte om det är så lyckosamt.
NASA och CERN hörde i alla fall inte av sig - De klarar sig tydligen bra med flyttal
För att kunna hålla en godtyckligt stor täljare och nämnare i minnet får man sikta in sig på någon klass såsom BIGNUM eller liknande - Säkert hade jag själv gjort något eget ihopkok, variant av BIGNUM.
Annars om 128 bit räcker så finns ju __int128 i flera kompilatorers datatypset.
Jag provade att göra om koden till FORTRAN elr förmodligen C eftersom C++ inte fanns på stordatorer då, men koden kunde tydligen prestera ojämnt tidsmässigt på stora matriser. Vilket ju egentligen inte är så särskilt förvånande
(*) Minns dock inte beviset om resttermen mer än att man beräknar dess maximala värde.