Matematika/Teiloro eilutė

Iš testwiki.
Pereiti į navigaciją Jump to search

Teiloro eilutė išsamiai


Makloreno eilutės įrodymas

Darome prielaidą, kad funkciją f(x) galima užrašyti tokia eilute
f(x)=a0+a1x+a2x2+a3x3+a4x4+a5x5+.
Tuomet surandame visų eilių (laipsnių) išvestines funkcijos f(x):
f(x)=a1+2a2x+3a3x2+4a4x3+5a5x4+,
f(x)=(f(x))=2a2+32a3x+43a4x2+54a5x3+,
f(x)=32a3+432a4x+543a5x2+,
f(4)(x)=432a4+5432a5x+,
f(5)(x)=5432a5+.
Kad surasti kam lygūs koeficientai an, paimame gautų išvestinių reikšmes nuo nulio (kai x=0):
f(0)=a0+a10+a202+a303+a404+a505+=a0,
f(0)=a1+2a20+3a302+4a403+5a504+=a1,
f(0)=2a2+32a30+43a402+54a503+=2a2=2!a2,
f(0)=32a3+432a40+543a502+=32a3=3!a3,
f(4)(0)=432a4+5432a50+=432a4=4!a4,
f(5)(0)=5432a5+=5432a5=5!a5.
Dabar nesunku rasti koeficientus an:
a0=f(0),
a1=f(0),
a2=f(0)2!,
a3=f(0)3!,
a4=f(4)(0)4!,
a5=f(5)(0)5!,
an=f(n)(0)n!.
Dabar tereikia įstatyti gautus koeficientus an į eilutę
f(x)=a0+a1x+a2x2+a3x3+a4x4+a5x5+=f(0)+f(0)x+f(0)2!x2+f(0)3!x3+f(4)(0)4!x4+f(5)(0)5!x5+.
Taigi, gavome funkciją f(x) išreikšta Makloreno eilute:
f(x)=f(0)+f(0)x+f(0)2!x2+f(0)3!x3+f(4)(0)4!x4+f(5)(0)5!x5+.

Pavyzdžiai

  • Išreikšti funkciją f(x)=sin(x) Makloreno eilute.
Sprendimas.
sin(x)+(sin(x))x+(sin(x))2!x2+(sin(x))3!x3+(sin(x))(4)4!x4+(sin(x))(5)5!x5+=
=sin(x)+xcos(x)+sin(x)2!x2+cos(x)3!x3+sin(x)4!x4+cos(x)5!x5+.
sin(x)=sin(0)+xcos(0)+sin(0)2!x2+cos(0)3!x3+sin(0)4!x4+cos(0)5!x5+=
=0+x1+02!x2+13!x3+04!x4+15!x5+=
=xx33!+x55!.
Gauname, kad
sin(x)=xx33!+x55!x77!+x99!x1111!+.


  • Užrašyti funkcija f(x)=11x Makloreno eilute.
Sprendimas.
11x+(11x)x+(11x)2!x2+(11x)3!x3+(11x)(4)4!x4+(11x)(5)5!x5+=
=11x+1(1x)2x+((1x)2)((1x)2)22!x2+2((1x)3)((1x)3)23!x3+6((1x)4)((1x)4)24!x4+24((1x)5)((1x)5)25!x5+=
=11x+1(1x)2x+2(1x)(1x)42!x2+23(1x)2(1)(1x)63!x3+64(1x)3(1)(1x)84!x4+245(1x)4(1)(1x)105!x5+=
=11x+1(1x)2x+2(1x)32!x2+6(1x)43!x3+24(1x)54!x4+120(1x)65!x5+=
=11x+1(1x)2x+1(1x)3x2+1(1x)4x3+1(1x)5x4+1(1x)6x5+.
f(x)=11x=f(0)+f(0)1!x+f(0)2!x2+f(0)3!x3+f(4)(0)4!x4+f(5)(0)5!x5+=
=110+1(10)21!x+2(10)32!x2+6(10)43!x3+24(10)54!x4+120(10)65!x5+=
=110+1(10)2x+1(10)3x2+1(10)4x3+1(10)5x4+1(10)6x5+=
=1+x+x2+x3+x4+x5+.

Teiloro formulė

Teiloro eilute užrašomos funkcijos pavidalas yra toks:
f(x)=f(x0)+f(x0)1!(xx0)+f(x0)2!(xx0)2+f(x0)3!(xx0)3+...+f(n)(x0)n!(xx0)n+f(n+1)(c)(n+1)!(xx0)n+1.(8)
Čia liekamasis narys Lagranžo formoje yra rn+1=f(n+1)(c)(n+1)!(xx0)n+1. Ir x0<c<x.
Teiloro formulė, kurios x0=0, vadinama Makloreno formule. Remiantis (8) formule, galime parašyti tokią Makloreno formulės išraišką:
f(x)=f(0)+f(0)1!x+f(0)2!x2+f(0)3!x3+...+f(n)(0)n!xn+f(n+1)(c)(n+1)!xn+1.(9)
Šįkart 0<c<x.

Sinuso liekamojo nario įvertinimas

  • Apskaičiuosime sin(1) su paklaida mažesne nei 106.
Žinoma, kad
f(n)(x)=(sinx)(n)=sin(nπ2+x).
Tuomet
f(n)(0)=sin(nπ2)={0,kain=2k,(1)k,kain=2k+1.
Čia k yra sveikasis skaičius. Todėl
sinx=xx33!+x55!x77!+...+(1)kx2k+1(2k+1)!+r2k+3(x);(11)
čia |r2k+3(x)|=|x2k+3(2k+3)!sin((2k+3)π2+c)|=|x2k+3(2k+3)!cosc|(0<c<x).
Laikysime, kad cos(c)=1. Tada, tarus, kad x=1, turi būti tenkinama nelygybė
|x2k+3(2k+3)!cosc|<106,
|12k+3(2k+3)!1|<106,
|1(2k+3)!|<106,
106<(2k+3)!.
Paskutinė nelygybė tenkinama, kai k=4 ir tada (2k+3)!=(24+3)!=11!=39916800. Tuomet mums reikia paskaičiuoti Makloreno eilutę iki n=9:
sin1=1133!+155!177!+199!=
=116+112015040+1362880=
=0.84147100970017636684303350970018.
Tikroji (tiksli) sin(1) reikšmė iš skaičiuotuvo yra:
sin(1)=
=0.8414709848078965066525023216303.
Atėmus gautą mūsų skaičiuotą sin(1) reikšmę iš kalkuliatoriaus sin(1) reikšmės gauname tokią paklaidą:
0.8414709848078965066525023216303 - 0.84147100970017636684303350970018=
=-2.4892279860190531188069881000377e-8=
=2.489227986019108;
|2.489227986019108|<106.
Taigi, viskas apskaičiuota pagal teoriją ir paklaida surasta teisingai.
Pastebėsime, kad 11!=39916800>107, todėl paklaida gauta
|2.489227986019108|<107.


  • Apskaičiuosime sin(0.1) su paklaida mažesne nei 109.
Pasinaudoję pirmu pavyzdžiu, išeina, kad turi būti tenkinama nelygybė
|x2k+3(2k+3)!cosc|<109,
kurioje laikysime, kad cos(c)=1, o x=0.1. Tada
0.12k+3(2k+3)!1<109.
Pabandykime atspėti, kad sveikasis skaičius k galėtų būti lygus 2. Tada
0.122+3(22+3)!<109,
0.177!<109,
17!<109107,
17!<102,
102<7!,
100<7!=5040.
Nesunku matyti, kad su skaičiumi k=2, paklaida bus mažesnė už 1010. Belieka užrašyti sinuso Teiloro eilutę, kai x=0.1, o n=5:
sin(0.1)=0.10.133!+0.155!=
=0.10.0016+0.00001120=
= 0.09983341666666666666666666666667.
Windows kalkuliatoriaus sin0.1 reikšmė yra tokia
sin(0.1) =
= 0.09983341664682815230681419841062.
0.09983341664682815230681419841062 - 0.09983341666666666666666666666667 =
= -1.9838514359852468256047973010085e-11 =
=1.9838511011.
|1.9838511011|<1010<109.
Vadinasi paklaidą radome teisingai.


  • Apskaičiuosime sin(1.5) su paklaida mažesne nei 106.
Pasinaudoję pirmu pavyzdžiu, išeina, kad turi būti tenkinama nelygybė
|x2k+3(2k+3)!cosc|<106,
kurioje laikysime, kad cosc=1, o x=1.5 radiano. Ši nelygybė tenkinama, kai k=5, nes
|1.525+3(25+3)!1|<106,
|1.51313!1|<106,
1.51313!<106,
194.61950683593756227020800<106,
3.1254031917789242108<106.
Taigi, matome, kad paklaida bus mažesnė už 107. Sinuso eilutė, kai x=1.5, o n=11 yra tokia:
sin(1.5)=1.51.533!+1.555!1.577!+1.599!1.51111!=
=1.53.3756+7.5937512017.08593755040+38.44335937536288086.4975585937539916800=
= 1.5 - 3.375/6 + 7.59375/120 - 17.0859375/5040 + 38.443359375/362880 - 86.49755859375/39916800 = (šitą išraišką galima iškart įdėt (padaryt "Paste") į Windows kalkuliatorių ir jis iškart atliks visus aritmetinius veiksmus ir duos atsakymą)
= 0.99749495568213524756493506493506.
Gautą sin(1.5) reikšmę atėmę iš tikslios (kalkuliatoriaus) sin(1.5) reikšmės gauname paklaidą:
0.99749498660405443094172337114149 - 0.99749495568213524756493506493506 =
= 3.0921919183376788306206422387642e-8 =
=3.0921919108<107<106.
Paklaidos didumas gautas pagal teoriją.


Kosinuso liekamojo nario įvertinimas

  • Apskaičiuosime cos(1) su paklaida mažesne nei 106.
f(x)=cosx. Žinoma, kad
f(n)(x)=(cosx)(n)=cos(nπ2+x).
Tuomet
f(n)(0)=cosnπ2={0,kain=2k+1,(1)k,kain=2k.
Čia k yra sveikasis skaičius. Todėl
cosx=1x22!+x44!x66!+...+(1)kx2k(2k)!+r2k+2(x);(12)
čia |r2k+2(x)|=|x2k+2(2k+2)!cos((2k+2)π2+c)|=|x2k+2(2k+2)!cosc|(0<c<x).
Tada
|r2k+2(x)|=|x2k+2(2k+2)!cosc|<x2k+2(2k+2)!
(nes |cos(c)| negali būti daugiau už 1),
|r2k+2(x)|<x2k+2(2k+2)!<106.
Paskutinė nelygybė tenkinama, kai k=4, nes (tada kai x=1)
|r2k+2(1)|<124+2(24+2)!<106,
|r2k+2(1)|<110!<106,
|r2k+2(1)|<13628800<106,
|r2k+2(1)|<2.75573192107<106.
Dabar galime užrašyti cos1 (kosinusas nuo 1 radiano) Makloreno eilutę, kai n=2k=8:
cos1=1122!+144!166!+188!=
=112+1241720+140320=
= 0.54030257936507936507936507936508.
Atėmę gautą cos1 reikšmę iš tikslios (kalkuliatoriaus) cos1 reikšmės gausime:
cos(1) - 0.54030257936507936507936507936508 =
= 0.54030230586813971740093660744298 - 0.54030257936507936507936507936508 =
= -2.7349693964767842847192210276135e-7.
|2.734969396107|<2.75573192107<106.
Vadinasi, liekamajį narį |r2k+2(x)|=|x2k+2(2k+2)!cosc| apskaičiavome teisingai (kai x lygus 1 radianui).


  • Apskaičiuosime cos(0.1) su paklaida mažesne nei 108.
Pasinaudoję pirmu pavyzdžiu, turime
|r2k+2(x)|=|x2k+2(2k+2)!cosc|<x2k+2(2k+2)!,
|r2k+2(x)|<x2k+2(2k+2)!<108.
Paskutinė nelygybė tenkinama, kai k=2, o x=0.1 radiano, nes
|r2k+2(0.1)|<0.122+2(22+2)!<108,
|r2k+2(0.1)|<0.166!<108,
|r2k+2(0.1)|<0.000001720<108,
|r2k+2(0.1)|<1.388888889109<108.
Dabar galime užrašyti cos(0.1) Makloreno eilutę, kai n=2k=4:
cos0.1=10.122!+0.144!=10.012+0.000124=
= 0.9950041(6).
Tiksli cos(0.1) reikšmė yra
cos(0.1) = 0.99500416527802576609556198780387.
Atėmę apskaičiuotą cos(0.1) reikšmę iš tikslios cos(0.1) reikšmės gauname:
0.99500416527802576609556198780387 - 0.99500416666666666666666666666667 =
= -1.3886409005711046788627997051614e-9 =
=1.3886409109.
Taigi
|r2k+2(0.1)||1.3886409109|<1.388888889109<108.
Ką ir reikėjo parodyti.


  • Apskaičiuosime cos(1.5) su paklaida mažesne nei 108.
Pasinaudoję pirmu pavyzdžiu, turime
|r2k+2(x)|=|x2k+2(2k+2)!cosc|<x2k+2(2k+2)!,(0<c<x)
|r2k+2(1.5)|=|1.52k+2(2k+2)!cosc|<1.52k+2(2k+2)!,(0<c<1.5)
|r2k+2(1.5)|<1.52k+2(2k+2)!<108.
Paskutinė nelygybė tenkinama, kai k=6, nes
|r2k+2(1.5)|<1.526+2(26+2)!<108.
|r14(1.5)|<1.51414!<108.
|r14(1.5)|<291.9292602539062587178291200<108.
|r14(1.5)|<3.3486462769109<108.
Dabar užrašysime cos(1.5) Makloreno eilutę, kai n=2k=12:
cos1.5=11.522!+1.544!1.566!+1.588!1.51010!+1.51212!=
=12.252+5.06252411.390625720+25.628906254032057.66503906253628800+129.746337890625479001600=
= 1 - 2.25/2 + 5.0625/24 - 11.390625/720 + 25.62890625/40320 - 57.6650390625/3628800 + 129.746337890625/479001600 =
(įstačius šią išraišką nuo "1" iki "=" į Windows'ų kalkuliatorių gaunamas iškart apskaičiuotas atsakymas)
= 0.07073720498518510298295454545455.
Tiksli cos(1.5) (1.5 radiano) reikšmė iš Windows kalkuliatoriaus yra
cos(1.5) = 0.07073720166770291008818985143427.
Atėmę apskaičiuotą nevisiškai tikslią cos(1.5) reikšmę iš tikslios cos(1.5) reikšmės, gauname paklaidą:
0.07073720166770291008818985143427 - 0.07073720498518510298295454545455 =
= -3.3174821928947646940202767454604e-9.
Matome, kad
|r14(1.5)||3.31748219109|<3.3486462769109<108.

Natūrinio logaritmo liekamojo nario įvertinimas

Natūrinio logaritmo reikšmės greitas skaičiavimas: https://en.wikipedia.org/wiki/Natural_logarithm#Efficient_computation
  • f(x)=ln(1+x). Apskaičiuosime ln(1+0.5)=ln(1.5) su paklaida mažesne nei 0.0001, kai x=0.5.
Randame išvestines:
f(x)=11+x,f(x)=1(1+x)2,f(x)=(1)22(1+x)3,f(4)(x)=(1)323(1+x)4,...,
f(n)(x)=(1)n1(n1)!(1+x)n,n=1,2,3,...
Apskaičiuosime jų reikšmes taške x=0:
f(0)=ln(1+0)=0,f(0)=1,f(0)=1,f(0)=(1)22=2,f(4)(0)=(1)323=3!,...,
f(n)(0)=(1)n1(n1)!
Vadinasi,
ln(1+x)=f(0)+f(0)1!x+f(0)2!x2+f(0)3!x3+f(4)(0)4!x4+...+f(n)(0)n!xn+f(n+1)(c)(n+1)!xn+1=
=xx22+x33x44...+(1)n1xnn+rn+1(x);(13)
čia |rn+1(x)|=|xn+1(1+c)n+1(n+1)|,0<c<0.5.
Matome, kad
|rn+1(x)|=|xn+1(1+c)n+1(n+1)|<|xn+1(n+1)|.
Kai n=9, o x=0.5, gausime, kad |rn+1(x)|<0.0001, nes
|0.59+1(9+1)|=0.51010=0.000976562510=0.00009765625
ir 0.00009765625 < 0.0001. Apskaičiuosime kam lygi ši eilutė, kai n=9, o x=0.5:
ln(1+0.5)=0.50.522+0.5330.544+0.5550.566+0.5770.588+0.599=
=0.5-0.25/2+0.125/3-0.0625/4+0.03125/5-0.015625/6+0.0078125/7-0.00390625/8+0.001953125/9=
(įdėjus (padarius "Copy"-"Paste") šią eilutę nuo "0.5" iki "=" į Windows kalkuliatorių iškart gauname atsakymą)
=0.40553230406746031746031746031746.
Kalukiatoriaus ln(1.5) reikšmė yra tokia: ln(1.5)=
=0.40546510810816438197801311546435.
Atėmę mūsų apskaičiuotą eilutės reikšmę iš kalkuliatoriaus ln(1.5) reikšmės, gauname
0.40546510810816438197801311546435 - 0.40553230406746031746031746031746 = -6.7195959295935482304344853111181e-5.
Matome, kad
|r9+1(0.5)|=|6.71959592959105|<0.00009765625<0.0001.


  • f(x)=ln(1+x). Apskaičiuosime ln(1+0.9)=ln(1.9) su paklaida mažesne nei 0.01, kai x=0.9.
ln(1+x)=xx22+x33x44...+(1)n1xnn+rn+1(x);(13)
čia |rn+1(x)|=|xn+1(1+c)n+1(n+1)|,0<c<0.9.
Matome, kad
|rn+1(x)|=|xn+1(1+c)n+1(n+1)|<|xn+1n+1|.
Kai n=19, o x=0.9, gausime, kad |rn+1(x)|<0.01, nes
0.919+119+1=0.92020=0.1215766545905692880120=0.0060788327295284644005
ir 0.0060788327295284644005 < 0.01. Apskaičiuosime kam lygi ši eilutė, kai n=19, o x=0.9:
ln(1+0.9)=0.90.922+0.9330.944+0.9550.966+0.9770.988+0.9990.91010+
+0.911110.91212+0.913130.91414+0.915150.91616+0.917170.91818+0.91919=
= 0.62619810431142857142857142857143 + 0.01893065053370873839967787630326 = 0.64512875484513730982824930487469.
Windows kalkuliatoriaus tiksli ln(1.9) reikšmė yra tokia: ln(1.9) = 0.64185388617239477599103597720349.
Atėmę apskaičiuotą netikslią ln(1.9) reikšmę iš tikslios Windows kalkuliatoriaus ln(1.9) reikšmės, gauname:
0.64185388617239477599103597720349 - 0.64512875484513730982824930487469 = -0.0032748686727425338372133276712.
Taigi
|r20(0.9)||0.00327486867274|<0.0060788327295284644005<0.01.
Liekamojo nario įvertinimą gavome teisingai.


Pastebėsime, kad kai x reikšmė arti 1 arba lygi 1, tai ln(1+x) eilutė gaunasi labai ilga ir atsakymas labai netikslus. Vienas būdas atsakymo skaičiavimą pagreitinti yra užrašymas
ln(1+1)=ln(0.210)=ln0.2+ln10=ln(10.8)+ln10
arba, pavyzdžiui, kai x=0.99, gautume
ln(1+0.99)=ln(1.99)=ln(0.19910)=ln0.199+ln10=ln(10.801)+ln10
ir galime apskaičiuoti ln(1+x) su x=0.8 arba x=0.801. Tada Makloreno eilutės skaičiavimai gerokai sutrumpėja, bet vistiek gana ilgi.
ln10 galima apskaičiuoti taip:
ln10=ln(1.258)=ln1.25+ln8=ln(1+0.25)+3ln2.
O ln2 galima apskaičiuoti taip:
ln2=ln(22)=ln2+ln22ln(1.414213562373)=2ln(1+0.414213562373).
Daug kartų traukiant šaknį kaip ką tik darėme su ln(2) galima gana greitai apskaičiuoti ln(1+x) su bet kokia x reikšme nuo -1 iki 1 (1<x1).
Pavyzdžiui, ištraukus 4 kartus kvadratinę šaknį iš 2 gausime
ln2=2222ln(212121212)16ln(1.04427378242741384)=16ln(1+0.04427378242741384).
Jei užrašysime ln(1+x) eilutę su x=0.04427378242741384 ir n=9, tai
|r9+1(0.04427378242741384)|<|xn+1n+1|0.044273782427413849+19+1=
=2.89378502579267661242101410=2.893785025792676612421015<1014.
Gavome ln2 su paklaida mažesne nei 1014 (gali būti, kad padauginus ln(1.04427378242741384) iš 16 paklaida pasidarys truputi didesnė, gal šiuo atveju pasidarys apie 1013 ar 1012).
Pastebėsime, kad pavyzdžiui ln(0.00003) galima apskaičiuoti taip:
ln(0.00003)=ln(3105)=ln(0.3104)=ln0.3+ln104=ln(10.7)4ln10.


  • Apskaičiuosime ln(0.3) su paklaida mažesne nei 0.01. Pasinaudosime pirmu pavyzdžiu.
Vadinasi,
ln(1+x)=f(0)+f(0)1!x+f(0)2!x2+f(0)3!x3+f(4)(0)4!x4+...+f(n)(0)n!xn+f(n+1)(c)(n+1)!xn+1=
=xx22+x33x44...+(1)n1xnn+rn+1(x);(13)
čia |rn+1(x)|=|xn+1(1+c)n+1(n+1)|,0>c>0.7. Nes ln0.3=ln(1+(0.7)).
Turime
|rn+1(x)|=|xn+1(1+c)n+1(n+1)|<|xn+1(10.7)n+1(n+1)|=|xn+10.3n+1(n+1)|.
Kai n=19, o x=0.7, gausime:
|(0.7)19+10.319+1(19+1)|=(0.7)200.32020=
=0.000797922662976120010.0000000000348678440120=
=1144209.9241170145552684546382425.
Matome, kad tokiu budu ln(0.3) apskaičiuoti negalima (tiksliau, negalima sužinoti paklaidos).
Galima iš 0.3 ištraukti, pavyzdžiui, 4 kartus kvadratinę šaknį. Tada turėsime:
ln(0.3)=16ln(0.3116)16ln(0.9275131559667915)=16ln(10.07248684403320849).
Tada
|rn+1(x)|=16|xn+1(1+c)n+1(n+1)|,0>c>0.07248684403320849.
Turime
|rn+1(x)|=16|xn+1(1+c)n+1(n+1)|<16|xn+1(10.07248684403320849)n+1(n+1)|=16|xn+10.9275131559667915n+1(n+1)|.
Kai n=19, o x=0.07248684403320849, gausime:
|(0.07248684403320849)19+10.927513155966791519+1(19+1)|=(0.07248684403320849)200.92751315596679152020=
=1.60392417340968710230.22202484134768557520=
=3.6120376523498566762096049279603e-24=
3.61203765234985667621024.
|rn+1(x)|=|r20(0.07248684403320849)|<163.61203765234985667621024=5.779260243759771023.
ln(10.07248684403320849)=
=0.0724(0.0724)22+(0.0724)33(0.0724)44+(0.0724)55(0.0724)66+(0.0724)77(0.0724)88+(0.0724)99(0.0724)1010+
+(0.0724)1111(0.0724)1212+(0.0724)1313(0.0724)1414+(0.0724)1515(0.0724)1616+(0.0724)1717(0.0724)1818+(0.0724)1919=
[vietoje (-0.0724) imama -0.07248684403320849089929261472692 reikšmė]
= -0.07524830027034272898276362268037 + (-2.8270556157154487988345737336471e-14) =
= -0.07524830027037099953892077716836.
-0.07524830027037099953892077716836 * 16 = -1.2039728043259359926227324346937.
Atėmę gautą ln(0.3) reikšmę iš tikslios kalkuliatoriaus reikšmės (-1.2039728043259359926227462177618), gauname:
-1.2039728043259359926227462177618 - (-1.2039728043259359926227324346937) = -1.3783068138502953610930772512816e-23.
Taigi gavome paklaidą |-1.3783068138502953610930772512816e-23| (tai reiškia |1.378306813851023|). Ir
|rn+1(x)|=|r20(0.07248684403320849)||1.378306813851023|<5.779260243759771023.
Kas atitinka teoriją.
Pastebėsime, kad jeigu vietoje c=-0.07248684403320849, parinksime c=0, tai gausime, kad paklaida turėtų būti mažesnė už
5.7792602437597710230.222024841347685575=1.28313933872771023.
Bet
1.28313933872771023<|1.378306813851023|.
Ir gaunasi, kad su c=0, gautume truputi melagingą paklaidą.


  • Apskaičiuosime ln(0.11) ir įvertinsime paklaidą.
Iš 0.11 ištrauksime 4 kartus kvadratinę šaknį. Tada turėsime:
ln(0.11)=2222ln(0.1112121212)=16ln(0.11116)16ln(0.871138169026)=16ln(10.12886183).
Tai yra, x=-0.12886183097395441374956757206472.
Tada
|rn+1(x)|=16|xn+1(1+c)n+1(n+1)|,0>c>0.12886183.
Turime
|rn+1(x)|=16|xn+1(1+c)n+1(n+1)|<16|xn+1(10.1288618309739544)n+1(n+1)|=16|xn+10.871138169026n+1(n+1)|.
Kai n=19, o x=0.12886183097395, gausime:
|(0.12886183097395)19+10.87113816902619+1(19+1)|=(0.12886183097395)200.8711381690262020=1.593991338891810180.06334915939720=
= 1.2580998343623026293204200398239e-18 =
1.25809983436231018.
|rn+1(x)|=|r20(0.12886183)|<161.25809983436231018=2.01295973497968421017.
ln(10.12886183097395)=
=0.1288(0.1288)22+(0.1288)33(0.1288)44+(0.1288)55(0.1288)66+(0.1288)77(0.1288)88+(0.1288)99(0.1288)1010+
+(0.1288)1111(0.1288)1212+(0.1288)1313(0.1288)1414+(0.1288)1515(0.1288)1616+(0.1288)1717(0.1288)1818+(0.1288)1919=
[vietoje (-0.1288) imama -0.12886183097395441374956757206472 reikšmė]
= -0.13795468205758418170298735700763 -1.6773369704537036636530891506237e-11 =
= -0.13795468207435755140752439364416.
ln(0.11) = -0.13795468207435755140752439364416 * 16 = -2.2072749131897208225203902983066.
Atėmę šią gautą ln(0.11) reikšmę iš tikslios (ln(0.11)=-2.2072749131897208239740393314036) kalkuliatoriaus reikšmės, gauname:
-2.2072749131897208239740393314036 - (-2.2072749131897208225203902983066) =
= -2.2072749131897208239740393314036 + 2.2072749131897208225203902983066 =
= -1.4536490330969991153804961232531e-18.
Tada
|rn+1(x)|=|r20(0.12886183)||1.4536490330969991018|<2.01295973497968421017.
Paklaidos įvertinimas gavosi pagal teoriją. Apskaičiavome ln(0.11) su paklaida mažesne nei 1016 (nors paklaida mažesnė nei 1017, bet to nuspėti negalėjome).
Pastebėsime, kad 2.012959734979684210170.87113816902620=2.012959734979684210170.063349159397=1.27519307110971018. Tai yra, 1.27519307110971018<|1.4536490330969991018|. Gaunasi truputi neteisingas paklaidos ivertinimas, jei čia
|rn+1(x)|=16|xn+1(1+c)n+1(n+1)|,
vietoje c=-0.12886183, parinkti c=0.


Pastebėsime, kad ln(0.11) galima užrašyti ir apskaičiuoti taip:
ln0.11=ln(1.1101)=ln(1.1)+ln101=ln(1+0.1)ln10.
O ln(0.3) galima užrašyti ir apskaičiuoti taip:
ln0.3=ln(3101)=ln3+ln101=ln(1.52)ln10=ln(1+0.5)+ln2ln10.


Kadangi skaičiuojant ln(x) gali prireikti traukti kvadratinę šaknį, tai pateiksime paprastą algoritmą kaip ištraukti kvadratinę šaknį iš bet kokio skaičiaus.
Kad gauti x:
Žingsnis 1: Spėjimas G = 1.
Zingsnis 2: Naujas Spėjimas = (G + x/G)/2
Pakartoti Žingsnį 2 kiek norima kartų, kad gauti kiek norima tikslų resultatą.
Pavyzdžiui, 2 skaičiavimai:
G = 1
G = (1+2/1)/2 = 3/2 = 1.5
G = (3/2 + 4/3)/2 = 17/12 = 1.4166666667
G = (17/12 + 24/17)/2 = 577/408 = 1.414215686
G = (577/408 + 816/577)/2 = 665857/470832 = 1.4142135623746899106262955788901.
Atėmę gautą 2 reikšmę iš tikslios 2 reikšmės, gauname paklaidą:
1.4142135623730950488016887242097 - 1.4142135623746899106262955788901 = -1.5948618246068546804368315468877e-12 =
1.59486182461012.
Tačiau yra daug greitesnis šaknies traukimo būdas apie kurį galima paskaityti čia https://lt.wikibooks.org/wiki/Sekos_riba#Greitas_šaknies_iš_skaičiaus_a_traukimo_būdas
Dar pastebėsime, kad jeigu skaičiuojamas ln(x) ir x>1.4, tai yra protinga užrašyti, pvz. ln(1.8) taip:
ln1.8=ln(20.9)=ln2+ln0.9=ln2+ln(10.1).
[ ln1.4=ln(20.7)=ln2+ln0.7=ln2+ln(10.3). ]
Matome, kad tokiu budu ln(0.9)=ln(1-0.1) galima labai greitai apskaičiuoti.

e pakelta x liekamojo nario įvertinimas

  • Apskaičiuosime e12 su paklaida mažesne nei 0.000001=106.
f(x)=ex. Kadangi f(n)(x)=ex,f(n)(0)=e0=1 su visais n, priklausantiems natūraliesiems skaičiams, tai
ex=1+x+x22!+x33!+x44!+...+xnn!+rn+1(x);(10)
čia rn+1(x)=f(n+1)(c)(n+1)!xn+1=ec(n+1)!xn+1,0<c<x.
Įrašę į (10) formulę vietoje x skaičių 12, gauname
e=e12=1+12+(12)22!+(12)33!+(12)44!+...+(12)nn!+rn+1(0.5);(15)
čia rn+1(0.5)=ec(n+1)!12n+1,0<c<12.
Kadangi ec<e12<2 (nes 3<1.8), tai rn+1(0.5)<e12(n+1)!12n+1<2(n+1)!12n+1=1(n+1)!12n.
Mums reikia, kad
1(n+1)!12n<106.
Ši nelygybė jau teisinga, kai n=7, nes tuomet
1(7+1)!127=18!27=1403201281.9376240079365107<106.
Taigi
e1+12+1222!+1233!+1244!+1255!+1266!+1277!
= 1 + 1/2 + 1/8 + 1/48 + 1/384 + 1/3840 + 1/46080 + 1/645120 =
(galima įdėt šitą eilutę nuo "1" iki "1/645120" į kalkuliatorių ir paspaust "=" ir tada bus iškart apskaičiuota šitos eilutės reikšmė)
=1.6487211681547619047619047619048=
1.648721.
Tiksli e reikšmė yra tokia:
1.6487212707001281468486507878142.
Atėmę netikslią (gautą) e reikšmę iš tikslios e reikšmės, gauname paklaidą:
1.6487212707001281468486507878142 - 1.6487211681547619047619047619048 = 1.0254536624208674602590940166689e-7 =
1.02545366107.


  • Apskaičiuosime e5=e15=e0.2 su paklaida mažesne nei 1010.
Įrašę į (10) formulę vietoje x skaičių 15, gauname
e5=e15=1+15+(15)22!+(15)33!+(15)44!+...+(15)nn!+rn+1(0.2);
čia rn+1(0.2)=ec(n+1)!15n+1,0<c<15.
Kadangi ec<e15<1.3 (nes 30.2<1.3), tai rn+1(0.2)<e15(n+1)!15n+1<1.3(n+1)!15n+1=1.3(n+1)!5n+1.
Mums reikia, kad
1.3(n+1)!5n+1<1010.
Ši nelygybė jau teisinga, kai n=7, nes tuomet
1.3(7+1)!157+1=1.38!58=1.340320390625=1.3157500000008.2539682539681011<1010.
Taigi
e1/51+15+1522!+1533!+1544!+1555!+1566!+1577!=
= 1 + 1/5 + 1/50 + 1/750 + 1/15000 + 1/375000 + 1/11250000 + 1/393750000 =
(galima nukopijuot šitą eilutę nuo "1" iki "1/393750000" ir padaryt "Paste" į "Windows" kalkuliatorių ir paspaust "=" ir tada bus iškart apskaičiuota šitos eilutės reikšmė)
=1.2214027580952380952380952380952=
1.2214027581.
Tiksli e5=e0.2 reikšmė yra tokia:
1.2214027581601698339210719946397.
Atėmę netikslią (gautą) e5 reikšmę iš tikslios e5 reikšmės, gauname paklaidą:
1.2214027581601698339210719946397 - 1.2214027580952380952380952380952 = 0.0000000000649317386829767565445 =
6.493173868297675654451011.
Pastebėsime, kad 18!58=1157500000006.34920634921011 jau būtų neteisingas paklaidos įvertinimas, nes 6.34920634921011<6.493173868297675654451011.


  • Apskaičiuosime e=e1 su paklaida mažesne nei 0.0001=104.
Įrašę į (10) formulę vietoje x skaičių 1 gauname
e1=1+1+122!+133!+144!+...+1nn!+rn+1(1);
čia rn+1(1)=ec(n+1)!1n+1,0<c<1.
Kadangi ec<e1<3, tai rn+1(1)<e1(n+1)!1n+1<3(n+1)!.
Mums reikia, kad
3(n+1)!<104.
Ši nelygybė jau teisinga, kai n=7, nes tuomet
3(7+1)!=38!=3403207.44047619105<104.
Taigi
e11+1+12!+13!+14!+15!+16!+17!=
= 1 + 1 + 1/2 + 1/6 + 1/24 + 1/120 + 1/720 + 1/5040 =
(galima nukopijuot šitą eilutę nuo "1" iki "1/5040" ir padaryt "Paste" į "Windows" kalkuliatorių ir paspaust "=" ir tada bus iškart apskaičiuota šitos eilutės reikšmė)
=2.718253968253968253968253968254=
2.7183.
Atėmę netikslią (gautą) e reikšmę iš tikslios e reikšmės, gauname paklaidą:
2.7182818284590452353602874713527 - 2.718253968253968253968253968254 = 2.7860205076981392033503098694244e-5 =
2.786020507698105.
Pastebėsime, kad 18!=1403202.48015873015873105.


Parodysime kaip ištraukti bet kokio laipsnio šaknį iš bet kokio skaičiaus a. Kadangi ay=elnay=eylna, tai, pavyzdžiui,
315=eln31/5=e15ln3=ex;
x=15ln30.21.0986122886681=
=0.21972245773362193827904904738451.
Tada ex=e0.21972245773362= 1.2457309396155173259666803366403.
O iš kalkuliatoriaus 30.2= 1.2457309396155173259666803366403.
Kai skaičius x didesnis tai Makloreno eilutė, skaičiuojant tokiu budu, darosi ilgesnė. Tai yra, jeigu, pavyzdžiui, a=300, o y=1/5, tai
30015=ay=elnay=e15ln300=ex;
x=15ln3000.25.7037824746562= 1.1407564949312402118862456292583.
Tada ex=e1.14075649493124= 3.1291346445318980387324449897269.
O iš kalkuliatoriaus 3000.2= 3.1291346445318980387324449897269.
Kai skaičius a iš kurio traukiame šaknį yra labai didelis, o y nėra labai mažas, tai tokiu budu skaičiuojant Makloreno eilutė gaunasi labai ilga, jei reikia didelio tikslumo. Pavyzdžiui, kai a=50000, o y=1/3, tai
5000013=ay=eylna=e13ln50000=ex;
x=13ln5000010.81977828441/3= 3.6065927614700943702242417173212.
Tada ex=e3.60659276147= 36.840314986403866057798228335798.
O iš kalkuliatoriaus 500001/3= 36.840314986403866057798228335798.


Parodysime kaip greitai ištraukti bet kokio laipsnio šaknį iš bet kokio didelio skaičiaus a. Kaip žinome, ay=elnay=eylna. Tarkime reikia ištraukti kūbinę šaknį iš skaičiaus a=50000. Tada galime užrašyti
5000013=ay=eylna=e13ln50000=ex;(10.1)
x=13ln50000=13ln(5104)=13(ln5+ln104)=13(ln5+4ln10).
Įstatome gautą x reikšmę į (10.1) eilutę:
5000013=ex=e13(ln5+4ln10)=e13ln5e43ln10=(eln5)1/3(eln10)4/3=51/3104/3.
Matome, kad visgi šituo budu negalima pagreitinti Makloreno eilutės skaičiavimų. Pastebėsime tik, kad
13ln51.6094379124341/3= 0.53647930414470012486691977774206,
43ln1042.302585092994/3= 3.0701134573253942453573219395792.
Bet 43ln10 galima užrašyti taip:
43ln10=43(ln1.25+ln2+ln2+ln2).
Ir tada e43ln10=e43ln1.25(e43ln2)3=(e13ln1.25)4(e13ln2)12.
Mums tereikia apskaičiuoti x1=13ln1.25, paskui ex1 ir gautą atsakymą (ex1) pakelti 4 laipsniu. Ir tereikia apskaičiuoti x2=13ln2, paskui apskaičiuoti ex2 ir gautą atsakymą (ex2) pakelti 12 laipsniu. Taip Makloreno eilutės (ex1 ir ex2) labai sutrumpės.
Grįžkime, be didesnių išsidirbinėjimų, prie (10.1) eilutės. Tada
x=13ln50000=13ln(5104)=13(ln5+ln104)=13(ln5+4ln10);
5000013=ex=e13(ln5+4ln10)=e13ln5e43ln10=e13ln5(e13ln10)4.
Toliau mums reikia apskaičiuoti
x1=13ln51.6094379124341/3= 0.53647930414470012486691977774206,
x2=13ln102.302585092994/3= 0.76752836433134856133933048489479.
Dar toliau reikia apskaičiuoti ex1 ir ex2 (su x1 ir x2 Makloreno eilutės gaunasi trumpos ir su dideliu tikslumu):
ex1=e0.5364793041447= 1.7099759466766969893531088725439,
ex2=e0.76752836433= 2.1544346900318837217592935665194.
Gautą ex2 reikšmę reikia pakelti ketvirtu laipsniu,
p=(ex2)4=2.154434694= 21.544346900318837217592935665194.
Taigi,
5000013=ex=ex1p= 1.7099759466766969893531088725439 * 21.544346900318837217592935665194 =
=36.8403149864038660577982283358.
Iš "Windows" kalkuliatoriaus 5000013= 36.840314986403866057798228335798.
Taigi, suradome būdą kaip labai pagreitinti šaknies traukimą iš labai didelių skaičių.


Pateiksime dar vieną pavyzdį kaip greitai ištrauktį šaknį iš didelio skaičiaus. Tarkime, reikia ištraukti penkto laipsnio šaknį iš skaičiaus a=7358000. Kaip žinome, ay=elnay=eylna.
735800015=ay=eylna=e15ln7358000=ex;(10.2)
x=15ln7358000=15ln(7.358106)=15(ln7.358+ln106)=15(ln7.358+6ln10);
735800015=ex=e15(ln7.358+6ln10)=e15ln7.358e65ln10=e15ln7.358(e15ln10)6.
Toliau mums reikia apskaičiuoti
x1=15ln7.3581.99578815668/5= 0.39915763133651652361254646915311,
x2=15ln102.302585092994/5= 0.46051701859880913680359829093687.
Dar toliau reikia apskaičiuoti ex1 ir ex2 (su x1 ir x2 Makloreno eilutės gaunasi trumpos ir su dideliu tikslumu):
ex1=e0.3991576313365= 1.4905685604041673920504265746024,
ex2=e0.4605170185988= 1.5848931924611134852021013733915.
Gautą ex2 reikšmę reikia pakelti 6-tu laipsniu,
p=(ex2)6=1.584893192466= 15.848931924611134852021013733915.
Taigi,
73580001/5=ex=ex1p= 1.4905685604041673920504265746024 * 15.848931924611134852021013733915 =
=23.623919642811269319097605866468.
Iš "Windows" kalkuliatoriaus 73580000.2= 23.623919642811269319097605866468.
Atsakymai sutampa.


Pastebėsime, kad jeigu, pavyzdžiui, reikia apskaičiuoti 73580001234.567, tai tokį reiškinį galima užrašyti taip:
73580001234.567=735800012345671000=73580001234567/1000=(73580001/1000)1234567.
Tada toliau tereikia apskaičiuoti 73580001/1000 ir gautą rezultatą pakelti 1234567 laipsniu.
Dar 73580001234.567 galima užrašyti taip:
73580001234.567=73580000.123456710000=(73580000.1234567)10000.
Tada tereikia apskaičiuoti 73580000.1234567 ir gautą rezultatą pakelti 10000 laipsniu.
Dar pastebėsime, kad jeigu skaičiuosime 73580000.9876, tai reikės skaičiuoti ex1 ir ex2 su tokiais x1 ir x2:
x1=0.9876ln7.3580.98761.99578815668= 1.9710403835397185935987544646781,
x2=0.9876ln100.98762.302585092994= 2.2740330378409195175361683606463.
Su tokiom x1 ir x2 reikšmėm ex1 ir ex2 Makloreno eilutės gausis ilgos. Kad jas labai patrumpinti, galima 73580000.9876 užrašyti taip:
73580000.9876=(73580000.09876)10.
Toliau 73580000.09876 galima apskaičiuoti aukščiau aprašytu budu (ay=eylna). Tada
x1=0.09876ln7.3580.098760.199578815668= 0.19710403835397185935987544646781,
x2=0.09876ln100.098760.2302585092994= 0.22740330378409195175361683606463.
Su tokiom x1 ir x2 reikšmėm ex1 ir ex2 Makloreno eilutės gausis daug trumpesnės. Toliau tereikės ex2 pakelti 6 laipsniu, p=(ex2)6, paskui sudauginti ex1 su p ir rezultatą pakelti 10 laipsniu. Ir tada gausime:
73580000.9876=(ex1p)10= 6048002.5023225950089917200618921.


Parodysime dar gudresnį būdą apskaičiuoti ay, kai a yra labai didelis skaičius. "Windows 10" kalkuliatoriaus didžiausias įmanomas skaičius yra 9.9999999999999999999999999999999e+9999 (tai reiškia 9.999999...109999). Čia yra 32 devynetai prieš "e+9999", bet kai kurie skaitmenys nesimato, nes skaičiuojant pasitaikydavo, kad atėmus iš tikslios reikšmės, mažiau tikslią gaudavosi vis tiek 32 skaitmenys. Kaip suprantu, Extended Precision (80 bit) turi irgi 9.999999...109999 didžiausią įmanoma skaičių, tik su mažiau skaitmenų po kablelio. Nors gali būti, kad truputi mažiau nei 10 pakelta rodikliu 9999, gal 10 peklta 4932, kaip rašo Vikipedijoj:
"The 80-bit floating-point format has a range (including subnormals) from approximately 3.65×10−4951 to 1.18×104932. Although log10(264) ≅ 19.266, this format is usually described as giving approximately eighteen significant digits of precision (the floor of log10(263), the minimum guaranteed precision)."
Taigi, Extended Precision (80 bit) turi apie 18 ar 19 skaitmenų (log10(263) = log10(9,223,372,036,854,775,808) = 18.96488972683) ir apie 4 skaitmenis eksponentės. Tuo tarpu Double Precision (64 bit) turi apie 3 eksponentės skaitmenis (t. y. 999): "Exponents range from −1022 to +1023 because exponents of −1023 (all 0s) and +1024 (all 1s) are reserved for special numbers."
Taigi, iš kalkuliatoriaus
ln(9.9999999999999999999999999999999e+9999) = 23025.850929940456840179914546844.
Ne toks jau didelis skaičius. Tarkim, norime apskaičiuoti (9.99109999)0.9876=ay;y=0.9876. Tada
(9.99109999)0.9876=ay=eylna=ex;
x=ylna=0.9876ln(9.99109999)=0.9876(ln(9.99)+9999ln10);
x1=0.9876ln(9.99)= 2.2730449437114724198514271513722,
x2=0.98769999ln10= 22738.056345371354255844147438102.
Toliau darome taip. Padauginame x0.00001=105 (galima padauginti ir iš, pavyzdžiui, 107 kad dar labiau sutrumpinti Makloreno eilutės skaičiavimą) ir tada gauname
x0=x105=(x1+x2)105= 0.22740329390315065728263998865254;
x01=x11052.2730449437105= 2.2730449437114724198514271513722e-5,
x02=x210522738.05634537105= 0.22738056345371354255844147438102.
Toliau, pagal Makloreno eilutę, apskaičiuojame
ex01=e0.000022730449437= 1.0000227307077757379114427014178,
ex02=e0.2273805634537= 1.2553075012077639197733369606026.
Ir galiausiai ex0=ex1+x2=ex1ex2 pakeliame 105=100000-tuoju laipsniu (arba pakeliame 10000000-tuoju laipsniu, jei x dauginome iš 107). Tada
(9.99109999)0.9876=(ex0)100000=(ex01ex02)100000=
=(1.00002273071.2553075012)100000= (1.0000227307077757379114427014178 * 1.2553075012077639197733369606026)^100000 =
= 9.990123938748126108971250386732e+9875.
Kalkuliatoriaus reikšmė yra tokia (9.99109999)0.9876=
= 9.9901239387481261089712504055752e+9875 =
9.990123938748109875.
Iš tikro, galima buvo padaryt greičiau (tiesiog truputi susipainiojęs buvau (kėliau 5 laipsniu, o ne 105, todėl nesigaudinėjo...)). Štai kaip.
x=ylna=0.9876ln(9.99109999)= 22740.329390315065728263998865254;
x0=x105= 0.22740329390315065728263998865254.
Toliau, pagal Makloreno eilutę, apskaičiuojame
ex0=e0.227403293= 1.2553360352357425652203277670022.
Ir toliau tiesiog ex0 pakeliam 105 laipsniu:
(9.99109999)0.9876=(ex0)100000=(e0.22740329390315)100000=1.25533603523574100000=
= 1.2553360352357425652203277670022^100000 =
= 9.9901239387481261089712504105024e+9875.


Bet kokio skaičiaus pakelimas bet kokiu laipsniu (universalus algoritmas)
Jei pakelsime 2 kvadratu, tai gausime 22=4. Jei toliau 4 pakelsim kvadratu, gausime (22)2=222=42=16. Jeigu dar toliau pakelsim 16 kvadratu, tai gausime 2222=162=256. Jei dar toliau pakelsime 256 kvadratu, tai gausime 216=22222=2562=65536.
Kad gauti skaičių 65536, reikia ant "Windows 10" kalkuliatoriaus paspasuti 2, o paskui 4 kartus paspausti mygtuką x2.
Parodysime kaip galima pakelti bet kokį skaičių bet kokiu laipsniu, naudojant tuos pačius veiksmus (nauduojant tą patį algoritmą). Bet šitas algoritmas labiau akcentuotas į pakelimą y laipsniu, skaičių a, kuris yra didesnis už 1.
Tarkim, norime apskaičiuoti (9.99109999)0.9876=ay;y=0.9876. Tada
(9.99109999)0.9876=ay=eylna=ex;
x=ylna=0.9876ln(9.99109999)= 22740.329390315065728263998865254.
Žinome, kad ex=(ex/65536)65536=(e0.0000152587890625x)65536.
Tada pažymėkime
x0=0.0000152587890625x= 0.0000152587890625 * 22740.329390315065728263998865254 =
= 0.34698988937858681836340330299764.
Toliau apskaičiuojame Makloreno eilutę ex0, kuri nėra ilga, nes x0<1. Taigi
ex0=e0.3469898893785868= 1.414802420766463739969945373195.
Toliau ex0 reikia pakelti 65536 laipsniu. Tačiau 65536=216. Tiksliai negaliu pasakyt kodėl, bet ex0 reikia pakelti kvadratu 16 kartų (tai galima padaryti pasapaudus mygtuką x2 ant kalkuliatoriaus 16 kartų). Tada gausime
(9.99109999)0.9876=ay=eylna=ex=(ex0)65536=(ex0)216=1.4148024265536=
= 1.414802420766463739969945373195^65536 = 9.9901239387481261089712504055752e+9875.
Atėmę gautą ay reikšmę iš tikslios "Windows 10" kalkuliatoriaus reikšmės, gauname:
9.9901239387481261089712504055752e+9875 - 9.9901239387481261089712504055752e+9875 =
= 3.8064298062079638161811295770571e+9833.
Kaip sakyta anksčiau, "Windows 10" kalkuliatoriaus tikslumas yra daugiau nei 32 skaitmenys (tie skaitmenys nerodomi). Apytiksli paklaida yra 1.0e+9875 / 1.0e+9833 = 1.e+42, t. y. apie 1042. Todėl "Windows 10" kalkuliatorius turi mažiausiai apie 42 skaitmenų tikslumą (kai skaičiavau, dėjau reikšmes į kalkuliatoriaus atmintį, paspaudus "M+" įrašymui ir "MR" skaitymui iš atminties). Pasitaikydavo atrodo ir apie 1046 paklaida, atėmus mažiau tikslią reikšmę iš tikslios reikšmės su "Windows 10" kalkuliatorium.


  • Kitas pavyzdys. Apskaičiuosime ay=35000 naudojant universalų, ką tik pateiktą algoritmą. Kalkuliatoriaus šito skaičiaus reikšmė yra tokia:
ay=35000= 4.0389976297871553397008634098151e+2385 =
4.0389976297871553397102385.
35000=ay=eylna=ex;
x=ylna=5000ln3=50001.0986122886681= 5493.0614433405484569762261846126.
x0=x/65536=0.0000152587890625x=0.00001525878906255493.06144334=
= 0.08381746587128522425806009192829.
Toliau apskaičiuojama Makloreno eilutė ex0, kuri yra trumpa, bet bendrumo dėlei galima skaičiuoti tokio pat ilgio eilutę kaip praeitame pavyzdyje (kad nekeisti algoritmo kiekvienam skaičiui). Taigi
ex0=e0.08381746587= 1.0874303825344221813244859411118.
Toliau ex0 reikia pakelti 65536 laipsniu. Tai padarysime 16 kartų pakėlę kvadratu skaičių 1.0874303825344221813244859411118 (skaičių ex0). Tada gauname:
35000=ay=eylna=ex=(ex0)65536=(ex0)216=1.087430382534465536=
= 4.0389976297871553397008634098151e+2385.
Atėmę gautą 35000 reikšmę iš tikslios 35000 "Windows 10" kalkuliatoriaus reikšmės, gauname paklaidą:
8.4648638092084170075729647383904e+2342.
Vadinasi apytiksliai 2385-2342=43 pirmi skaitmenys yra teisingi.


  • Apskaičiuosime 73580001234.567 šituo universaliu algoritmu. Kalkuliatoriaus šito skaičiaus reikšmė yra tokia:
73580001234.567= 2.9855588086470807664732431219819e+8477 =
2.985558808647108477.
73580001234.567=ay=eylna=ex;
x=ylna=1234.567ln7358000=1234.56715.8112987146468567= 19520.107620245425962920091221327.
x0=x/65536=0.0000152587890625x=0.000015258789062519520.1076202454=
= 0.29785320465462380924865861848948.
Toliau apskaičiuojama Makloreno eilutė ex0, kuri suprantama nėra ilga. Gautume:
ex0=e0.2978532046546= 1.3469640453138238767100251046857.
Toliau ex0 reikia pakelti 65536 laipsniu. Tai padarysime 16 kartų pakėlę kvadratu skaičių ex0:
73580001234.567=ay=eylna=ex=(ex0)65536=(ex0)216=1.3469640453138238767165536=
= 2.9855588086470807664732431219819e+8477.
Toks pat atsakymas kaip iš kalkuliatoriaus. Atėmę gautą reikšmę, apskaičiuotą šiuo universaliu algoritmu, iš tikslios 73580001234.567 reikšmės, gauname paklaidą:
9.764728067703454777066384239029e+8434.
Paklaida yra 8477-8434=43 tokia, kad apytiksliai 43 pirmi skaitmenys yra teisingi.


Pasirodo galima naudoti ne tik skaičių 216=65536 ar jo kvadratą, bet ir, pavyzdžiui, skaičių 217=131072. Apskaičiuosime 0.38000 taikydami Makloreno eilutę ir greitą universalų algoritmą. Iš kalkuliatoriaus:
0.38000= 9.3333544088834579475132722410259e-4184 =
9.3333544088834579475104184.
Pradedame skaičiavimus.
0.38000=ay=eylna=e8000ln0.3=ex;
x=ylna=8000ln0.3=8000(1.2039728043)= -9631.7824346074879409819697420947.
x0=x/131072=0.00000762939453125x=0.00000762939453125(9631.7824346)=
= -0.07348466823278417923722816270519.
Toliau apskaičiuojama Makloreno eilutė ex0, kuri nėra ilga (nebūtina skaičiuoti su tokia neigiama x0 reikšme; galima apskaičiuoti e|x0|, o paskui gautą rezultatą pakelti -1 laipsniu, bet su x0 turėtų net truputi greičiaus skaičiuotis Makloreno eilutė nei su |x0|). Apskaičiavus Makloreno eilute gautume:
ex0=e0.073484668232784= 0.92915039119982175027449213911686.
Toliau ex0 reikia pakelti 217=131072 laipsniu. Tai padarysime 17 kartų pakėlę kvadratu skaičių ex0 (ant kalkuliatoriaus reikia 17 kartų paspausti mygtuką x2):
0.38000=ay=eylna=ex=(ex0)131072=(ex0)217=0.92915039119982175131072=
= 9.3333544088834579475132722410259e-4184.
Toks pat atsakymas kaip iš kalkuliatoriaus. Atėmę gautą reikšmę, apskaičiuotą šiuo universaliu algoritmu, iš tikslios 0.38000 reikšmės, gauname paklaidą (Windows 10 kalkuliatorius turi daugiau skaitmenų tikslumą nei rodo):
-3.1898963077025813192937851493148e-4226.
Paklaida yra 4184-4226=-42 tokia, kad apytiksliai 42 pirmi skaitmenys yra teisingi.


Toks Free Pascal kodas apskaičiuoja 0.3100:
var a:longint; c:real;
begin
c:=1;
for a:=1 to 100 do
c:=c*0.3;
writeln(c);
Readln;
End.
ir [akimirksniu] duodą rezultatą "5.1537752073201157E-053" (tai reiškia 5.15377520732011571053).
Iš "Windows 10" kalkuliatoriaus: 5.1537752073201133103646112976562e-53 (tai reiškia 0.31005.153775207320113311053). Gavome 15 pirmų teisingų skaitmenų, kas atitinka Double Precision (64 bit) garantuotą tikslumą.
O toks Free Pascal kodas apskaičiuoja 0.3600:
var a:longint; c:real;
begin
c:=1;
for a:=1 to 600 do
c:=c*0.3;
writeln(c);
Readln;
End.
ir [akimirksniu] duodą rezultatą "1.8739277038784846E-314" (tai reiškia 1.873927703878484610314).
Iš "Windows 10" kalkuliatoriaus: 1.8739277038847939886754019920358e-314 (tai reiškia 0.36001.8739277038847910314). Gavome tik 11 pirmų teisingų skaitmenų, nors kodas skaičiavo su Double Precision (64 bit) tikslumu, kuris duoda nuo 15 iki 17 skaitmenų tikslumą.
Tačiau, jei panaudosime eilutę "for a:=1 to 585 do" vietoje "for a:=1 to 600 do", tai gausime "1.3059724367053167E-306". Kalkuliatoriaus reikšmė yra tokia 0.35851.3059724367053142017544610306. Gavome 15 pirmų teisingų skaitmenų su FP kodu.
Jei šis FP kodas pasiliks toks pat tik bus pakeista eilutė "for a:=1 to 600 do" į eilutę "for a:=1 to 610 do", tai gaunamas FP kodo atsakymas yra "1.1065094204260558E-319". Tiksli kalkuliatoriaus reikšmė yra: 0.3610= 1.1065355698669320023729381222772e-319. Su Free Pascal kodu gavome tik 5 pirmus teisingus skaitmenis.
O jeigu panaudosime tokią FP kodo eilutę "for a:=1 to 620 do", tai FP duos tokį atsakymą: "0.0000000000000000E+000". Tuo tarpu kalkuliatoriaus reikšmė yra tokia: 0.3620= 6.5339818865072467808119623182348e-325.
Panašu, kad skaičiuojant su Free Pascal, atliekant daug daugybos veiksmų tikslumas pradeda mažėt.
Iš kitos pusės, toks Free Pascal kodas (kuris skaičiuoja 3646):
var a:longint; c:real;
begin
c:=1;
for a:=1 to 646 do
c:=c*3;
writeln(c);
Readln;
End.
duoda akimirksniu atsakymą "1.6608505280233451E+308". Kalkuliatoriaus atsakymas: 3646= 1.6608505280233424907169817301232e+308. Su FP gavome 15 pirmų teisingu skaitmenų.
Bet jeigu įrašysime "for a:=1 to 647 do" vietoje "for a:=1 to 646 do", tai jau Free Pascal kodas neskaičiuoja ir duoda klaidą "exited with exitcode = 205".
Toks Free Pascal kodas (kuris skaičiuoja 10308):
var a:longint; c:real;
begin
c:=1;
for a:=1 to 308 do
c:=c*10;
writeln(c);
Readln;
End.
duoda akimirksniu atsakymą "9.9999999999999981E+307". Ir panašu, kad 10308 yra maksimalus skaičius, kurį supranta "Free Pascal", nes su kodo eilute "for a:=1 to 309 do" šitas kodas duoda klaidą "exited with exitcode = 205".


Pasirodo, kad apytiksliai 10308 ir yra didžiausias skaičius Double Precision formate. Va čia https://www.ragestorm.net/downloads/387intel.txt
Skyrelyje "2.2.2.3 Real Numbers" pasukus truputi žemiau yra "Table 2-3. Summary of Format Parameters":
Parameter_________________ZDDDDDDDD Format DDDDDDDD?
__________________________Single_ _Double_ _Extended
Format width in bits__________32_______64_________80
p (bits of precision)_________24_______53_________64
Exponent width in bits_________8_______11_________15
Emax________________________+127____+1023_____+16383
Emin________________________-126____-1022_____-16382
Exponent bias_______________+127____+1023_____+16383
Taigi, Double Precision didžiausias skaičius yra 210238.9884656743115795310307= 8.9884656743115795386465259539451e+307 (dar turbūt reikia šitą skaičių padauginti iš 9.99999999999999 ar panašiai). (211=2048,210=1024).
Beje, Double Extended Precision 216383= 5.94865747678615882542879663314e+4931. (215=32768, 214=16384).
Be to, 21022= 2.2250738585072013830902327173324e-308. Todėl, tikriausiai, dėl to tikslumas ir prarandamas kai eksponentė yra mažiau nei -308 (pavyzdžiui, -314 ar -319), nes toks absoliučiu didžiu mažas skaičius net nepalaikomas Double Precision (64 bit) formate.

Nuorodos