Index voor deze pagina:


Logaritmen

Wat is het nut van deze pagina? Zo ongeveer nul, het is een jubileumaanbieding!
Op 25 mei 2003 bestond deze website drie jaar en toen is deze pagina gepubliceerd. Liever vieren met een terugblik in het rijke verleden der cijferkunstenaars, dan in eigen navel staren. Maar pas op: deze pagina bevat geen greintje entertainment, slechts taaie wiskunde!

Wat is het nut van logaritmen?
Ze zijn ongeveer net zo nuttig als optellen, aftrekken, delen, worteltrekken, dat soort dingen. Tegenwoordig pakken we voor alle berekeningen een rekenmachientje, maar vroeger greep de mens naar dikke tabellenboeken. Vooral tabellen met logaritmen waren erg gewild vanwege een bijzondere eigenschap. In plaats van moeizaam vermenigvuldigen en delen hoefde je slechts logaritmen op te tellen of af te trekken. Logaritmen zelf kon je praktisch niet uitrekenen, die moest je in een tabel opzoeken.
Eindeloze tabellen heeft men samengesteld om het rekenen met logaritmen te vergemakkelijken. Talrijke interpolatiemethoden heeft men bedacht om zo nauwkeurig mogelijke berekeningen te kunnen maken voor getallen die niet in de tabellen stonden.
Tegenwoordig zien we dat gedoe met die tabellen maar als een onbeholpen gesukkel.
In een flits berekent een simpel computerprogrammaatje de logaritme van 1.25341 in meer dan 250 decimalen:

log 1.25341 =
0.09809 31552 81372 40388 97449 73021 58347 76797 24988 94315
  64738 96189 15082 01515 31000 02885 16847 48070 64041 89697
  79133 64519 71088 95377 31681 18692 15313 08826 69282 99389
  73394 07261 12393 28921 21923 83837 65497 54848 65222 92003
  63279 49049 29240 07122 64290 04813 87676 44037 46327 28958 28621 ...
Berekend met Multi-precision Calculator van Robert M. Delaney (Mac OS en Windows; gratis)
en geverifieerd met Pari/GP 2.0.14 (tal van platforms; gratis)
Pari home

Er bestaan tegenwoordig tal van libraries voor programmeertalen zoals C++ (bijvoorbeeld Calc, NTL, ...) en tal van rekenpakketten (bijvoorbeeld Mathematica, Maple, ...) waarmee allerhande wiskundige berekeningen kunnen worden gedaan met hoge precisie. Zoek op het internet met de termen "arbitrary precision" en "computer algebra system", inclusief de aanhalingstekens.


Eigenschappen van logaritmen

De belangrijkste eigenschap van logaritmen is:

log(a*b) = log a + log b

Hieruit kan gemakkelijk worden afgeleid:

log(a/b) = log a - log b
log(ab) = b*log a

Dezelfde hoofdeigenschap kan ook anders worden uitgelegd - en zo had John Napier, de uitvinder van de logaritmen, hem gevonden:
De logaritme van het meetkundig gemiddelde van twee getallen komt overeen met het rekenkundig gemiddelde van de logaritmen. Dus:
log(√(a*b)) = (log a + log b)/2
(√ is het teken voor de vierkantswortel)

Kenmerkend voor een logaritme is dat hij een grondtal heeft.
Twee grondtallen komen veel voor: e (= 2.718281828459045235360287471...) en 10.
De logaritme met grondtal e wordt ook wel de natuurlijke logaritme genoemd en het symbool van de functie is ln. De logaritme met grondtal 10 wordt ook wel de tiende logaritme genoemd en hij heeft als symbool log. Een logaritme met een ander grondtal wordt aangeduid als logab waarbij a het grondtal is. Soms zien we: alog b.
Omrekening van een logaritme naar een ander grondtal:

logab = (ln b)/(ln a)

Dus log b = (ln b)/(ln 10).

De omgekeerde functies zijn machtfuncties. De omgekeerde functie van de 'tiende' logaritme is de antilogaritme, en de omgekeerde functie van de natuurlijke logaritme is de exponentiële functie.

a = log b .... b = 10a
a = ln b .... b = ea

De feitelijke getalswaarde van een logaritme is niet zo eenvoudig te berekenen.
Volgens afspraak is ln 1 = log 1 = loga 1 = 0. De logaritme kan alleen maar van getallen groter dan 0 worden genomen. De logaritme van 0 is min oneindig (-∞, -INF) en de logaritme van oneindig is oneindig.
Voorts geldt per definitie dat de natuurlijke logaritme van een getal x gelijk is aan het oppervlak onder de functie f(x) = 1/x van 1 tot de waarde x, of in wiskundige termen:

ln x = ∫1x dt/t
(∫ is het integraalteken)


Tabellen

Dankzij de hoofdeigenschap van de logaritme kunnen we alle mogelijke logaritmen reduceren tot een logaritme van een waarde tussen 1 en 2. Bijvoorbeeld 666:
log 666 = log(6.66*100) = log 6.66 + log 100 = log 6.66 + 2
log 6.66 = log(6.66/2/2*2*2) = log (1.665*2*2) = log 1.665 + 2*log 2
Dat principe werkt ook voor getallen kleiner dan 1:
log 0.000666 = log(6.66/10000) = log 6.66 - log 10000 = log 6.66 - 4 enzovoorts.

Als we geen rekenmachine of computer hadden, zouden we dus voldoende hebben aan een goede tabel met logaritmen tussen 1 en 2. In de praktijk werden vroeger tabellen gemaakt met de logaritmen tussen 1 en 10; dat scheelde de gebruiker weer het nodige rekenwerk.
John Napier beschreef al in 1614 de ontdekking van de (natuurlijke) logaritmen (Mirifici Logarithmorum Canonis Descriptio) en hij publiceerde de eerste tabellen met een nauwkeurigheid van 6 decimalen.
In 1624 publiceerde Henry Briggs tabellen met de (tiende) logaritmen van 1 - 20000 en van 90000 tot 100000 in 14 decimalen nauwkeurig. Daar lagen buitengewoon ingewikkelde berekeningen aan ten grondslag, die uitvoerig zijn beschreven in zijn werk Arithmetica logarithmica. Een Engelse vertaling van dat werk is gemaakt door Ian Bruce en te vinden op:
vertaling Briggs - Arithmetica logarithmica, onderdeel van:
The MacTutor History of Mathematics archive, School of Mathematics and Statistics, University of St Andrews Scotland.

Het is ondoenlijk het ingewikkelde proces van Briggs hier te beschrijven, maar aan de hand van de basiseigenschappen van logaritmen valt te begrijpen wat het achterliggende principe is.
De log van 10 is 1. De vierkantswortel van een getal is hetzelfde als dat getal tot de macht een half. Dus log(√10) = log(100.5) = 0.5. Op vergelijkbare wijze: log(√√10) = log(100.25) = 0.25. Op die manier verkrijgen we de logaritmen van een hele reeks getallen. Door tussen die getallen en hun logaritmen te interpoleren, krijgen we de logaritmen van 'handige' waarden.

Aangezien we tegenwoordig geen tabellen meer nodig hebben, dreigt de kunst van het werken met de 'logarithmentafel' (oude spelling, met th) verloren te gaan. Wellicht is het interessant te bekijken hoe zo'n ding werkt.
Een voorbeeld van de eerste pagina van een serie logaritmentabellen staat hieronder.

Logaritmen 1000 - 1500
No.0d1d2d3d4d5d6d7d8d9d
1000000043000434400087430013043001734400217430026043003034300346430038943
1010043243004754300518430056143006044300647420068943007324300775420081743
1020086043009034200945430098842010304201072430111542011574201199430124242
1030128442013264201368420141042014524201494420153642015784201620420166241
1040170342017454201787410182842018704201912410195342019954102036420207841
1050211941021604202202410224341022844102325410236641024074202449410249041
1060253141025724002612410265341026944102735410277640028164102857410289840
1070293841029794003019410306040031004103141400318141032224003262400330240
1080334241033834003423400346340035034003543400358340036234003663400370340
1090374339037824003822400386240039023903941400398140040213904060400410039
1100413940041793904218400425839042973904336400437639044153904454390449339
1110453239045713904610400465039046893804727390476639048053904844390488339
1120492239049613804999390503839050773805115390515438051923905231380526939
1130530838053463905385380542338054613905500380553838055763805614380565238
1140569039057293805767380580538058433805881370591838059563805994380603238
1150607038061083706145380618338062213706258380629637063333806371370640838
1160644637064833806521370655837065953806633370667037067073706744370678138
1170681937068563706893370693037069673707004370704137070783707115360715137
1180718837072253707262360729837073353707372360740837074453707482360751837
1190755536075913707628360766436077003707737360777336078093707846360788236
1200791836079543607990370802736080633608099360813536081713608207360824336
1210827935083143608350360838636084223608458350849336085293608565350860036
1220863636086723508707360874335087783608814350884935088843608920350895536
1230899135090263509061350909636091323509167350920235092373509272350930735
1240934235093773509412350944735094823509517350955235095873409621350965635
1250969135097263409760350979535098303409864350989935099343409968351000334
1261003735100723410106341014035101753410209341024335102783410312341034634
1271038035104153410449341048334105173410551341058534106193410653341068734
1281072134107553410789341082334108573310890341092434109583410992331102534
1291105934110933311126341116033111933411227341126133112943311327341136133
1301139434114283311461331149434115283311561331159434116283311661331169433
1311172733117603311793331182634118603311893331192633119593311992321202433
1321205733120903312123331215633121893312222321225433122873312320321235233
1331238533124183212450331248333125163212548331258132126133312646321267832
1341271033127433212775331280832128403212872331290532129373212969321300132
1351303333130663213098321313032131623213194321322632132583213290321332232
1361335432133863213418321345031134813213513321354532135773213609311364032
1371367232137043113735321376732137993113830321386231138933213925311395632
1381398831140193214051311408232141143114145311417632142083114239311427031
1391430132143333114364311439531144263114457321448931145203114551311458231
1401461331146443114675311470631147373114768311479930148293114860311489131
1411492231149533014983311501431150453115076301510631151373115168301519831
1421522930152593115290301532031153513015381311541230154423115473301550331
1431553430155643015594311562530156553015685301571531157463015776301580630
1441583630158663115897301592730159573015987301601730160473016077301610730
1451613730161673016197301622729162563016286301631630163463016376301640629
1461643530164653016495291652430165543016584291661330166433016673291670230
1471673229167613016791291682030168502916879301690929169382916967301699729
1481702630170562917085291711429171433017173291720229172312917260291728930
1491731929173482917377291740629174352917464291749329175222917551291758029
1501760929176382917667291769629177252917754281778229178112917840291786929
No.0d1d2d3d4d5d6d7d8d9d

Proportionele delen
n\d4443424140393837363534333231302928
144444444443333333
299888887777766666
3131313121212111111111010109998
41817171616161515141414131312121211
52222212120201919181817171616151514
62626252524232322222120201919181717
73130292928272726252524232222212020
83534343332313030292827262625242322
94039383736353433323231302928272625

Dit is een tabel met 5 plaatsen ofwel 5 significante cijfers voor de tiende logaritme log10x.
In de blauwe 'No.' kolom van bovenstaande grote tabel zoeken we het eerste stuk van de x op waar we de logaritme van willen hebben. In de witte kolommen daarnaast kunnen we een extra decimaal van x krijgen.
Soms worden enkele voor de hand liggende gegevens weggelaten om ruimte te sparen:

No.0123456789
10000 000043087130173217260303346389
101432475518561604647689732775817
102860903945988*030*072*115*157*199*242
10301 284326368410452494536578620662

Van een tabel met 5 plaatsen kunnen de eerste twee cijfers enige tijd worden weggelaten, omdat ze toch hetzelfde blijven. Wanneer ze veranderen, wordt die verandering aangeduid met een sterretje, met een kleurverschil of met een hulplijntje. Het verschil tussen opeenvolgende tabelwaarden wordt ook niet altijd weergegeven omdat de gebruiker dat zelf wel kan berekenen.
Het is gebruikelijk dat de tabel geen aandacht besteedt aan de decade waarin het op te zoeken getal zit. De juiste waarde kan gemakkelijk worden gevonden door optellen of aftrekken van gehele getallen. Ga maar na: log 666 = log(6.66*100) = log 6.66 + log 100 = log 6.66 + 2.

Een voorbeeld van het werken met de tabel.
De log van '125' is '09691'. Door even na te denken krijgen we de waarde die we willen hebben:
log 1.25 = 0.09691
log 12.5 = 1.09691, want log 10 = 1
log 125 = 2.09691, want log 100 = 2
log 1250 = 3.09691, want log 1000 = 3
log 0.125 = 0.09691 - 1 = -0.90309, want log 0.1 = -1
log 0.0125 = 0.09691 - 2 = -1.90309, want log 0.01 = -2, enzovoorts.
Iedere 10 keer meer is 1 erbij in de uitkomst en iedere 10 keer minder is 1 eraf in de uitkomst, overeenkomstig de basiseigenschappen van de logaritme.
De log van 1.250 is dus 0.09691. Een paar kolommen verder lezen we af wat de log is van 1.253: 0.09795.
En wat zijn die grijze kolommen gemerkt d (difference, verschil)?. Dat zijn hulpwaarden voor de tabel met proportionele delen en daarmee kunnen we een extra decimaal krijgen. In het grijze vakje achter de waarde 09795 staat te lezen: 35. Dat is precies het verschil met de volgende tabelwaarde. Ga maar na: 09795 + 35 = 09830. Anders gezegd: log 1.254 - log 1.253 = 0.09830 - 0.09795 = 0.00035.
Stel we willen de logaritme weten van 1.2534. We weten al wat de logaritme is van 1.253, namelijk 0.09795. Het verschil 'd' met de volgende waarde is '35' en en willen als extra decimaal 4 hebben. Kijk nu in de tabel met proportionele delen in de rij gemerkt '4' en de kolom gemerkt '35'. Daar staat de waarde '14'. Tel dit op bij de eerder gevonden logwaarde: 09795 + 14 = 09809. Vertaling: log 1.2534 = 0.09809.

Een hoop gedoe allemaal. Ons elektronisch rekenmachientje van minder dan 10 Euro meldt ons met aanzienlijk minder inspanning en met grotere nauwkeurigheid dat log 1.2534 = 0.09808969.
Er is geen enkele hoop dat we met enige nauwkeurigheid de log van 1.25341 uit bovenstaande tabel kunnen halen.


De tabellen van Perryman

Er zijn in de loop der jaren enige methoden ontwikkeld om meer nauwkeurigheid te halen uit niet al te lange tabellen. Een opvallende innovatie is bedacht of op zijn minst gepubliceerd door Francis S. Perryman van de Casualty Actuarial Society. In het verzekeringswezen heeft men de behoefte aan nauwkeurige rekenmethoden om bijvoorbeeld de verschuldigde rente over een bepaalde verzekerde som te kunnen bepalen. Vroeger waren de rentetafels (annuïteitentabellen) en logaritmentabellen nogal grofstoffelijk of erg gedetailleerd maar daardoor zeer volumineus. Onhandig dus.
Perryman bedacht een fraaie methode om met enkele opvallend korte tabellen een nauwkeurigheid te bereiken van 10 decimalen. Wel moest men de beschikking hebben over een tafelrekenmachine die kan optellen, aftrekken, vermenigvuldigen en delen.
Het artikel van Perryman is getiteld Further tables adapted for machine computation en is gepubliceerd in de Proceedings van 16 november 1945 van de Casualty Actuarial Society. Het artikel is on-line beschikbaar.
[http://www.casact.org/pubs/proceed/proceed45/45069.pdf]
Aangezien de Perryman-methode niet zo bekend is en aangezien zijn artikel weinig wiskundige - eerder rekenkundige - achtergronden geeft, doen we hier een poging zijn methode te analyseren.
Als u geen zin heeft in taaie wiskunde, kunt u beter meteen doorklikken naar een rekenvoorbeeld.

Perryman maakt gebruik van een interessante interpolatiemethode voor de antilogaritme:

10M+Rt = 10M + t'D

M is een waarde die in de antilogtabel staat
R is de resolutie van de tabel, bijvoorbeeld 0.0001
t ligt tussen 0 en 1
D is het verschil tussen 2 opeenvolgende tabelwaarden = 10M+R - 10M
Er kan worden afgeleid dat t' = (10Rt - 1)/(10R - 1)

Die afleiding van t' is niet zo moeilijk:
Splits de machten in de uitgangsformule uit:
10M.10Rt = 10M + t'.10M.10R - t'.10M
Delen door 10M:
10Rt = 1 + t'.10R - t'  ->  t' = (10Rt - 1)/(10R - 1)

Als we nu een tabel maken van t' als functie van t (loopt van 0 tot 1), dan kunnen we de antilogaritme goed interpoleren.
En hoe moet dat nu met de logaritme?

De zojuist beschreven interpolatiemethode voor de antilogaritme is exact; er is dus geen restterm. Met wat omwerken kunnen we deze methode goed gebruiken voor logaritmen.
Werk de interpolatieformule eerst als volgt om:

(10M+Rt - 10M)/D = t'

Stel, we willen van een getal p de log p weten. Zoek nu eerst in een tabel met logaritmen een pt-waarde op die gelijk is aan of net iets kleiner is dan p. Bereken de verhouding p/pt en stel die gelijk aan de factor 10M+Rt uit de zojuist omgewerkte formule. Waarom dat handig is, zal aanstonds blijken.

10M+Rt = p/pt

Neem de logaritme links en rechts van het = teken:

M + Rt = log p - log pt
ofwel
log p = M + Rt + log pt

M is bekend want dat is een antilog-tabelwaarde, R is de resolutie van de antilogtabel, pt is bekend want dat is een log-tabelwaarde en log pt staat dus ook in de tabel.
Ehm ja, welke waarde had M ook al weer, en hoe groot is t?

We keren terug naar de formule (10M+Rt - 10M)/D = t'.
Eigenlijk is het stuk links van het = teken de formule voor een lineaire interpolatie van p/pt in de antilogaritmentabel. We zoeken dus in de tabel naar de waarden M waarvan de antilog net rond de p/pt ligt:

(p/pt - 10onder) / (10boven - 10onder)

Zoals de uitgangsformule al aangaf is de uitkomst van die breuk gelijk aan t'. We zien meteen dat M gelijk is aan de genoemde waarde 'onder' in de antilogtabel.
Alle gegevens, nodig voor het berekenen van die breuk zijn nu bekend, dus is t' bekend.
Maar, we hebben t nodig.

We hadden al een formule voor t' afgeleid: t' = (10Rt - 1)/(10R - 1). Daaruit kan met wat omwerken een functie t = f(t') worden afgeleid.
In principe hoeven dus alleen nog maar een tabel te hebben van t als functie van t'. Als we echter log p met 10 decimalen nauwkeurig willen hebben, dan blijkt dat we vrij veel waarden van t' moeten tabelleren. Het is handiger een tabel te maken waarin t' slechts met een waarde u gecorrigeerd hoeft te worden om t te krijgen:

t = t' + u

Laten we t'+u eens voor t invullen in de formule voor t':

t' = (10R(t'+u) - 1)/(10R - 1)

Met enige elementaire rekenkundige handelingen kunnen we u expliciet brengen:

u = (1/R)*log(t'(10R-1)+1) - t'

We zouden een tabel kunnen maken met u als functie van t'. Het blijkt echter dat de waarde van u niet zo veel verandert. Met andere woorden: het zou handiger zijn om voor de discrete waarden waarbij u van waarde verandert, de t' op te geven.
De klap op de vuurpijl en waar het allemaal om is begonnen is namelijk dat we maar zeer weinig waarden van u nodig hebben.
Dat heeft te maken met de gekozen resoluties.

Enige regels terug hebben we gezien dat de log p die we zoeken gelijk is aan: log p = M + R*t + log pt. De waarde M is een M-waarde in de antilog(M) tabel en die heeft dus een aantal decimalen, bepaald door resolutie R. De log pt is een getal van 10 decimalen, te vinden in de tabel. De waarde R*t moet dus ook 10 decimalen hebben. Als de resolutie R bijvoorbeeld gelijk is aan 0.0001, dus 4 decimalen, dan hoeft t slechts bekend te zijn in 10-4 = 6 decimalen!
Dat houdt in dat ook t' en u in slechts 6 decimalen bekend hoeven te zijn.
Even kijken wat de maximum waarde is voor u. Dat betekent dat we de functie u = f(t') moeten differentiëren naar t' en het nulpunt van de afgeleide moeten bepalen.

du/dt' = (1/(R*ln 10)) * [ (10R-1)/(t'*(10R-1)+1) ] - 1

du/dt' = 0  -->  t' = ((W1/W2)-1)/W1
met W1 = 10R-1 en W2 = R*ln 10
Bedenk dat log x = ln(x)/ln(10) en d(ln x) = (1/x)*dx

Bij een antilogresolutie R van 0.0001 blijkt het maximum voor t' op te treden bij t' bijna 0.5, waarbij u = 28.78 * 10-6.
Aangezien u slechts in 6 decimalen, dus tot op 10-6, bekend hoeft te zijn, kunnen we volstaan met een kleine tabel met u = 0, 1, 2, 3, ..., 28, 29, 28, 27, ..., 2, 1, 0 maal 10-6 en de bijbehorende t' waarden, rekening houdend met de gebruikelijke afronding - dus alle u's die bijvoorbeeld tussen 6.5 en 7.5 liggen, worden afgerond tot u = 7.
Nu is het zo dat in de functie u = f(t'), de t' niet expliciet kan worden gebracht. Het is dus niet mogelijk een simpele functie t' = f(u) te vinden. Perryman heeft een benadering toegepast, waarmee hij ongetwijfeld op moeizame wijze toch een tabel t' versus u heeft weten te maken. Wij hebben een wat nauwkeurigere tabel t' versus u berekend met de computer door t' iteratief te berekenen op basis van de functie u = f(t').

Hiermee is de hele wiskundige achtergrond van de Perryman-rekenmethode besproken. De rest wordt wel duidelijk met een rekenvoorbeeld.

Rekenvoorbeeld Perryman

Bepaal de log van p = 1.25341 in 10 decimalen nauwkeurig.
In de logaritmentabel is in ieder geval een log 1.24 te vinden = 0.0934216852 = log pt.
Bereken nu de verhouding p/pt = 1.25341/1.24. Dat is 1.0108145161.
Welke antilog komt daar het dichtste bij?
1.0108145161 ligt tussen antilog(0.0046) en antilog(0.0047). Het verschil tussen die twee staat ook in de tabel: D = 0.0002327371.
Bereken nu p/pt - antilog(0.0046): 1.0108145161-1.0106481841 = 0.0001663320.
Deel dat door het verschil in de antilog-tabelwaarden D: 0.0001663320/0.0002327371 = 0.7146776341.
Dit is de t' waarde (eigenlijk zijn maar 6 decimalen nodig). Maak er een t waarde van door er u bij op te tellen uit de t' versus u tabel. We vinden voor u een waarde van 23*10-6.
Dus t = 0.7146776341 + 0.000023 = 0.7147006341 (eigenlijk maar 6 decimalen nodig: 0.714701).
Volgens Perryman geldt: log p = M + R*t + log pt.
M is de gevonden antilog M-waarde 0.0046, R is de resolutie van de antilogtabel 0.0001. Ingevuld:
log p = log 1.25341 = 0.0046 + 0.0001*0.714701 + 0.0934216852 = 0.0980931553.
Vergelijk dit met de exactere waarde: 0.09809315528137...

Hoe veel handelingen hebben we uit moeten voeren?
Iets in tabel opzoeken: 3x
Optellen/aftrekken: 4x
Vermenigvuldigen: 1x
Delen: 2x

Hoe groot zijn de benodigde tabellen?
Logaritme: 136 ingangen
Antilogaritme: 101 ingangen
t' versus u: 59 ingangen

Tiende logaritme van x

Deze tabel hoort bij de rekenmethode van Perryman.
De resolutie van de antilogtabel is 0.0001 en die tabel loopt van M=0 tot 0.01. Dat betekent dat in onderstaande log(x) tabel de verhouding tussen opeenvolgende x-waarden kleiner moet zijn dan 100.01 = 1.023293.

xlog(x) xlog(x) xlog(x)
1.000.00000000002.160.33445375124.960.6954816765
1.020.00860017182.190.34044411485.040.7024305364
1.040.01703333932.220.34635297455.120.7092699610
1.060.02530586532.250.35218251815.200.7160033436
1.080.03342375552.300.36172783605.280.7226339225
1.100.04139268522.350.37106786235.360.7291647897
1.120.04921802272.400.38021124175.440.7355988997
1.140.05690485132.450.38916608445.520.7419390777
1.160.06445798922.500.39794000875.600.7481880270
1.180.07188200732.550.40654018045.680.7543483357
1.200.07918124602.600.41497334805.760.7604224834
1.220.08635983072.650.42324587395.840.7664128471
1.240.09342168522.700.43136376425.880.7693773261
1.260.10037054512.750.43933269386.000.7781512504
1.280.10720996962.800.44715803136.120.7867514221
1.300.11394335232.850.45484486006.240.7951845897
1.320.12057393122.900.46239799796.360.8034571156
1.340.12710479842.950.46982201606.480.8115750059
1.360.13353890843.000.47712125476.600.8195439355
1.380.13987908643.050.48429983936.720.8273692731
1.400.14612803573.100.49136169386.840.8350561017
1.420.15228834443.150.49831055386.960.8426092396
1.440.15836249213.200.50514997837.080.8500332577
1.470.16731733473.250.51188336107.200.8573324964
1.500.17609125913.300.51851393997.320.8645110811
1.530.18469143083.350.52504480707.440.8715729355
1.560.19312459843.400.53147891707.560.8785217955
1.590.20139712433.450.53781909517.680.8853612200
1.620.20951501453.500.54406804447.800.8920946027
1.650.21748394423.550.55022835317.920.8987251816
1.680.22530928173.680.56584781878.040.9052560487
1.710.23299611043.760.57518784498.160.9116901588
1.740.24054924833.840.58433122448.280.9180303368
1.770.24797326643.920.59328606708.400.9242792861
1.800.25527250514.000.60205999138.520.9304395948
1.830.26245108974.080.61066016318.640.9365137425
1.860.26951294424.160.61909333068.760.9425041062
1.890.27646180424.240.62736585668.880.9484129658
1.920.28330122874.320.63548374689.000.9542425094
1.950.29003461144.400.64345267659.200.9637878273
1.980.29666519034.480.65127801409.400.9731278536
2.010.30319605744.560.65896484279.600.9822712330
2.040.30963016744.640.66651798069.800.9912260757
2.070.31597034554.720.673941998610.001.0000000000
2.100.32221929474.800.6812412374 
2.130.32837960344.880.6884198220 

Antilog(M) = 10M

Deze tabel hoort bij de rekenmethode van Perryman.
In de logaritmentabel hierboven is de maximum waarde van de verhouding tussen twee opeenvolgende x-waarden 1.022222. De antilogtabel hieronder hoeft daardoor slechts te lopen van 0 tot log 1.022222 = 0.009545, zeg maar tot 0.01.

De kolom "verschil" geeft het verschil met de volgende tabelwaarde.

Mantilog(M)verschil Mantilog(M)verschil
0.00001.00000000000.00023028500.00511.01181240590.0002330052
0.00011.00023028500.00023033810.00521.01204541110.0002330589
0.00021.00046062310.00023039110.00531.01227847000.0002331126
0.00031.00069101420.00023044420.00541.01251158260.0002331663
0.00041.00092145830.00023049720.00551.01274474880.0002332199
0.00051.00115195550.00023055030.00561.01297796880.0002332737
0.00061.00138250580.00023060340.00571.01321124240.0002333274
0.00071.00161310920.00023065650.00581.01344456980.0002333811
0.00081.00184376570.00023070960.00591.01367795090.0002334348
0.00091.00207447530.00023076270.00601.01391138570.0002334886
0.00101.00230523810.00023081590.00611.01414487430.0002335424
0.00111.00253605400.00023086900.00621.01437841670.0002335962
0.00121.00276692300.00023092220.00631.01461201290.0002336499
0.00131.00299784520.00023097540.00641.01484566280.0002337038
0.00141.00322882060.00023102860.00651.01507936660.0002337576
0.00151.00345984910.00023108180.00661.01531312410.0002338114
0.00161.00369093090.00023113500.00671.01554693550.0002338652
0.00171.00392206590.00023118820.00681.01578080080.0002339191
0.00181.00415325410.00023124150.00691.01601471990.0002339730
0.00191.00438449560.00023129470.00701.01624869290.0002340269
0.00201.00461579030.00023134800.00711.01648271970.0002340807
0.00211.00484713820.00023140120.00721.01671680050.0002341346
0.00221.00507853950.00023145450.00731.01695093510.0002341886
0.00231.00530999400.00023150780.00741.01718512370.0002342425
0.00241.00554150190.00023156110.00751.01741936620.0002342964
0.00251.00577306300.00023161450.00761.01765366260.0002343504
0.00261.00600467750.00023166780.00771.01788801300.0002344044
0.00271.00623634530.00023172120.00781.01812241740.0002344583
0.00281.00646806640.00023177450.00791.01835687570.0002345123
0.00291.00669984100.00023182790.00801.01859138810.0002345663
0.00301.00693166890.00023188130.00811.01882595440.0002346204
0.00311.00716355010.00023193470.00821.01906057470.0002346744
0.00321.00739548480.00023198810.00831.01929524910.0002347284
0.00331.00762747290.00023204150.00841.01952997760.0002347825
0.00341.00785951440.00023209490.00851.01976476000.0002348365
0.00351.00809160940.00023214840.00861.01999959660.0002348906
0.00361.00832375780.00023220190.00871.02023448720.0002349447
0.00371.00855595960.00023225530.00881.02046943190.0002349988
0.00381.00878821490.00023230880.00891.02070443080.0002350529
0.00391.00902052380.00023236230.00901.02093948370.0002351071
0.00401.00925288610.00023241580.00911.02117459080.0002351612
0.00411.00948530190.00023246930.00921.02140975200.0002352154
0.00421.00971777120.00023252290.00931.02164496740.0002352695
0.00431.00995029410.00023257640.00941.02188023690.0002353237
0.00441.01018287050.00023263000.00951.02211556060.0002353779
0.00451.01041550050.00023268360.00961.02235093850.0002354321
0.00461.01064818410.00023273710.00971.02258637060.0002354863
0.00471.01088092120.00023279070.00981.02282185690.0002355406
0.00481.01111371200.00023284430.00991.02305739750.0002355948
0.00491.01134655630.00023289800.01001.02329299230.0002356490
0.00501.01157945430.0002329516   

Correctiefactor u als functie van t'

Deze tabel hoort bij de rekenmethode van Perryman.
De tabel is op maat gesneden voor de resolutie van de antilogaritmentabel van 0.0001 en de logaritmentabel van 10 decimalen.
De formule waar de tabel op gebaseerd is staat te lezen in de wiskundige uitleg van de Perryman-methode.

Voorbeeld van het gebruik: als t' ligt tussen 0.050299 en 0.060062, neem dan voor u de correctiefactor 6*10-6.

Onderstaande tabel is nauwkeuriger dan die van Perryman, want opnieuw berekend met de computer

t'u t'u t'u t'u
0.000000 0.147776 0.549500 0.864327 
 0 15 28 13
0.004362 0.160330 0.605518 0.876059 
 1 16 27 12
0.013202 0.173366 0.640779 0.887436 
 2 17 26 11
0.022206 0.186944 0.668831 0.898488 
 3 18 25 10
0.031383 0.201138 0.692845 0.909242 
 4 19 24 9
0.040744 0.216041 0.714184 0.919720 
 5 20 23 8
0.050299 0.231771 0.733582 0.929944 
 6 21 22 7
0.060062 0.248483 0.751488 0.939929 
 7 22 21 6
0.070046 0.266388 0.768201 0.949694 
 8 23 20 5
0.080268 0.285784 0.783933 0.959250 
 9 24 19 4
0.090745 0.307122 0.798837 0.968612 
 10 25 18 3
0.101498 0.331134 0.813033 0.977790 
 11 26 17 2
0.112549 0.359185 0.826612 0.986796 
 12 27 16 1
0.123925 0.394444 0.839649 0.995638 
 13 28 15 0
0.135655 0.450462 0.852204 1.000000 
 14 29 14  
0.147776 0.549500 0.864327   


Lagrange interpolatie

Stel we hebben een tabel en we willen een tussenliggende waarde berekenen. Een veel toegepaste methode is de lineaire interpolatie.
In de tabel staan x0, y0 en x1, y1 en van een tussenliggende waarde x willen we de bijbehorende y weten.

y = y0 + (x-x0).(y1-y0)/(x1-x0)

Deze methode gaat er vanuit dat de functie y = f(x) lineair verandert tussen x0 en x1. Dat is meestal niet het geval, waardoor een fout wordt gemaakt.
Eigenlijk is de lineaire interpolatie een 2-punts Lagrange interpolatie. In goede wiskundeboeken staat de afleiding van deze methode. Tevens staat in de boeken te lezen dat er sprake is van een restterm. Dat is een poging om de fout te schatten.

Voor een 2-punts Lagrange interpolatie luiden de formules:

f(x) = f(x0+p.h) = (1-p).f0 + p.f1 + R1
R1 = (1/2).p.(p-1).h2.f(2)(ξ) ≈ (1/2).p.(p-1).Δ02

waarbij:
f(x) is de functiewaarde die we willen weten
x0 is een tabelwaarde die gelijk is aan of net iets kleiner is dan x
h is de (gelijkmatige) afstand tussen de x-waarden = x1-x0 = x2-x1, enzovoorts
p is de fractie van h die we nodig hebben om uitgaande van x0 de gevraagde x te bereiken: p =(x-x0)/h
f0 is de functiewaarde f(x0) = y0
f1 is de functiewaarde f(x1) = y1
R1 is de Lagrange restterm
f(2)(ξ) is de tweede afgeleide van de functie in een niet nader te bepalen tussenpunt ξ
Δ02 is de waarde van de tweede verschilrij, horend bij punt x0

Als we een tabel met getallen hebben, kunnen we een verschilrij bepalen. Dat is de reeks getallen die ontstaat door telkens het verschil van twee opeenvolgende y-waarden te nemen. De tweede verschilrij is de reeks verschillen tussen twee opeenvolgende waarden van de eerste verschilrij, enzovoorts. Onderstaande tabel laat de eerste vier verschilrijen zien van een tabel met log-waarden. Merk op dat volgens afspraak het symbool voor de voorwaartse verschilrij de Griekse letter Delta is (Δ) en dat de tabelwaarde -0.0000000095 in de vierde verschilrij hoort bij x0. De waarde -0.0000273562 is Δ02, de waarde uit de tweede verschilrij, horend bij x0.

 xfn = log(x)Δ1Δ2Δ3Δ4
x-11.240.0934216852    
   0.0034883278   
x01.250.0969100130 -0.0000277957  
   0.0034605321 0.0000004395 
x11.260.1003705451 -0.0000273562 -0.0000000106
   0.0034331759 0.0000004289 
x21.270.1038037210 -0.0000269273 -0.0000000095
   0.0034062486 0.0000004194 
x31.280.1072099696 -0.0000265079  
   0.0033797407   
x41.290.1105897103    

Met wat rekenwerk kan worden bepaald dat Δ02 = f2-2.f1+f0 en Δ04 = f4-4.f3+6.f2-4.f1+f0.

Gewapend met bovenstaande kennis kunnen we de log van 1.25341 berekenen.
We zien dat 1.25 en 1.26 in de tabel staan, dus stellen we x0 = 1.25 en x1 = 1.26. Uit de tabel halen we f0 = 0.0969100130 en f1 = 0.1003705451. Het is duidelijk dat h = 0.01 en p = (1.25341-1.25)/0.01 = 0.341.
Invullen:

f(x) = log 1.25341 = (1-0.341)*0.0969100130 + 0.341*0.1003705451 = 0.0980900544.
Verschil met de exacte waarde: 31009*10-10.

Nu de restterm bepalen uit de waarde van de tweede verschilrij:

R1 = 0.5*0.341*(0.341-1)*-0.0000273562 = 0.0000030737
Optellen bij de eerder verkregen f(x):

log 1.25341 = 0.0980900544 + 0.0000030737 = 0.0980931281
Verschil met de exacte waarde: 272*10-10.

Dat is al een verbetering, maar nog lang geen 10 decimalen nauwkeurigheid.
De restterm kunnen we ook op een andere manier bepalen, als we de tweede afgeleide kennen van de functie. Toevallig is die in dit geval bekend. We geven in voorbereiding op het vervolg alvast een lijstje tot en met de vierde afgeleide:

f(x) = log(x) = ln(x)/ln(10)
f(1)(x) = (1/ln 10)*(1/x)
f(2)(x) = -(1/ln 10)*(1/x2)
f(3)(x) = (2/ln 10)*(1/x3)
f(4)(x) = -(6/ln 10)*(1/x4)

De restterm op basis van de tweede afgeleide in een tussenpunt, laten we zeggen 1.25341:

R1 = 0.5*0.341*(0.341-1) * 0.012 * -(1/ln 10)*(1/1.253412) = 0.0000031060

Optellen bij de eerder verkregen f(x):

log 1.25341 = 0.0980900544 + 0.0000031060 = 0.0980931604
Verschil met de exacte waarde: -51*10-10.

Dat ziet er nog beter uit.
De les die we hieruit kunnen leren is dat we met een lineaire interpolatie op deze wijze geen 10 decimalen nauwkeurigheid kunnen bereiken. Het toevoegen van de restterm wil een beetje helpen. Als we de functie kennen waar de tabel op is gebaseerd en daar de tweede afgeleide van kunnen bepalen, dan kunnen we soms een betere waarde van de restterm berekenen.

Zou een 4-punts Lagrange interpolatie wel een nauwkeurigheid van 10 decimalen kunnen geven?

De formule voor de 4-punts Lagrange interpolatie ziet er wat ingewikkelder uit:

f(x) = f(x0+p.h) = (-1/6).p.(p-1).(p-2).f-1 + (1/2).(p2-1).(p-2).f0 - (1/2).p.(p+1).(p-2).f1 + (1/6).(p2-1).p.f2 + R3
R3 = (1/24).(p2-1).p.(p-2).h4f(4)(ξ) ≈ (1/24).(p2-1).p.(p-2).Δ04

Zo tegen het begin van de tabel is gewoon de eerste de beste tabelingang gelijk aan f-1. Als x ligt tussen x-1 en x0 dan is p kleiner dan 0 en daardoor wordt de restfout groter. Zelfde verhaal voor het tabeleinde: reken de laatste ingang als f2. Tegen het tabeleinde wordt p dan een waarde tussen 1 en 2, en ook daardoor wordt de restfout groter.

Als we onze uitgangsgegevens allemaal netjes invullen krijgen we als uitkomsten:

4-punts interpolatie zonder restterm: 0.09809315548, verschil met exact: -2.0*10-10
Restterm op basis van verschilrij: -2.0*10-10
4-punts interpolatie + restterm/verschilrij: 0.09809315528, verschil met exact: ≈ +0*10-10
Restterm op basis van afgeleide: -2.2*10-10
4-punts interpolatie + restterm/afgeleide: 0.09809315526, verschil met exact: 0.2*10-10

Geheel toevallig bereiken we hier juist met de verschilrij-restterm een iets betere interpolatie.
In dit geval geeft een 4-punts Lagrange interpolatie een nauwkeurigheid van 10 decimalen. Aanbevolen wordt om bij waarden van x die niet veel groter zijn dan 1, door te zetten tot een 5-punts interpolatie.
Dat is zo'n gedoe, dat de eerder besproken methode van Perryman veel sneller tot resultaten met 10 decimalen leidt.
Of wat we tegenwoordig doen: even ons zakrekenmachientje of calculatorprogrammaatje pakken!


Hoe berekenen computers de logaritme?

Als de precisie niet fabelachtig groot hoeft te zijn, kan de logaritme prima worden benaderd met een polynoom. Dat kan op verschillende manieren. Een van de simpelste polynomen is:

log(x) = 0.86304*t + 0.36415*t3
met t = (x-1)/(x+1) en x moet liggen tussen 1/√10 en √10

De precisie is niet erg groot: hooguit 6*10-4.

Hieronder geven we een indruk van een stuk code dat al meer dan 25 jaar geleden is ontwikkeld. De natuurlijke logaritme wordt met bijna 32 decimalen nauwkeurig berekend. Dat gebeurt met behulp van een zogeheten Chebyshev polynoom. In dit geval wordt een tiendegraads polynoom toegepast, dat op een speciale manier moet worden berekend om afrondingsfouten zo veel mogelijk te vermijden. Wij hebben in onderstaande code enkele administratieve details weggelaten. Die zijn nodig om ervoor te zorgen dat de compiler in kwestie het maximum kan halen uit wat er op uw machine mogelijk is. Neem dus niet onderstaande code over, maar gebruik de originele code of een vergelijkbare 'echte' routine, bijvoorbeeld uit de Cephes bibliotheek die bovendien moderner is.

-- Functie DLOG = ln(X), double precision Fortran
-- Gewogen fout in de uitkomst: hooguit 4.15*10-32
-- SLATEC Fortran bibliotheek.
-- Zie Netlib / SLATEC / special functions
-- Auteur van deze routine: W. Fullerton, C-3,
-- Los Alamos Scientific Laboratory
-- Onderstaande is geen Fortran, maar onze eigen vertaling
-- van de essentie van de routine.
  
-- Vullen van wat constanten.
ALNCS(1) = 1.3347199877973881561689386047187
ALNCS(2) = 0.69375628328411286281372438354225*0.001
ALNCS(3) = 0.42934039020450834506559210803662*0.000001
ALNCS(4) = 0.28933847795432594580466440387587*10^-9
ALNCS(5) = 0.20512517530340580901741813447726*10^-12
ALNCS(6) = 0.15039717055497386574615153319999*10^-15
ALNCS(7) = 0.11294540695636464284521613333333*10^-18
ALNCS(8) = 0.86355788671171868881946666666666*10^-22
ALNCS(9) = 0.66952990534350370613333333333333*10^-25
ALNCS(10) = 0.52491557448151466666666666666666*10^-28
ALNCS(11) = 0.41530540680362666666666666666666*10^-31
CENTER(1) = 1.0
CENTER(2) = 1.25
CENTER(3) = 1.50
CENTER(4) = 1.75
ALNCEN(1) = 0.0
ALNCEN(2) = 0.22314355131420975576629509030983 -- dit is ln(1.25)
ALNCEN(3) = 0.40546510810816438197801311546434 -- ln(1.5)
ALNCEN(4) = 0.55961578793542268627088850052682 -- ln(1.75)
ALNCEN(5) = 0.69314718055994530941723212145817 -- ln(2)
ALN2 = 0.06814718055994530941723212145818 -- ln(2)-0.625

-- Hier zou moeten worden bepaald hoe veel
-- termen NTERMS van ALNCS moeten worden meegenomen
-- in de berekening. Wij nemen gewoon alle 11.
-- Vervolgens wordt X gereduceerd.

N = 0
ABSX = abs(X)
if ABSX >= 0.5 and ABSX < 1 then Y = X
if ABSX > 1 then
  repeat while ABSX >= 1
    N = N+1
    ABSX = 0.5*ABSX
  end repeat
end if
if ABSX < 0.5 then
  repeat while ABSX < 0.5
    N = N-1
    ABSX = 2*ABSX
  end repeat
end if
Y = ABSX
-- Eigenlijk Y = sign(X)*ABSX, maar X moet toch altijd > 0 zijn.

-- Verdere reductie van X
XN = N-1
Y = 2*Y
NTRVAL = trunc(4*Y-2.5) -- of int() of floor()
if NTRVAL = 5 then
  T = ((Y-1.0)-1.0)/(Y+2.0)
end if
if NTRVAL < 5 then
  T = (Y-CENTER(NTRVAL)) / (Y+CENTER(NTRVAL))
end if
T2 = T*T
  
--Chebyshev polynoom uitrekenen
NTERMS = 11
FX = 578.0*T2-1.0
B1 = 0
B0 = 0
TWX = 2*FX
repeat with i=1 to NTERMS
  B2 = B1
  B1 = B0
  NI = NTERMS+1-i
  B0 = TWX*B1-B2+ALNCS(NI)
end repeat
DCSEVL = 0.5*(B0-B2)

DLOG = ALN2*XN + ALNCEN(NTRVAL) + 2.0*T + T*T2*DCSEVL + 0.625*XN
-- DLOG is de uitkomst, ln(X)

 
Wat te doen als de precisie nog groter moet zijn, bijvoorbeeld twintigduizend decimalen?
Ook dan staan er verscheidene mogelijkheden open. Er kan gebruik worden gemaakt van de Taylor reeksontwikkeling van ln(1+x):

ln(1+x) = x - x2/2 + x3/3 - x4/4 + ...

Deze reeks convergeert alleen als x kleiner is dan 1. Dat betekent dat x eerst moet worden gereduceerd en dat gebeurt door een paar keer de wortel te trekken, immers:
ln(x)=2k*ln(x2-k).

Worteltrekken met willekeurige precisie kan in principe gebeuren op de manier die vergelijkbaar is met het trekken van een wortel met de hand, met een soort staartdelingsmethode. Aangezien de Taylor-reeks voor ln(1+x) erg traag convergeert, zijn er enkele modificaties bedacht zodat er minder termen hoeven te worden berekend. Het leuke van deze reeks is dat we weten dat de afbreekfout ten hoogste gelijk is aan de waarde van de laatst berekende term.
Helemaal aan het begin van dit verhaal staat een voorbeeld van een logaritme in meer dan 250 decimalen nauwkeurig, uitgerekend met een modern computerprogramma.

-- THE END --
 

© Oscar van Vlijmen, mei 2003/May 2003
Datum laatste wijziging: 2012-07-11

Ga naar start/Home