Różnica pomiędzy stronami "Funkcje informacyjne" i "Funkcje liczbowe"

Z Henryk Dąbrowski
(Różnica między stronami)
Przejdź do nawigacji Przejdź do wyszukiwania
m (1 wersja)
 
 
Linia 1: Linia 1:
<div style="text-align:right; font-size: 130%; font-style: italic; font-weight: bold;">18.10.2020</div>
+
<div style="text-align:right; font-size: 130%; font-style: italic; font-weight: bold;">27.09.2020</div>
  
 
__FORCETOC__
 
__FORCETOC__
Linia 5: Linia 5:
  
  
== Funkcja IsDigit ==
+
== Logarytm o podstawie 10 ==
  
Funkcja IsDigit() sprawdza, czy pierwszy znak zmiennej znakowej jest cyfrą.
+
Korzystając ze wzoru na zmianę podstawy logarytmu:
  
  <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>IsDigit(Txt <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Boolean</span>
+
::log<sub>a</sub>(x) = log<sub>b</sub>(x)/log<sub>b</sub>(a)
     <span style='color:#707070;'>'funkcja sprawdza czy pierwszy znak zmiennej Txt jest cyfrą</span>
+
 
    <b><span style='color:#1f1c1b;'>Dim</span></b> Code <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
+
łatwo zdefiniujemy logarytm o podstawie równej 10:
    <b><span style='color:#1f1c1b;'>If </span></b>IsEmpty(Txt) <b><span style='color:#000000;'>OR</span></b> Txt <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;&quot;</span> <b><span style='color:#1f1c1b;'>Then</span></b>
+
 
        IsDigit <span style='color:#000080;'>=</span> False
+
  <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>myLog10(x <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>
        <b><span style='color:#1f1c1b;'>Exit Function</span></b>
+
     myLog10 <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Log</span>(x)/<span style='color:#0095ff;'>Log</span>(<span style='color:#ff0000;'>10</span>)
    <b><span style='color:#1f1c1b;'>End If</span></b>
+
<b><span style='color:#1f1c1b;'>End Function</span></b></span>
    Code <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Asc</span>(Txt)
+
 
    IsDigit <span style='color:#000080;'>=</span> False
+
<span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Liczbowe1()
    <b><span style='color:#1f1c1b;'>If </span></b>Code &gt;= <span style='color:#ff0000;'>48</span> <b><span style='color:#000000;'>AND</span></b> Code &lt;= <span style='color:#ff0000;'>57</span> <b><span style='color:#1f1c1b;'>Then</span></b>
+
    MsgBox <span style='color:#0095ff;'>myLog10</span>(<span style='color:#ff0000;'>10</span>)
        IsDigit <span style='color:#000080;'>=</span> True
+
    MsgBox <span style='color:#0095ff;'>myLog10</span>(<span style='color:#ff0000;'>100</span>)
    <b><span style='color:#1f1c1b;'>End If</span></b>
+
<b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 +
 
 +
Jest to znacznie prostszy sposób niż wykorzystywanie w tym celu funkcji arkusza LOG10().
 +
 
 +
 
 +
 
 +
 
 +
 
 +
== Liczba losowa z przedziału [a, b) ==
 +
 
 +
Funkcja Rnd() zwraca liczbę losową z przedziału [0, 1). Łatwo możemy napisać funkcję, która zwraca liczbę losową z przedziału [a, b).
 +
 
 +
<span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>RandNum(a <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>, b <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>
 +
    <span style='color:#707070;'>'funkcja zwraca liczbę losową z przedziału [a,b)</span>
 +
    RandNum <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Rnd</span>()*(b-a) + a <span style='color:#707070;'>'Rnd() zwraca liczbę losową z przedziału [0,1)</span>
 
  <b><span style='color:#1f1c1b;'>End Function</span></b></span>
 
  <b><span style='color:#1f1c1b;'>End Function</span></b></span>
  
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Informacyjne1()
+
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Liczbowe2()
     MsgBox <span style='color:#0095ff;'>IsDigit</span>(<span style='color:#ff0000;'>&quot;123&quot;</span>) <span style='color:#707070;'>'True</span>
+
     <b><span style='color:#1f1c1b;'>Dim</span></b> oSheets <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oRows <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
    MsgBox <span style='color:#0095ff;'>IsDigit</span>(<span style='color:#ff0000;'>&quot;abc&quot;</span>) <span style='color:#707070;'>'False</span>
+
    <b><span style='color:#1f1c1b;'>Dim</span></b> r <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, g <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, b <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, k <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
     MsgBox <span style='color:#0095ff;'>IsDigit</span>(<span style='color:#ff0000;'>&quot;&quot;</span>)   <span style='color:#707070;'>'False</span>
+
    oSheets <span style='color:#000080;'>=</span> ThisComponent.getSheets() <span style='color:#707070;'>'uchwyt do skoroszytu</span>
     MsgBox <span style='color:#0095ff;'>IsDigit</span>(<span style='color:#ff0000;'>3.14</span><span style='color:#707070;'>'True</span>
+
    <b><span style='color:#1f1c1b;'>If </span></b><b><span style='color:#000000;'>NOT</span></b> oSheets.hasByName( <span style='color:#ff0000;'>&quot;TestRGB&quot;</span> ) <b><span style='color:#1f1c1b;'>Then</span></b> <span style='color:#707070;'>'sprawdza czy arkusz o podanej nazwie już istnieje</span>
    MsgBox <span style='color:#0095ff;'>IsDigit</span>(True) <span style='color:#707070;'>'False</span>
+
        oSheets.insertNewByName( <span style='color:#ff0000;'>&quot;TestRGB&quot;</span>, <span style='color:#ff0000;'>0</span> ) <span style='color:#707070;'>'wstawia nowy arkusz na pozycji 1 (z indeksem 0)</span>
 +
     <b><span style='color:#1f1c1b;'>End If</span></b>
 +
    oSht <span style='color:#000080;'>=</span> oSheets.getByName(<span style='color:#ff0000;'>&quot;TestRGB&quot;</span>) <span style='color:#707070;'>'uchwyt do arkusza &quot;TestRGB&quot;</span>
 +
     ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'uaktywnienie arkusza &quot;TestRGB&quot;</span>
 +
    oRows <span style='color:#000080;'>=</span> oSht.getRows() <span style='color:#707070;'>'uchwyt do wierszy</span>
 +
    <b><span style='color:#1f1c1b;'>For </span></b>k=<span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>100</span>
 +
        r <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Int</span>( <span style='color:#0095ff;'>RandNum</span>(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>256</span>) )
 +
        g <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Int</span>( <span style='color:#0095ff;'>RandNum</span>(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>256</span>) )
 +
        b <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Int</span>( <span style='color:#0095ff;'>RandNum</span>(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>256</span>) )
 +
        oRows.getByIndex(k).Height <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>200</span> <span style='color:#707070;'>'wybiera wiersz przez indeks i ustawia jego wysokość równą 2 mm</span>
 +
        oRows.getByIndex(k).CellBackColor <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>RGB</span>(r,g,b) <span style='color:#707070;'>'ustawia kolor tła wiersza</span>
 +
    <b><span style='color:#1f1c1b;'>Next </span></b>k
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
  
  
Wyjaśnienie dlaczego nie pojawia się błąd, gdy funkcja IsDigit() zostaje wywołana z niewłaściwym typem parametru i dlaczego zwraca taki wynik, Czytelnik znajdzie [[Zmienne#Deklarowanie_typu_funkcji_oraz_typu_parametr.C3.B3w_procedury_lub_funkcji| TUTAJ]]
 
  
  
  
 +
== Obliczanie pierwiastka kwadratowego ==
  
 +
Zauważmy, że jeżeli liczba a jest przybliżoną wartością pierwiastka z liczby x z niedomiarem, to x/a jest przybliżoną wartością pierwiastka z liczby x z nadmiarem. Pozwala to przypuszczać, że ciąg kolejnych średnich z liczb a i x/a będzie dążył do pierwiastka z liczby a. Jest tak w istocie i pozwala to zapisać prosty algorytm służący do obliczania pierwiastka z liczby nieujemnej x ([https://pl.wikipedia.org/wiki/Algorytm_obliczania_pierwiastka_n-tego_stopnia LINK]):<br/>
 +
::a<sub>1</sub> = 1<br/>
 +
::a<sub>n+1</sub> = ( a<sub>n</sub> + x/a<sub>n</sub> )/2<br/>
  
== Funkcja IsPrime ==
+
Możemy zatem napisać własną funkcję, która oblicza pierwiastek kwadratowy. Podkreślmy, że zapisana niżej funkcja mySqr() nie jest potrzebna, bo istnieje funkcja Sqr(), która pierwiastek kwadratowy z liczby x znajduje. Funkcję tę prezentujemy jedynie jako ciekawostkę dla zainteresowanego Czytelnika, który chciałby wiedzieć, jak funkcję tę można zrealizować. Wykorzystujemy następujące rozwinięcie w szereg Taylora:
  
Funkcja IsPrime() sprawdza, czy liczba całkowita jest liczbą pierwszą. Uwaga: działanie funkcji IsDigit() można przyspieszyć dwukrotnie, sprawdzając jedynie dzielniki nieparzyste, a&nbsp;nawet trzykrotnie sprawdzając jedynie dzielniki postaci 6k-1 i 6k+1. To proste ulepszenie algorytmu pozostawiamy Czytelnikowi. Oczywiście funkcja ta nie nadaje się do sprawdzania bardzo dużych liczb całkowitych.
+
::&radic;(1+x) = 1 + x/2 - x^2/8 + x^3/16 - ...
  
  <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>IsPrime(n <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Boolean</span>
+
Rozwinięcie jest zbieżne dla |x| &le; 1
     <span style='color:#707070;'>'funkcja sprawdza, czy liczba całkowita n jest liczbą pierwszą</span>
+
 
     <b><span style='color:#1f1c1b;'>Dim</span></b> d <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
+
  <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>mySqr(x <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>
     <b><span style='color:#1f1c1b;'>If </span></b>n &lt;= <span style='color:#ff0000;'>2</span> <b><span style='color:#1f1c1b;'>Then</span></b>
+
     <span style='color:#707070;'>'funkcja oblicza pierwiastek kwadratowy z x</span>
         IsPrime <span style='color:#000080;'>=</span> (n=<span style='color:#ff0000;'>2</span>)
+
     <b><span style='color:#1f1c1b;'>Dim</span></b> a <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>, b <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>, r <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>
 +
     <b><span style='color:#1f1c1b;'>If </span></b>x &lt; <span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>Then</span></b>
 +
         mySqr <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span>
 +
        MsgBox <span style='color:#ff0000;'>&quot;mySqr: ujemna wartość parametru!&quot;</span>
 
         <b><span style='color:#1f1c1b;'>Exit Function</span></b>
 
         <b><span style='color:#1f1c1b;'>Exit Function</span></b>
 
     <b><span style='color:#1f1c1b;'>End If</span></b>
 
     <b><span style='color:#1f1c1b;'>End If</span></b>
     IsPrime <span style='color:#000080;'>=</span> True
+
     r <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>10</span>^(-<span style='color:#ff0000;'>5</span>) <span style='color:#707070;'>'wartość r wyznacza precyzję obliczeń</span>
    <b><span style='color:#1f1c1b;'>For </span></b>d <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>2</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#0095ff;'>Int</span>( <span style='color:#0095ff;'>Sqr</span>(n) ) + <span style='color:#ff0000;'>1</span> <span style='color:#707070;'>'całość z pierwiastka kwadratowego z n plus 1</span>
+
    a <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span>
        <b><span style='color:#1f1c1b;'>If </span></b>(n <b><span style='color:#000000;'>MOD</span></b> d) <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>Then</span></b>
+
    b <span style='color:#000080;'>=</span> x
            IsPrime <span style='color:#000080;'>=</span> False
+
    <b><span style='color:#1f1c1b;'>If </span></b><span style='color:#0095ff;'>Abs</span>(b - a) &lt;= r <b><span style='color:#1f1c1b;'>Then</span></b>
            <b><span style='color:#1f1c1b;'>Exit For</span></b>
+
        mySqr <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span> + (x-<span style='color:#ff0000;'>1</span>)/<span style='color:#ff0000;'>2</span> - (x-<span style='color:#ff0000;'>1</span>)^<span style='color:#ff0000;'>2</span>/<span style='color:#ff0000;'>8</span> + (x-<span style='color:#ff0000;'>1</span>)^<span style='color:#ff0000;'>3</span>/<span style='color:#ff0000;'>16</span>
         <b><span style='color:#1f1c1b;'>End If</span></b>
+
        <b><span style='color:#1f1c1b;'>Exit Function</span></b>
     <b><span style='color:#1f1c1b;'>Next </span></b>d
+
    <b><span style='color:#1f1c1b;'>End If</span></b>
 +
    <b><span style='color:#1f1c1b;'>Do While </span></b><span style='color:#0095ff;'>Abs</span>(b - a) &gt; r
 +
         a <span style='color:#000080;'>=</span> b
 +
        b <span style='color:#000080;'>=</span> (a + x/a)/<span style='color:#ff0000;'>2</span>
 +
     <b><span style='color:#1f1c1b;'>Loop</span></b>
 +
    mySqr <span style='color:#000080;'>=</span> b
 
  <b><span style='color:#1f1c1b;'>End Function</span></b></span>
 
  <b><span style='color:#1f1c1b;'>End Function</span></b></span>
  
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Informacyjne2()
+
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Liczbowe3()
     <span style='color:#707070;'>'lista liczb pierwszych mniejszych od liczby 1000</span>
+
     MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>0.25</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Sqr</span>(<span style='color:#ff0000;'>0.25</span>)
    <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
+
     MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>1</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Sqr</span>(<span style='color:#ff0000;'>1</span>)
     <b><span style='color:#1f1c1b;'>Dim</span></b> k <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, Wiersz <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
+
    MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>1</span>+<span style='color:#ff0000;'>10</span>^(-<span style='color:#ff0000;'>6</span>)) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Sqr</span>(<span style='color:#ff0000;'>1</span>+<span style='color:#ff0000;'>10</span>^(-<span style='color:#ff0000;'>6</span>))
    oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span>
+
     MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>2</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Sqr</span>(<span style='color:#ff0000;'>2</span>) <span style='color:#707070;'>'√2 <span style='color:#000080;'>=</span> 1.414213562373095…</span>
    ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'uaktywnienie pierwszego arkusza</span>
+
    MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>3</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Sqr</span>(<span style='color:#ff0000;'>3</span>) <span style='color:#707070;'>'√3 <span style='color:#000080;'>=</span> 1.732050807568877…</span>
    oSht.getColumns().insertByIndex(<span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>2</span>) <span style='color:#707070;'>'dodajemy dwie kolumny na pozycję pierwszą</span>
+
    MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>4</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Sqr</span>(<span style='color:#ff0000;'>4</span>)
    Wiersz <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span>
 
     <b><span style='color:#1f1c1b;'>For </span></b>k <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>1000</span>
 
        <b><span style='color:#1f1c1b;'>If</span></b> <span style='color:#0095ff;'>IsPrime</span>(k) <b><span style='color:#1f1c1b;'>Then</span></b>
 
            oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>, Wiersz).Value <span style='color:#000080;'>=</span> Wiersz + <span style='color:#ff0000;'>1</span>
 
            oSht.getCellByPosition(<span style='color:#ff0000;'>1</span>, Wiersz).Value <span style='color:#000080;'>=</span> k
 
            Wiersz <span style='color:#000080;'>=</span> Wiersz + <span style='color:#ff0000;'>1</span>
 
        <b><span style='color:#1f1c1b;'>End If</span></b>
 
    <b><span style='color:#1f1c1b;'>Next </span></b>k
 
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
  

Wersja z 19:06, 18 paź 2020

27.09.2020



Logarytm o podstawie 10

Korzystając ze wzoru na zmianę podstawy logarytmu:

loga(x) = logb(x)/logb(a)

łatwo zdefiniujemy logarytm o podstawie równej 10:

Function myLog10(x as Double) as Double
    myLog10 = Log(x)/Log(10)
End Function
Sub Liczbowe1()
    MsgBox myLog10(10)
    MsgBox myLog10(100)
End Sub

Jest to znacznie prostszy sposób niż wykorzystywanie w tym celu funkcji arkusza LOG10().



Liczba losowa z przedziału [a, b)

Funkcja Rnd() zwraca liczbę losową z przedziału [0, 1). Łatwo możemy napisać funkcję, która zwraca liczbę losową z przedziału [a, b).

Function RandNum(a as Double, b as Double) as Double
    'funkcja zwraca liczbę losową z przedziału [a,b)
    RandNum = Rnd()*(b-a) + a 'Rnd() zwraca liczbę losową z przedziału [0,1)
End Function
Sub Liczbowe2()
    Dim oSheets as Object, oSht as Object, oRows as Object
    Dim r as Long, g as Long, b as Long, k as Long
    oSheets = ThisComponent.getSheets() 'uchwyt do skoroszytu
    If NOT oSheets.hasByName( "TestRGB" ) Then 'sprawdza czy arkusz o podanej nazwie już istnieje
        oSheets.insertNewByName( "TestRGB", 0 ) 'wstawia nowy arkusz na pozycji 1 (z indeksem 0)
    End If
    oSht = oSheets.getByName("TestRGB") 'uchwyt do arkusza "TestRGB"
    ThisComponent.CurrentController.setActiveSheet(oSht) 'uaktywnienie arkusza "TestRGB"
    oRows = oSht.getRows() 'uchwyt do wierszy
    For k=0 To 100
        r = Int( RandNum(0,256) )
        g = Int( RandNum(0,256) )
        b = Int( RandNum(0,256) )
        oRows.getByIndex(k).Height = 200 'wybiera wiersz przez indeks i ustawia jego wysokość równą 2 mm
        oRows.getByIndex(k).CellBackColor = RGB(r,g,b) 'ustawia kolor tła wiersza
    Next k
End Sub



Obliczanie pierwiastka kwadratowego

Zauważmy, że jeżeli liczba a jest przybliżoną wartością pierwiastka z liczby x z niedomiarem, to x/a jest przybliżoną wartością pierwiastka z liczby x z nadmiarem. Pozwala to przypuszczać, że ciąg kolejnych średnich z liczb a i x/a będzie dążył do pierwiastka z liczby a. Jest tak w istocie i pozwala to zapisać prosty algorytm służący do obliczania pierwiastka z liczby nieujemnej x (LINK):

a1 = 1
an+1 = ( an + x/an )/2

Możemy zatem napisać własną funkcję, która oblicza pierwiastek kwadratowy. Podkreślmy, że zapisana niżej funkcja mySqr() nie jest potrzebna, bo istnieje funkcja Sqr(), która pierwiastek kwadratowy z liczby x znajduje. Funkcję tę prezentujemy jedynie jako ciekawostkę dla zainteresowanego Czytelnika, który chciałby wiedzieć, jak funkcję tę można zrealizować. Wykorzystujemy następujące rozwinięcie w szereg Taylora:

√(1+x) = 1 + x/2 - x^2/8 + x^3/16 - ...

Rozwinięcie jest zbieżne dla |x| ≤ 1

Function mySqr(x as Double) as Double
    'funkcja oblicza pierwiastek kwadratowy z x
    Dim a as Double, b as Double, r as Double
    If x < 0 Then
        mySqr = 0
        MsgBox "mySqr: ujemna wartość parametru!"
        Exit Function
    End If
    r = 10^(-5) 'wartość r wyznacza precyzję obliczeń
    a = 1
    b = x
    If Abs(b - a) <= r Then
        mySqr = 1 + (x-1)/2 - (x-1)^2/8 + (x-1)^3/16
        Exit Function
    End If
    Do While Abs(b - a) > r
        a = b
        b = (a + x/a)/2
    Loop
    mySqr = b
End Function
Sub Liczbowe3()
    MsgBox mySqr(0.25) & Chr(10) & Sqr(0.25)
    MsgBox mySqr(1) & Chr(10) & Sqr(1)
    MsgBox mySqr(1+10^(-6)) & Chr(10) & Sqr(1+10^(-6))
    MsgBox mySqr(2) & Chr(10) & Sqr(2) '√2 = 1.414213562373095…
    MsgBox mySqr(3) & Chr(10) & Sqr(3) '√3 = 1.732050807568877…
    MsgBox mySqr(4) & Chr(10) & Sqr(4)
End Sub





LibreOffice Calc – makra                   Strona główna