PX : code

PI calculator collection by Hamish Milne
Download this code


<?php
/*
Pi calculation
Function List:
pi_gregory_leibnez_float():
 Gregory-Leibnez Series in standard float.
 PI/4=1-1/3+1/5-1/7+1/9...
pi_gregory_leibnez_bc():
 Gregory-Leibnez Series in BCMath.
 PI/4=1-1/3+1/5-1/7+1/9...
pi_wallis_float():
 Wallis Series in standard float.
 PI/2=((2*2)/(1*3))*((4*4)/(3*5))*((6*6)/(5*7))...
pi_wallis_bc():
 Wallis Series in BCMath.
 PI/2=((2*2)/(1*3))*((4*4)/(3*5))*((6*6)/(5*7))...
 WARNING: Sometimes gives 0.0000... as answer and increaces execution time by ~5 seconds.
pi_reimann_float():
 Reimann Series in standard float.
 (PI*PI)/6=1+1/(2*2)+1/(4*4)+1/(6*6)...
pi_reimann_bc():
 Reimann Series in BCMath.
 (PI*PI)/6=1+1/(2*2)+1/(4*4)+1/(6*6)...
 WARNING: Usuallu good answers but sometimes gives several 'Division by zero' errors. Could be somved by muting the bcdiv().
Parameters:
$prescision : The number of iterations. Higher the better. Roughly 1 second per 500000 for float, 25000 for BCMath.
$digits (131087 for float) : The number of decimal places to calculate to. Does not alter time taken for float. Default is max value.
$stop_timeout (0) : Set to TRUE to prevent timeout.
$record_time (0) : Sets array key '1' to the number of seconds taken for the actual working out.

Made by Hamish Milne
*/
function pi_gregory_leibniz_float($t,$g=131087,$e=0,$s=0){
    for(
$m=time(),ini_set('precision',$g),$i=0,$p=1,$n=3,$a=0;$i<$t;$n++,$n++,$i++){
        if(
$a){
            
$p+=1/$n;
            
$a=0;
        }else{
            
$p-=1/$n;
            
$a=1;
        }
        if((
time()-$m)>25 && $e){
            
set_time_limit(30);
        }
    }
    if(
$s){
        return array(
$p*4,time()-$m);
    }else{
        return 
$p*4;
    }
}
function 
pi_gregory_leibniz_bc($t,$g,$e=0,$s=0){
    for(
$m=time(),bcscale($g),$i=0,$p=1,$n=3,$a=0;$i<$t;$n++,$n++,$i++){
        if(
$a){
            
$p=bcadd($pbcdiv(1$n));
            
$a=0;
        }else{
            
$p=bcsub($pbcdiv(1$n));
            
$a=1;
        }
        if((
time()-$m)>25 && $e){
            
set_time_limit(30);
        }
    }
    if(
$s){
        return array(
bcmul($p4),time()-$m);
    }else{
        return 
bcmul($p4);
    }
}
function 
pi_wallis_float($t,$g=131087,$e=0,$s=0){
    for(
ini_set('precision',$g),$m=time(),$p=4/3,$n=4,$i=0;$t>$i;$i++,$p=$p*(($n*$n)/(($n-1)*($n+1))),$n=$n+2){
        if((
time()-$m)>25 && $e){
            
set_time_limit(30);
        }
    }
    if(
$s){
        return array(
$p*2,time()-$m);
    }else{
        return 
$p*2;
    }
}
function 
pi_wallis_bc($t,$g,$e=0,$s=0){
    for(
bcscale($g),$m=time(),$p=bcdiv(43),$n=4,$i=0;$t>$i;$i++,$p=bcmul($pbcdiv($n*$n, ($n-1)*($n+1)))){
        if((
time()-$m)>25 && $e){
            
set_time_limit(30);
        }
    }
    if(
$s){
        return array(
bcmul($p,2),time()-$m);
    }else{
        return 
bcmul($p,2);
    }
}
function 
pi_reimann_float($t,$g=131087,$e=0,$s=0){
    for(
ini_set('precision',$g),$m=time(),$p=1,$n=2,$i=0;$t>$i;$i++,$p=$p+(1/($n*$n)),$n++){
        if((
time()-$m)>25 && $e){
            
set_time_limit(30);
        }
    }
    if(
$s){
        return array(
sqrt($p*6),time()-$m);
    }else{
        return 
sqrt($p*6);
    }
}
function 
pi_reimann_bc($t,$g,$e=0,$s=0){
    for(
bcscale($g),$m=time(),$p=1,$n=2,$i=0;$t>$i;$i++,$p=bcadd($p,/*Replace with @ to solve problem*/bcdiv(1,$n*$n)),$n++){
        if((
time()-$m)>25 && $e){
            
set_time_limit(30);
        }
    }
    if(
$s){
        return array(
bcsqrt(bcmul($p,6)),time()-$m);
    }else{
        return 
bcsqrt(bcmul($p,6));
    }
}
?>

Comments or questions?
PX is running PHP 5.2.17
Thanks to Miranda Productions for hosting and bandwidth.
Use of any code from PX is at your own risk.