Matematika/Teiloro eilutė

Teiloro eilutė išsamiai

keisti


Makloreno eilutės įrodymas

keisti
Darome prielaidą, kad funkciją   galima užrašyti tokia eilute
 
Tuomet surandame visų eilių (laipsnių) išvestines funkcijos  
 
 
 
 
 
Kad surasti kam lygūs koeficientai  , paimame gautų išvestinių reikšmes nuo nulio (kai  ):
 
 
 
 
 
 
Dabar nesunku rasti koeficientus  :
 
 
 
 
 
 
 
 
Dabar tereikia įstatyti gautus koeficientus   į eilutę
 
Taigi, gavome funkciją   išreikšta Makloreno eilute:
 

Pavyzdžiai

keisti
  • Išreikšti funkciją   Makloreno eilute.
Sprendimas.
 
 
 
 
 
Gauname, kad
 


  • Užrašyti funkcija   Makloreno eilute.
Sprendimas.
 
 
 
 
 
 
 
 
 

Teiloro formulė

keisti
Teiloro eilute užrašomos funkcijos pavidalas yra toks:
 
Čia liekamasis narys Lagranžo formoje yra   Ir  
Teiloro formulė, kurios   vadinama Makloreno formule. Remiantis (8) formule, galime parašyti tokią Makloreno formulės išraišką:
 
Šįkart  

Sinuso liekamojo nario įvertinimas

keisti
  • Apskaičiuosime sin(1) su paklaida mažesne nei  
Žinoma, kad
 
Tuomet
 
Čia k yra sveikasis skaičius. Todėl
 
čia  
Laikysime, kad cos(c)=1. Tada, tarus, kad x=1, turi būti tenkinama nelygybė
 
 
 
 
Paskutinė nelygybė tenkinama, kai   ir tada   Tuomet mums reikia paskaičiuoti Makloreno eilutę iki n=9:
 
 
=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=
 
 
Taigi, viskas apskaičiuota pagal teoriją ir paklaida surasta teisingai.
Pastebėsime, kad   todėl paklaida gauta
 


  • Apskaičiuosime sin(0.1) su paklaida mažesne nei  
Pasinaudoję pirmu pavyzdžiu, išeina, kad turi būti tenkinama nelygybė
 
kurioje laikysime, kad cos(c)=1, o   Tada
 
Pabandykime atspėti, kad sveikasis skaičius k galėtų būti lygus 2. Tada
 
 
 
 
 
 
Nesunku matyti, kad su skaičiumi k=2, paklaida bus mažesnė už   Belieka užrašyti sinuso Teiloro eilutę, kai x=0.1, o n=5:
 
 
= 0.09983341666666666666666666666667.
Windows kalkuliatoriaus   reikšmė yra tokia
sin(0.1) =
= 0.09983341664682815230681419841062.
0.09983341664682815230681419841062 - 0.09983341666666666666666666666667 =
= -1.9838514359852468256047973010085e-11 =
 
 
Vadinasi paklaidą radome teisingai.


  • Apskaičiuosime sin(1.5) su paklaida mažesne nei  
Pasinaudoję pirmu pavyzdžiu, išeina, kad turi būti tenkinama nelygybė
 
kurioje laikysime, kad   o   radiano. Ši nelygybė tenkinama, kai   nes
 
 
 
 
 
Taigi, matome, kad paklaida bus mažesnė už   Sinuso eilutė, kai   o   yra tokia:
 
 
= 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 =
 
Paklaidos didumas gautas pagal teoriją.


Kosinuso liekamojo nario įvertinimas

keisti
  • Apskaičiuosime cos(1) su paklaida mažesne nei  
  Žinoma, kad
 
Tuomet
 
Čia k yra sveikasis skaičius. Todėl
 
čia  
Tada
 
(nes |cos(c)| negali būti daugiau už 1),
 
Paskutinė nelygybė tenkinama, kai   nes (tada kai x=1)
 
 
 
 
Dabar galime užrašyti   (kosinusas nuo 1 radiano) Makloreno eilutę, kai n=2k=8:
 
 
= 0.54030257936507936507936507936508.
Atėmę gautą   reikšmę iš tikslios (kalkuliatoriaus)   reikšmės gausime:
cos(1) - 0.54030257936507936507936507936508 =
= 0.54030230586813971740093660744298 - 0.54030257936507936507936507936508 =
= -2.7349693964767842847192210276135e-7.
 
Vadinasi, liekamajį narį   apskaičiavome teisingai (kai x lygus 1 radianui).


  • Apskaičiuosime cos(0.1) su paklaida mažesne nei  
Pasinaudoję pirmu pavyzdžiu, turime
 
 
Paskutinė nelygybė tenkinama, kai   o   radiano, nes
 
 
 
 
Dabar galime užrašyti   Makloreno eilutę, kai n=2k=4:
 
= 0.9950041(6).
Tiksli   reikšmė yra
cos(0.1) = 0.99500416527802576609556198780387.
Atėmę apskaičiuotą   reikšmę iš tikslios   reikšmės gauname:
0.99500416527802576609556198780387 - 0.99500416666666666666666666666667 =
= -1.3886409005711046788627997051614e-9 =
 
Taigi
 
Ką ir reikėjo parodyti.


  • Apskaičiuosime cos(1.5) su paklaida mažesne nei  
Pasinaudoję pirmu pavyzdžiu, turime
 
 
 
Paskutinė nelygybė tenkinama, kai   nes
 
 
 
 
Dabar užrašysime   Makloreno eilutę, kai n=2k=12:
 
 
= 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   (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
 

Natūrinio logaritmo liekamojo nario įvertinimas

keisti
Natūrinio logaritmo reikšmės greitas skaičiavimas: https://en.wikipedia.org/wiki/Natural_logarithm#Efficient_computation
  •   Apskaičiuosime ln(1+0.5)=ln(1.5) su paklaida mažesne nei 0.0001, kai  
Randame išvestines:
 
 
Apskaičiuosime jų reikšmes taške  :
 
 
Vadinasi,
 
 
čia  
Matome, kad
 
Kai   o   gausime, kad   nes
 
ir 0.00009765625 < 0.0001. Apskaičiuosime kam lygi ši eilutė, kai   o  :
 
=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
 


  •   Apskaičiuosime ln(1+0.9)=ln(1.9) su paklaida mažesne nei 0.01, kai  
 
čia  
Matome, kad
 
Kai   o   gausime, kad   nes
 
ir 0.0060788327295284644005 < 0.01. Apskaičiuosime kam lygi ši eilutė, kai   o  :
 
 
= 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
 
Liekamojo nario įvertinimą gavome teisingai.


Pastebėsime, kad kai x reikšmė arti 1 arba lygi 1, tai   eilutė gaunasi labai ilga ir atsakymas labai netikslus. Vienas būdas atsakymo skaičiavimą pagreitinti yra užrašymas
 
arba, pavyzdžiui, kai x=0.99, gautume
 
ir galime apskaičiuoti   su   arba   Tada Makloreno eilutės skaičiavimai gerokai sutrumpėja, bet vistiek gana ilgi.
  galima apskaičiuoti taip:
 
O   galima apskaičiuoti taip:
 
Daug kartų traukiant šaknį kaip ką tik darėme su ln(2) galima gana greitai apskaičiuoti   su bet kokia x reikšme nuo -1 iki 1 ( ).
Pavyzdžiui, ištraukus 4 kartus kvadratinę šaknį iš 2 gausime
 
Jei užrašysime   eilutę su   ir   tai
 
 
Gavome   su paklaida mažesne nei   (gali būti, kad padauginus ln(1.04427378242741384) iš 16 paklaida pasidarys truputi didesnė, gal šiuo atveju pasidarys apie   ar  ).
Pastebėsime, kad pavyzdžiui ln(0.00003) galima apskaičiuoti taip:
 


  • Apskaičiuosime ln(0.3) su paklaida mažesne nei 0.01. Pasinaudosime pirmu pavyzdžiu.
Vadinasi,
 
 
čia   Nes  
Turime
 
Kai   o   gausime:
 
 
=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:
 
Tada
 
Turime
 
Kai   o   gausime:
 
 
=3.6120376523498566762096049279603e-24=
 
 
 
 
 
[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  ). Ir
 
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ž
 
Bet
 
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:
 
Tai yra, x=-0.12886183097395441374956757206472.
Tada
 
Turime
 
Kai   o   gausime:
 
= 1.2580998343623026293204200398239e-18 =
 
 
 
 
 
[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
 
Paklaidos įvertinimas gavosi pagal teoriją. Apskaičiavome ln(0.11) su paklaida mažesne nei   (nors paklaida mažesnė nei   bet to nuspėti negalėjome).
Pastebėsime, kad   Tai yra,   Gaunasi truputi neteisingas paklaidos ivertinimas, jei čia
 
vietoje c=-0.12886183, parinkti c=0.


Pastebėsime, kad ln(0.11) galima užrašyti ir apskaičiuoti taip:
 
O ln(0.3) galima užrašyti ir apskaičiuoti taip:
 


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  
Ž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,   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ą   reikšmę iš tikslios   reikšmės, gauname paklaidą:
1.4142135623730950488016887242097 - 1.4142135623746899106262955788901 = -1.5948618246068546804368315468877e-12 =
 
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:
 
[   ]
Matome, kad tokiu budu ln(0.9)=ln(1-0.1) galima labai greitai apskaičiuoti.

e pakelta x liekamojo nario įvertinimas

keisti
  • Apskaičiuosime   su paklaida mažesne nei  
  Kadangi   su visais n, priklausantiems natūraliesiems skaičiams, tai
 
čia  
Įrašę į (10) formulę vietoje x skaičių   gauname
 
čia  
Kadangi   (nes  ), tai  
Mums reikia, kad
 
Ši nelygybė jau teisinga, kai   nes tuomet
 
Taigi
 
= 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=
 
Tiksli   reikšmė yra tokia:
1.6487212707001281468486507878142.
Atėmę netikslią (gautą)   reikšmę iš tikslios   reikšmės, gauname paklaidą:
1.6487212707001281468486507878142 - 1.6487211681547619047619047619048 = 1.0254536624208674602590940166689e-7 =
 


  • Apskaičiuosime   su paklaida mažesne nei  
Įrašę į (10) formulę vietoje x skaičių   gauname
 
čia  
Kadangi   (nes  ), tai  
Mums reikia, kad
 
Ši nelygybė jau teisinga, kai   nes tuomet
 
Taigi
 
= 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=
 
Tiksli   reikšmė yra tokia:
1.2214027581601698339210719946397.
Atėmę netikslią (gautą)   reikšmę iš tikslios   reikšmės, gauname paklaidą:
1.2214027581601698339210719946397 - 1.2214027580952380952380952380952 = 0.0000000000649317386829767565445 =
 
Pastebėsime, kad   jau būtų neteisingas paklaidos įvertinimas, nes  


  • Apskaičiuosime   su paklaida mažesne nei  
Įrašę į (10) formulę vietoje x skaičių   gauname
 
čia  
Kadangi   tai  
Mums reikia, kad
 
Ši nelygybė jau teisinga, kai   nes tuomet
 
Taigi
 
= 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=
 
Atėmę netikslią (gautą) e reikšmę iš tikslios e reikšmės, gauname paklaidą:
2.7182818284590452353602874713527 - 2.718253968253968253968253968254 = 2.7860205076981392033503098694244e-5 =
 
Pastebėsime, kad  


Parodysime kaip ištraukti bet kokio laipsnio šaknį iš bet kokio skaičiaus a. Kadangi   tai, pavyzdžiui,
 
 
=0.21972245773362193827904904738451.
Tada   1.2457309396155173259666803366403.
O iš kalkuliatoriaus   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
 
  1.1407564949312402118862456292583.
Tada   3.1291346445318980387324449897269.
O iš kalkuliatoriaus   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
 
  3.6065927614700943702242417173212.
Tada   36.840314986403866057798228335798.
O iš kalkuliatoriaus   36.840314986403866057798228335798.


Parodysime kaip greitai ištraukti bet kokio laipsnio šaknį iš bet kokio didelio skaičiaus a. Kaip žinome,   Tarkime reikia ištraukti kūbinę šaknį iš skaičiaus a=50000. Tada galime užrašyti
 
 
Įstatome gautą x reikšmę į (10.1) eilutę:
 
Matome, kad visgi šituo budu negalima pagreitinti Makloreno eilutės skaičiavimų. Pastebėsime tik, kad
  0.53647930414470012486691977774206,
  3.0701134573253942453573219395792.
Bet   galima užrašyti taip:
 
Ir tada  
Mums tereikia apskaičiuoti   paskui   ir gautą atsakymą ( ) pakelti 4 laipsniu. Ir tereikia apskaičiuoti   paskui apskaičiuoti   ir gautą atsakymą ( ) pakelti 12 laipsniu. Taip Makloreno eilutės (  ir  ) labai sutrumpės.
Grįžkime, be didesnių išsidirbinėjimų, prie (10.1) eilutės. Tada
 
 
Toliau mums reikia apskaičiuoti
  0.53647930414470012486691977774206,
  0.76752836433134856133933048489479.
Dar toliau reikia apskaičiuoti   ir   (su   ir   Makloreno eilutės gaunasi trumpos ir su dideliu tikslumu):
  1.7099759466766969893531088725439,
  2.1544346900318837217592935665194.
Gautą   reikšmę reikia pakelti ketvirtu laipsniu,
  21.544346900318837217592935665194.
Taigi,
  1.7099759466766969893531088725439 * 21.544346900318837217592935665194 =
=36.8403149864038660577982283358.
Iš "Windows" kalkuliatoriaus   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,  
 
 
 
Toliau mums reikia apskaičiuoti
  0.39915763133651652361254646915311,
  0.46051701859880913680359829093687.
Dar toliau reikia apskaičiuoti   ir   (su   ir   Makloreno eilutės gaunasi trumpos ir su dideliu tikslumu):
  1.4905685604041673920504265746024,
  1.5848931924611134852021013733915.
Gautą   reikšmę reikia pakelti 6-tu laipsniu,
  15.848931924611134852021013733915.
Taigi,
  1.4905685604041673920504265746024 * 15.848931924611134852021013733915 =
=23.623919642811269319097605866468.
Iš "Windows" kalkuliatoriaus   23.623919642811269319097605866468.
Atsakymai sutampa.


Pastebėsime, kad jeigu, pavyzdžiui, reikia apskaičiuoti   tai tokį reiškinį galima užrašyti taip:
 
Tada toliau tereikia apskaičiuoti   ir gautą rezultatą pakelti 1234567 laipsniu.
Dar   galima užrašyti taip:
 
Tada tereikia apskaičiuoti   ir gautą rezultatą pakelti 10000 laipsniu.
Dar pastebėsime, kad jeigu skaičiuosime   tai reikės skaičiuoti   ir   su tokiais   ir  :
  1.9710403835397185935987544646781,
  2.2740330378409195175361683606463.
Su tokiom   ir   reikšmėm   ir   Makloreno eilutės gausis ilgos. Kad jas labai patrumpinti, galima   užrašyti taip:
 
Toliau   galima apskaičiuoti aukščiau aprašytu budu ( ). Tada
  0.19710403835397185935987544646781,
  0.22740330378409195175361683606463.
Su tokiom   ir   reikšmėm   ir   Makloreno eilutės gausis daug trumpesnės. Toliau tereikės   pakelti 6 laipsniu,   paskui sudauginti   su p ir rezultatą pakelti 10 laipsniu. Ir tada gausime:
  6048002.5023225950089917200618921.


Parodysime dar gudresnį būdą apskaičiuoti   kai a yra labai didelis skaičius. "Windows 10" kalkuliatoriaus didžiausias įmanomas skaičius yra 9.9999999999999999999999999999999e+9999 (tai reiškia  ). Č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   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   Tada
 
 
  2.2730449437114724198514271513722,
  22738.056345371354255844147438102.
Toliau darome taip. Padauginame x  (galima padauginti ir iš, pavyzdžiui,   kad dar labiau sutrumpinti Makloreno eilutės skaičiavimą) ir tada gauname
  0.22740329390315065728263998865254;
  2.2730449437114724198514271513722e-5,
  0.22738056345371354255844147438102.
Toliau, pagal Makloreno eilutę, apskaičiuojame
  1.0000227307077757379114427014178,
  1.2553075012077639197733369606026.
Ir galiausiai   pakeliame  -tuoju laipsniu (arba pakeliame 10000000-tuoju laipsniu, jei x dauginome iš  ). Tada
 
  (1.0000227307077757379114427014178 * 1.2553075012077639197733369606026)^100000 =
= 9.990123938748126108971250386732e+9875.
Kalkuliatoriaus reikšmė yra tokia  
= 9.9901239387481261089712504055752e+9875 =
 
Iš tikro, galima buvo padaryt greičiau (tiesiog truputi susipainiojęs buvau (kėliau 5 laipsniu, o ne   todėl nesigaudinėjo...)). Štai kaip.
  22740.329390315065728263998865254;
  0.22740329390315065728263998865254.
Toliau, pagal Makloreno eilutę, apskaičiuojame
  1.2553360352357425652203277670022.
Ir toliau tiesiog   pakeliam   laipsniu:
 
= 1.2553360352357425652203277670022^100000 =
= 9.9901239387481261089712504105024e+9875.


Bet kokio skaičiaus pakelimas bet kokiu laipsniu (universalus algoritmas)
Jei pakelsime   kvadratu, tai gausime   Jei toliau   pakelsim kvadratu, gausime   Jeigu dar toliau pakelsim 16 kvadratu, tai gausime   Jei dar toliau pakelsime 256 kvadratu, tai gausime  
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   Tada
 
  22740.329390315065728263998865254.
Žinome, kad  
Tada pažymėkime
  0.0000152587890625 * 22740.329390315065728263998865254 =
= 0.34698988937858681836340330299764.
Toliau apskaičiuojame Makloreno eilutę   kuri nėra ilga, nes   Taigi
  1.414802420766463739969945373195.
Toliau   reikia pakelti 65536 laipsniu. Tačiau   Tiksliai negaliu pasakyt kodėl, bet   reikia pakelti kvadratu 16 kartų (tai galima padaryti pasapaudus mygtuką x2 ant kalkuliatoriaus 16 kartų). Tada gausime
 
= 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   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   paklaida, atėmus mažiau tikslią reikšmę iš tikslios reikšmės su "Windows 10" kalkuliatorium.


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


  • Apskaičiuosime   šituo universaliu algoritmu. Kalkuliatoriaus šito skaičiaus reikšmė yra tokia:
  2.9855588086470807664732431219819e+8477 =
 
 
  19520.107620245425962920091221327.
 
= 0.29785320465462380924865861848948.
Toliau apskaičiuojama Makloreno eilutė   kuri suprantama nėra ilga. Gautume:
  1.3469640453138238767100251046857.
Toliau   reikia pakelti 65536 laipsniu. Tai padarysime 16 kartų pakėlę kvadratu skaičių  :
 
= 2.9855588086470807664732431219819e+8477.
Toks pat atsakymas kaip iš kalkuliatoriaus. Atėmę gautą reikšmę, apskaičiuotą šiuo universaliu algoritmu, iš tikslios   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ų   ar jo kvadratą, bet ir, pavyzdžiui, skaičių   Apskaičiuosime   taikydami Makloreno eilutę ir greitą universalų algoritmą. Iš kalkuliatoriaus:
  9.3333544088834579475132722410259e-4184 =
 
Pradedame skaičiavimus.
 
  -9631.7824346074879409819697420947.
 
= -0.07348466823278417923722816270519.
Toliau apskaičiuojama Makloreno eilutė   kuri nėra ilga (nebūtina skaičiuoti su tokia neigiama   reikšme; galima apskaičiuoti   o paskui gautą rezultatą pakelti -1 laipsniu, bet su   turėtų net truputi greičiaus skaičiuotis Makloreno eilutė nei su  ). Apskaičiavus Makloreno eilute gautume:
  0.92915039119982175027449213911686.
Toliau   reikia pakelti   laipsniu. Tai padarysime 17 kartų pakėlę kvadratu skaičių   (ant kalkuliatoriaus reikia 17 kartų paspausti mygtuką x2):
 
= 9.3333544088834579475132722410259e-4184.
Toks pat atsakymas kaip iš kalkuliatoriaus. Atėmę gautą reikšmę, apskaičiuotą šiuo universaliu algoritmu, iš tikslios   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  :
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  ).
Iš "Windows 10" kalkuliatoriaus: 5.1537752073201133103646112976562e-53 (tai reiškia  ). Gavome 15 pirmų teisingų skaitmenų, kas atitinka Double Precision (64 bit) garantuotą tikslumą.
O toks Free Pascal kodas apskaičiuoja  :
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  ).
Iš "Windows 10" kalkuliatoriaus: 1.8739277038847939886754019920358e-314 (tai reiškia  ). 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   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:   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:   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  ):
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:   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  ):
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   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   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   8.9884656743115795386465259539451e+307 (dar turbūt reikia šitą skaičių padauginti iš 9.99999999999999 ar panašiai). (  ).
Beje, Double Extended Precision   5.94865747678615882542879663314e+4931. (   ).
Be to,   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

keisti