PFZ.nl - PHP Community: Pi-calculator (BBP-algorithm) - PHP - Forum - PFZ.nl - PHP Community

Je kunt niet antwoorden op dit topic
#1 05-09-2010 14:43
  • manu hobert
  • Groep: Forumleden
  • Posts: 54
  • Actief sinds: 03-09-2010
hallo,
ik heb een script geschreven om Pi te berekenen met het BBP-algoritme.
ik maak gebruik van bc math om mijn berekeningen te maken.
mijn vraag is nu wat is de max. precisie van de bc math functies ???
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
$start_time = microtime(true);

$digits = 100; //hoeveel digits je wilt
bcscale($digits+10); //+10 for the extra precision

$output_pi = "3.";
$pi = 0;
$k = 0;
    //calculate first iteration
        $a = bcdiv(1, bcpow(16,$k));
        $b = bcdiv(4, (8*$k+1));
        $c = bcdiv(2, (8*$k+4));
        $d = bcdiv(1, (8*$k+5));
        $e = bcdiv(1, (8*$k+6));
            $f = bcsub($b, $c);
            $g = bcsub($f, $d);
            $h = bcsub($g, $e);
                $i = bcmul($a, $h);
                    $pi = bcadd($pi, $i);

for($k = 1;$k <= $digits;$k++){
    set_time_limit(60);
    //calculate next iteration
    
        $a = bcdiv(1, bcpow(16,$k));
        $b = bcdiv(4, (8*$k+1));
        $c = bcdiv(2, (8*$k+4));
        $d = bcdiv(1, (8*$k+5));
        $e = bcdiv(1, (8*$k+6));
            $f = bcsub($b, $c);
            $g = bcsub($f, $d);
            $h = bcsub($g, $e);
                $i = bcmul($a, $h);
                    $pi = bcadd($pi, $i);
}
echo bcadd($pi, 0, $digits);
echo "<br>";
$time = microtime(true) - $start_time;
echo "we have calculated " . $digits . " digits in " . $time . " seconds !";
?>

Albert Einstein zei:

A person who never made a mistake never tried anything new.

#2 05-09-2010 14:44
Het lukte mij met BCmath maar tot 206 decimalen, gek genoeg. Geen idee waar dat precies aan lag.

#3 05-09-2010 14:48
  • manu hobert
  • Groep: Forumleden
  • Posts: 54
  • Actief sinds: 03-09-2010

Bekijk Post Op 05-09-2010 16:44 schreef Richard van Velzen:

Het lukte mij met BCmath maar tot 206 decimalen, gek genoeg. Geen idee waar dat precies aan lag.
raar ..?
mij is het al gelukt om er 2000 te gebruiken...

Albert Einstein zei:

A person who never made a mistake never tried anything new.

#4 05-09-2010 14:52
Volgens mij kun je de precisie instellen in php.ini? Ik ben al eens zoiets tegengekomen.
/me zoekt even php.ini door...

EDIT:
; The number of significant digits displayed in floating point numbers.
; http://php.net/precision
precision = 14

#5 05-09-2010 14:59
  • manu hobert
  • Groep: Forumleden
  • Posts: 54
  • Actief sinds: 03-09-2010
dat is voor "gewone" floating point getallen.
met BC Math kan je veel preciezer werken tot zelfs ... getallen na de komma (dat is nu juist mijn vraag).
PS: weet iemand waarom er bij mij actief sinds 1-1-1970 staat al ik geboren ben in 1997 ???

Albert Einstein zei:

A person who never made a mistake never tried anything new.

#6 05-09-2010 15:01

#7 05-09-2010 15:05
  • anoniem
  • Groep: Banned
  • Posts: 556
  • Actief sinds: 15-04-2005

Bekijk Post Op 05-09-2010 16:59 schreef manu hobert:

PS: weet iemand waarom er bij mij actief sinds 1-1-1970 staat al ik geboren ben in 1997 ???
Omdat er bugs zitten in MySQL, daar komt dit vandaan.

#8 05-09-2010 15:09
  • manu hobert
  • Groep: Forumleden
  • Posts: 54
  • Actief sinds: 03-09-2010
Bedankt om voor mij te zoeken maar ik denk niet dat het dat is want er staat "default 0 ".
ik denk dat ze daarmee bedoelen wat de standaard precisie is
bv.
1
bcsqrt(2, 3);

dit betekend de vierkantswortel van 2 met 3 getallen na de komma = 1,414
als je het zo doet:
1
bcsqrt(2);

dan krijg je de vierkantswortel van 2 met "default" gatallen na de komma, 0 dus = 1

Albert Einstein zei:

A person who never made a mistake never tried anything new.

#9 05-09-2010 15:10
  • manu hobert
  • Groep: Forumleden
  • Posts: 54
  • Actief sinds: 03-09-2010

Bekijk Post Op 05-09-2010 17:05 schreef Frank www.postgresql.org:

Omdat er bugs zitten in MySQL, daar komt dit vandaan.
bedankt, enig idee waneer dit opgelost wordt ?

Albert Einstein zei:

A person who never made a mistake never tried anything new.

#10 05-09-2010 15:19
Offtopic: dat is geen bug in MySQL, tijdens de migratie is er gegokt vanaf welke datum je actief bent omdat er geen registratiedata werden bijgehouden. Dit is niet overal goed gaan, dat komt nog.

#11 05-09-2010 15:20
  • manu hobert
  • Groep: Forumleden
  • Posts: 54
  • Actief sinds: 03-09-2010
ok

Albert Einstein zei:

A person who never made a mistake never tried anything new.

#12 05-09-2010 15:32
  • anoniem
  • Groep: Banned
  • Posts: 556
  • Actief sinds: 15-04-2005

Bekijk Post Op 05-09-2010 17:19 schreef Richard van Velzen:

Offtopic: dat is geen bug in MySQL, tijdens de migratie is er gegokt vanaf welke datum je actief bent omdat er geen registratiedata werden bijgehouden. Dit is niet overal goed gaan, dat komt nog.
Weet je dat heel erg zeker? Volgens Boyd is het een fout in MySQL. Daarnaast kan IPB (nog) niet in strictmode werken, de enig enigzins bruikbare SQL_mode van MySQL. Het hele idee van SQL_mode's is al fout, dat is al een lapmiddel.

#13 05-09-2010 15:44

Bekijk Post Op 05-09-2010 17:32 schreef Frank www.postgresql.org:

Weet je dat heel erg zeker? Volgens Boyd is het een fout in MySQL. Daarnaast kan IPB (nog) niet in strictmode werken, de enig enigzins bruikbare SQL_mode van MySQL. Het hele idee van SQL_mode's is al fout, dat is al een lapmiddel.
Het was de bedoeling dat de eerste postdatum van iemand diegene's "registratiedatum" zou worden: dat is niet helemaal goed gegaan. Dat er 1-1-1970 staat, ja, dat is MySQL's schuld, maar die datum had niet die moeten zijn. ;-)

#14 05-09-2010 16:58
  • manu hobert
  • Groep: Forumleden
  • Posts: 54
  • Actief sinds: 03-09-2010
Kan iemand helpen om mijn script sneller te maken ???

Albert Einstein zei:

A person who never made a mistake never tried anything new.

#15 05-09-2010 17:03
Pi is een constante, dus waarom gebruik je de constante niet?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$pi = 
3,14159 26535 89793 23846 26433 83279 50288 41971 69399 37510
  58209 74944 59230 78164 06286 20899 86280 34825 34211 70679
  82148 08651 32823 06647 09384 46095 50582 23172 53594 08128
  48111 74502 84102 70193 85211 05559 64462 29489 54930 38196
  44288 10975 66593 34461 28475 64823 37867 83165 27120 19091

  45648 56692 34603 48610 45432 66482 13393 60726 02491 41273
  72458 70066 06315 58817 48815 20920 96282 92540 91715 36436
  78925 90360 01133 05305 48820 46652 13841 46951 94151 16094
  33057 27036 57595 91953 09218 61173 81932 61179 31051 18548
  07446 23799 62749 56735 18857 52724 89122 79381 83011 94912

  98336 73362 44065 66430 86021 39494 63952 24737 19070 21798
  60943 70277 05392 17176 29317 67523 84674 81846 76694 05132
  00056 81271 45263 56082 77857 71342 75778 96091 73637 17872
  14684 40901 22495 34301 46549 58537 10507 92279 68925 89235
  42019 95611 21290 21960 86403 44181 59813 62977 47713 09960

  51870 72113 49999 99837 29780 49951 05973 17328 16096 31859
  50244 59455 34690 83026 42522 30825 33446 85035 26193 11881
  71010 00313 78387 52886 58753 32083 81420 61717 76691 47303
  59825 34904 28755 46873 11595 62863 88235 37875 93751 95778
  18577 80532 17122 68066 13001 92787 66111 95909 21642 01989;


Decimalen genoeg? :P

EDIT: http://tweakers.net/nieuws/68986/

#16 05-09-2010 17:05
  • manu hobert
  • Groep: Forumleden
  • Posts: 54
  • Actief sinds: 03-09-2010
vraag 1 : omdat ik gewoon zoveel mogelijk decimalen wil berekenen.
vraag 2 : nee.

Albert Einstein zei:

A person who never made a mistake never tried anything new.

#17 05-09-2010 21:29
zelf gebruik ik dit :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
function bcpi($precision){
    $num = 0;$k = 0;
    bcscale($precision+3);
    $limit = ($precision+3)/14;
    while($k < $limit){
        $num = bcadd($num,bcdiv(bcmul(bcadd('13591409',bcmul('545140134', $k)),bcmul(bcpow(-1, $k), bcfact(6*$k))),bcmul(bcmul(bcpow('640320',3*$k+1),bcsqrt('640320')), bcmul(bcfact(3*$k), bcpow(bcfact($k),3)))));
    ++$k;
}
return bcdiv(1,(bcmul(12,($num))),$precision);
}

function bcfact($n){
  return ($n == 0 || $n== 1) ? 1 : bcmul($n,bcfact($n-1));
}


echo bcpi(5000);
?>


bij de echo bcpi(hoeveel decimalen);

#18 06-09-2010 16:38
  • manu hobert
  • Groep: Forumleden
  • Posts: 54
  • Actief sinds: 03-09-2010

Bekijk Post Op 05-09-2010 23:29 schreef Nathan van der Werf:

zelf gebruik ik dit :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
function bcpi($precision){
    $num = 0;$k = 0;
    bcscale($precision+3);
    $limit = ($precision+3)/14;
    while($k < $limit){
        $num = bcadd($num,bcdiv(bcmul(bcadd('13591409',bcmul('545140134', $k)),bcmul(bcpow(-1, $k), bcfact(6*$k))),bcmul(bcmul(bcpow('640320',3*$k+1),bcsqrt('640320')), bcmul(bcfact(3*$k), bcpow(bcfact($k),3)))));
    ++$k;
}
return bcdiv(1,(bcmul(12,($num))),$precision);
}

function bcfact($n){
  return ($n == 0 || $n== 1) ? 1 : bcmul($n,bcfact($n-1));
}


echo bcpi(5000);
?>


bij de echo bcpi(hoeveel decimalen);
weet je toevallig welk algoritme dit is ?

Albert Einstein zei:

A person who never made a mistake never tried anything new.

#19 06-09-2010 16:44
http://www.skindo.nl...s-achter-komma/

Hier een stukje waarin staat men 90 dagen bezig is geweest om een "record-aantal" cijfers achter de komma te berekenen.

Behalve dat je in 99,9999999999999% van de gevallen nooit zoveel getallen nodig hebt, is het ook veel eenvoudiger om de reeds bekende cijfers te gebruiken.

Of wil je zelf ook een recordpoging doen?

#20 06-09-2010 17:15
  • manu hobert
  • Groep: Forumleden
  • Posts: 54
  • Actief sinds: 03-09-2010
niet bepaald een recordpoging maar ik wil gewoon een zo snel en zo goed mogelijk script maken om Pi t berekenen.
omdat wiskunde en programmeren mijn hobby's zij :)

Albert Einstein zei:

A person who never made a mistake never tried anything new.

#21 07-09-2010 01:34
  • Taco V
  • Groep: Moderators
  • Posts: 798
  • Actief sinds: 12-08-2008
Ik heb je dubbelposts gedeleted. Voortaan niet 10 keer op 'Post' klikken aub ;)

Overigens, als je echt snel veel decimalen van pi wil berekenen, zit je natuurlijk met PHP aan het verkeerde adres. Pak dan C ofzo...

#22 07-09-2010 06:38
  • Taco V
  • Groep: Moderators
  • Posts: 798
  • Actief sinds: 12-08-2008
Hm, ik snap dat je het leuk vindt dat je scriptje werkt, maar om het nu in de script library te zetten? Je geeft zelf toe dat het geen praktisch nut heeft, dat je het alleen voor de lol doet. Zie ook de huisregels trouwens.

Had je deze pagina al gezien trouwens?
http://mgccl.com/200...hp-calculate-pi
Hij heeft ook meerdere algoritmes voor het berekenen van pi geprobeerd, misschien interessant voor je.

#23 07-09-2010 17:11
  • manu hobert
  • Groep: Forumleden
  • Posts: 54
  • Actief sinds: 03-09-2010
ja, maar het is natuurlijk altijd leuker om er zelf een te maken :)...

Albert Einstein zei:

A person who never made a mistake never tried anything new.

#24 10-09-2010 14:13
  • Tjibbe
  • Groep: Forumleden
  • Posts: 47
  • Actief sinds: 21-12-2003
haha succes!

record staat op 2700 mld > http://welingelichte...n-gebroken.html

#25 10-09-2010 15:08
  • manu hobert
  • Groep: Forumleden
  • Posts: 54
  • Actief sinds: 03-09-2010
...en niet om records te breken...

Albert Einstein zei:

A person who never made a mistake never tried anything new.

#26 11-09-2010 03:31
  • Taco V
  • Groep: Moderators
  • Posts: 798
  • Actief sinds: 12-08-2008
Wat flauw dat het gebruikte algoritme niet in het artikel staat. Was een leuk uitgangspunt geweest lijkt me.


Inloggen wachtwoord vergeten? Aanmelden