Kirjoittaja: Hipo
Kirjoitettu: 26.10.2002 – 26.10.2002
Tagit: matematiikka, koodi näytille, vinkki
Rekursiivinen ja adaptiivinen piin likiarvon laskija schemellä. Jakaa ympyrän neliänneksen aina vaan pienempiin neliöihin kohdista joista täytyy. Lukee aluksi luvun, joka kertoo iteraatioiden määrän. Näyttäs tossa saavan jo 36 sekunnis (22 iteraatiota) arvon 3.14159107208251953125 (stalinilla käännettynä).
(define (circle x y) (<= (+ (* x x) (* y y)) 1)) (define (quad x y s) (list (circle x y) (circle (+ x s) y) (circle x (+ y s)) (circle (+ x s) (+ y s)) )) (define (oper-list oper l) (if (null? (cdr l)) (car l) (oper (car l) (oper-list oper (cdr l))) )) (define (and-list l) (oper-list (lambda (a b) (and a b)) l)) (define (or-list l) (oper-list (lambda (a b) (or a b)) l)) (define (sub-get-value n x y s) (/ (+ (get-value n x y s) (get-value n (+ x s) y s) (get-value n x (+ y s) s) (get-value n (+ x s) (+ y s) s)) 4) ) (define (get-value n x y s) (begin (define l (quad x y s)) (if (and-list l) 1 (if (or-list l) (if (> n 1) (sub-get-value (- n 1) x y (/ s 2)) 0) 0) ))) (define (pi n) (* (get-value n 0 0 1) 4.0)) (display (pi (read)))
Uusi ohjelmointikieli Ohjelmointiputkassa, hieno juttu ;)
likiarvo minkä kirjotit ei oo piin. piin on 3.1415926535....
Ohoh taitaa olla kommenttifilu miten sattuu :x Mutta hieno soodinpätkä.
Joo, jos oikein nysvätään niin toi ei oo piin likiarvo, koska siin on liikaa desimaaleja, eli liian tarkka vastaus. En jaksanu miettiä miten lasketaan kuin tarkka toi arvo on tietämättä piin oikeeta arvoa. Ehkäpä rekursion ihan lopussa pitäis ottaa ylös pinta-ala, jota ei laskettu ja sen mukaan päätellä. Laitoin tohon siis kaikki desimaalit mitä ohjelmakin antoi. Kaikkihan tietää piistä ainaki 20 ekaa desimaalia, niin voi vertailla. :)
Kommenttifilu?
Tiedosto joka sisältää nämä kommentit.. oli kai vähän sekaisin tuossa aiemmin kun kommentti näkyi lähettäjänä, ip lähetysaikana jne.
Tuli muuten pari vuotta sitten opiskeltua piin 30 ekaa desimaalia. 3,1415926535 8979323846 2643383279...
Mitenkäs pii lasketaan? En oikein tajua tota ohjelmointikieltä...
Montaki tapaa laskea pii. Tämmönen nyt ekana tuli mieleen: yksikköympyrän pinta-ala on A=pii*1^2, saadaan suoraan pii=A/1^2. Ympyrän pinta-alalle saadaan likiarvo kun jaetaan se pieniin neliöihin ja ympyrän sisäl olevien pikkuneliöiden pinta-ala summataan.
Vanha tapa...
Jos tarkkoja ollaan niin piin ekoja desimaaleja on tässä:
3,1415926535 8979323846 2643383279 5028841971 6939937510
5820974944 5923078164 0628620899 8628034825 3421170679
8214808651 3282306647 0938446095 5058223172 5359408128
Laskettu SuperPI nimisellä nopeustestiohjelmalla
mikäs ohjelmointikieli tämä on...?
ups olin huolimaton oliko se kieli scheme
aika epätarkka
Aikamoinen kikkare.
Schemeä en omista, mutta piitä opin ulkoa! ;)
Pasteanko andwikistä?