Kategoria: programowanie / vba


30 grudnia 2004 (czwartek), 15:56:56

Liczba pi

  1. Liczba Π (π) to bardzo ładna liczba, choć używając fontu Verdana nie od razu to widać. W Times wygląda ona tak Π (π) a przez co bardziej uwidocznione jest piękno jej zaokrągleń.
  2. Kalkulator firmy Microsoft będący elementem Windows 2000 powiedział, że

    2 arc cos 0 = 3,1415926535897932384626433832795

    Nieźle, ale czy można mu wierzyć, skoro wykryto w nim poważne błędy przy prostym dzieleniu.

  3. Programować każdy może, więc zaintrygowany pięknem π postanowiłem sobie wyliczyć ile to ta liczba w zasadzie ma. W pamięci plątało się jakiś wzór na szereg skończony co to do π miał być zbieżny ale pamięć jest zawodna więc w materiałach źródłowych odnalazłem wzór Wallisa po czym zaimplementowałem go w Exel-a. Wyszło tragicznie, bo Exel kończy się na 65536 wierszach (65536 to też ładna liczba, zwłaszcza dla takich jak ja, ludzi 16-bitowych) a w 65 tysiącach przybliżeń liczba π wypada blado (można powiedzieć, że jest za okrągła). W każdym razie od góry miałem 3.18 a od dołu 3.09 więc...
  4. Skoro nie Exel to Word (kurcze, ale wyrafinowanych narzędzi programistycznych używam). Zapisałem takie oto makro w VBA
    Sub wzor_wallisa()
        Dim n As Long
        Dim p As Boolean
        Dim pi As Double
        Dim np As Long
        Dim nn As Long
        n = 1 : p = True : np = 2 : nn = 1
        pi = 2
        While n < 100000
              n = n + 1
              pi = pi * np / nn
              If p Then nn = nn + 2       ' krok parzysty
              If Not p Then np = np + 2   ' nieparzysty
              p = Not p
              Debug.Print n, pi
        Wend
    End Sub

    i już wiem, że iteracja #99999 daje przybliżenie od dołu 3,14157694550873 a iteracja #100000 przybliża od góry 3,14160836159235. Słabo! Z ciekawości podnoszę poprzeczkę do miliona iteracji i niech sobie mój noterek policzy.

    No i policzył. Milionowa iteracja to 3,14159422438652 czyli błąd jest już na 6 pozycji. Cieniarstwo! Może napisze ten program jakoś inaczej, w innym języku, bez użycia arytmetyki rzeczywistej (double) i szybciej dojdę do jakiegoś wyniku jaki inni mieli w XVII w. bez komputerów.

  5. Lepsze przybliżenie

    3,1415926535 8979323846 2643383279 5028841971 6939937510 5820974944 592307816...

  6. Przemyślenie

    Czasem wydaje mi się, że żyjemy w epoce, w której wszystko już co można było wymyślić wymyślono. Kiedyś to się męczyli, liczyli π, odkrywali zasady dynamiki i prawa Maxwella a teraz? Czego się nie tknąć to wymyślone, zbadane, opisany, zastosowane a jeżeli chciałoby się poszukać czegoś nowego to jest to tak wyspecjalizowane, tajemne, że praktycznie graniczy gdzieś z magią.

  7. Ciekawe linki

    W zasadzie wystarczy jeden: http://pl.wikipedia.org/wiki/Liczba_pi bo od niego można iść dalej w ciekawe miejsca.

  8. Dopisek (31 grudnia 2017)

    Przepisałem sobie to w C aby uruchomić na jakimś on-linowym kompilatorze:

    int main() {
        double pi;
        long int n;
        int p;
        unsigned long int np, nn;
        n = 1 ; p = 1;
        np = 2; nn = 1;
        pi = 2;
        while (n < 10000) {
              n = n + 1;
              pi = pi * np / nn;
              
              if (p) 
                nn = nn + 2;  // krok parzysty
              if (!p) 
                np = np + 2;  // nieparzysty
              
              p = !p;
              printf ("\n%8d %f", n, pi);
        }
        return 0;
    }

    Ale coś mi nie poszło. Efekt dla 1000 kroków to 3.143164. Nie znam się na C. Już się nie znam.

    A kompilator jest tu: http://www.compileonline.com/compile_c_online.php

Kategorie: informatyka, _blog, programowanie / c, programowanie /vba, programowanie


Słowa kluczowe: liczba PI, matematyka, VBA, informatyka, wzór Wallisa


Komentarze: (8)

margaux, January 8, 2005 22:40 Skomentuj komentarz


Bardziej od liczby "PI" interesuje mnie liczba "FI". Jeśli posiadasz materiały na ten temat-jestem zainteresowana.

Plusia, October 30, 2006 20:43 Skomentuj komentarz


Jak chcesz informacje na temat liczby Fi to przeczytaj sobie Kod Leonarda daVinci :D Dokładnie strony 121-128 :D Przypominam, że liczba Fi wynosi 1,618 i jest równa m.in. ilorazowi liczby pszczół płci żeńskiej i pszczół płci męskiej (tzw trutni) w jakimkolwiek ulu na świecie ;)

anonim, October 31, 2006 09:16 Skomentuj komentarz


najważniejsze to sięgnąć po wiarygodne źródła :-)

marekm, January 4, 2005 22:35 Skomentuj komentarz


najwieksze przyblizenie uzyskałem przy pomocy tego algorytmu z ciągiem ale stosowałem arytemetykę typu "własna procedura obliczania w słupkach liczb zapisanych jako ciąg cyfr w pliku tekstowym". Sposob był niezly ale miałem wtedy tylko 21MB dysku twardego a poza systemem i pascalem musiały sie tam mieścić jeszcze trzy pliki z ciągami cyfr. Teraz mam trochę więcej miejsc na dysku więc może napiszę ten progam jeszcze raz...

pepegi, January 3, 2005 11:47 Skomentuj komentarz


ech. albo machina latające wymyślać, albo jako pierwszy przekroczyć na kołach 100 km/h...
szewo> chyba e^Pi, nie?

anonim, December 31, 2004 09:08 Skomentuj komentarz


pi ect są mi obce jak działania na Area 51 :P
a wpisuje się, bo
chciałabym życzyć Ci wszystkiego dobrego w Nowym Roku :)

krisper, December 31, 2004 00:02 Skomentuj komentarz


było im łatwiej? powiedz to Kopernikowi :-) odnośnie liczenia na piechotkę, to te wszystkie logarytmy, całki, różniczki nie wymyślono po to by gnębić biednych studentów na pierwszym roku, ale po to by łatwiej liczyc takie dziwne rzeczy. a szkoda, że np. na początku nauki o logarytmach nie mówi się ludziom, do czego to kiedyś było potrzebne, albo, że całkowanie to takie po troszę przewidywanie przyszłości. a wracając do tematu "czy im było łatwiej". mieli tak samo przechlapane jak my, tylko inaczej.

szewo.blox.pl, December 30, 2004 20:57 Skomentuj komentarz


Zagadki dwie:

1. Co jest większe: e^Pi czy Pi^e (bez kalkulatora, proszę, bo to proste).

2. Na który miejscu w rozwinięciu liczby Pi zaczyna się ciąg 111 zer.
Skomentuj notkę
21 grudnia 2002 (sobota), 11:11:11

Krzywe Hilberta

Pewien grudnowie nocy 2002 roku zachciało mi się przypomnieć rekurencję i krzywe Hilberta ładnie namalować. Ale był problem. Na komputerze domowym nie miałem żadnego kompilatora, żadnego języka który grafikę potrafiłby malować. Napewno? Był Word a w nim VBA, który szybko opanowałem. I powstało takie coś.

Kilka lat później wyksportowałem to Wordem do HTMLa, czyli zrobił się jakiś GIF, ale też kod, którego dziś pewnie żadna przeglądarka nie ruszy. Ale zachowuję ku pamięci. 

Rem
Rem Krzywe Hilberta wg. algorytmu Niklausa Wirth'a
Rem zawartego w książce "Algorytmy + struktury danych = programy"
Rem w chwili radości (21 grudnia 2002) z Pascala na VBA przetłumaczył Wojtek34
Rem

Dim XX, YY As Double
Dim x, y As Double
Dim h As Double
Dim grubość As Double

Sub Hilbert()
N = 5: h0 = 600

InicjujPisanie
i = 0: h = h0: x0 = h / 2: y0 = x0
Do
i = i + 1: h = h / 2
x0 = x0 + h / 2: y0 = y0 + h / 2
x = x0: y = y0: UstawPióro 4 / i
A (i)
Loop Until i = N

End Sub

Private Sub InicjujPisanie()
Selection.WholeStory
Selection.Delete Unit:=wdCharacter, Count:=1 ' kasuj też wszystko z dokumentu !
x = 0: y = 0
End Sub

Private Sub UstawPióro(grubość1)
XX = x: YY = y
grubość = grubość1
End Sub

Private Sub Kreśl()
ActiveDocument.Shapes.AddLine(XX, YY, x, y).Select
Selection.ShapeRange.Line.Weight = grubość
Selection.EndKey ' to służy temu, aby na ekranie pojawiło się to co się namalowało
XX = x: YY = y
End Sub

Private Sub A(i As Integer)
If i > o Then
D i - 1: x = x - h: Kreśl
A i - 1: y = y - h: Kreśl
A i - 1: x = x + h: Kreśl
B i - 1
End If
End Sub

Private Sub B(i As Integer)
If i > o Then
C i - 1: y = y + h: Kreśl
B i - 1: x = x + h: Kreśl
B i - 1: y = y - h: Kreśl
A i - 1
End If
End Sub

Private Sub C(i As Integer)
If i > o Then
B i - 1: x = x + h: Kreśl
C i - 1: y = y + h: Kreśl
C i - 1: x = x - h: Kreśl
D i - 1
End If
End Sub

Private Sub D(i As Integer)
If i > o Then
A i - 1: y = y - h: Kreśl
D i - 1: x = x - h: Kreśl
D i - 1: y = y + h: Kreśl
C i - 1
End If
End Sub

 

A oto efekt działania tego kodu na kartce A4 w Wordzie.

image001


Kategorie: programowanie, _blog, programowanie / vba, programowanie / html


Słowa kluczowe: krzywe hilberta, vba, rekurencja


Pliki


Komentarze: (0)

Skomentuj notkę

Disclaimers :-) bo w stopce coś wyglądającego mądrze można napisać. Wszystkie powyższe notatki są moim © wymysłem i jako takie związane są ze mną. Ale są też materiały obce, które tu przechowuję lub cytuje ze względu na ich dobrą jakość, na inspiracje, bądź ilustracje prezentowanego lub omawianego tematu. Jeżeli coś narusza czyjeś prawa - proszę o sygnał abym mógł czym prędzej naprawić błąd i naruszeń zaniechać.