文字

Math 函数

Table of Contents

  • abs — 绝对值
  • acos — 反余弦
  • acosh — 反双曲余弦
  • asin — 反正弦
  • asinh — 反双曲正弦
  • atan2 — 两个参数的反正切
  • atan — 反正切
  • atanh — 反双曲正切
  • base_convert — 在任意进制之间转换数字
  • bindec — 二进制转换为十进制
  • ceil — 进一法取整
  • cos — 余弦
  • cosh — 双曲余弦
  • decbin — 十进制转换为二进制
  • dechex — 十进制转换为十六进制
  • decoct — 十进制转换为八进制
  • deg2rad — 将角度转换为弧度
  • exp — 计算 e 的指数
  • expm1 — 返回 exp(number) - 1,甚至当 number 的值接近零也能计算出准确结果
  • floor — 舍去法取整
  • fmod — 返回除法的浮点数余数
  • getrandmax — 显示随机数最大的可能值
  • hexdec — 十六进制转换为十进制
  • hypot — 计算一直角三角形的斜边长度
  • intdiv — Integer division
  • is_finite — 判断是否为有限值
  • is_infinite — 判断是否为无限值
  • is_nan — 判断是否为合法数值
  • lcg_value — 组合线性同余发生器
  • log10 — 以 10 为底的对数
  • log1p — 返回 log(1 + number),甚至当 number 的值接近零也能计算出准确结果
  • log — 自然对数
  • max — 找出最大值
  • min — 找出最小值
  • mt_getrandmax — 显示随机数的最大可能值
  • mt_rand — 生成更好的随机数
  • mt_srand — 播下一个更好的随机数发生器种子
  • octdec — 八进制转换为十进制
  • pi — 得到圆周率值
  • pow — 指数表达式
  • rad2deg — 将弧度数转换为相应的角度数
  • rand — 产生一个随机整数
  • round — 对浮点数进行四舍五入
  • sin — 正弦
  • sinh — 双曲正弦
  • sqrt — 平方根
  • srand — 播下随机数发生器种子
  • tan — 正切
  • tanh — 双曲正切

用户评论:

[#1] Aiden880 [2015-03-28 01:47:31]

Lowest Common Denominator:
function lcd($num, $start) {
while($num % $start != 0) {
$start++;
}
return $start;
}

[#2] capripot at gmail dot com [2012-07-18 21:48:09]

Another simpler function to check a number with the luhn algorithm :

<?php
function luhn($num){
    if(!
$num)
        return 
false;
    
$num array_reverse(str_split($num));
    
$add 0;
    foreach(
$num as $k => $v){
        if(
$k%2)
            
$v $v*2;
        
$add += ($v >= 10 $v $v);
    }
    return (
$add%10 == 0);
}
?>


Don't know if foreach and arrays operations are faster than while and substr, but I feel it clearer.

[#3] AsherMaximum gmail [2011-04-18 21:40:55]

Here's a simple way way to convert a number to an ordinal number I created:

$i == the number to convert. Put this inside a for loop if you need to populate an array.

<?php
// change increment variable to ordinal number.
$n1 $i 100//first remove all but the last two digits

$n2 = ($n1 20 ? $$i 10//remove all but last digit unless the number is in the teens, which all should be 'th'

//$n is now used to determine the suffix.
$ord = ($n2==$i.'st' : ( ($n2==$i.'nd' : ($n2==$i.'rd' $i.'th') ) ) )
?>

[#4] php at keith tyler dot com [2010-11-04 11:09:18]

Another ordinal method, which does not involve utilizing date functions:

<?php
sprintf
"%d%s"$tarray_poparray_slicearray_merge( array( "th","st","nd","rd"), array_fill4,6,"th")), $t%101)));'
?>

[#5] rubo77 at spacetrace dot org [2008-07-28 07:39:04]

<?php 
function lcd($n,$m$maxvarianzpercent=0){
    
// set $maxvarianzpercent=5 to get a small, but approx. result
    
    // ATTENTION!!! can be really slow if $m is >1000
    
    
$d=$n/$m;
    
$f=1;
    while(
$d*$f!=intval($d*$f)){
        
$f++;
    }
    
$r=($d*$f).'/'.$f;
    if((
$d*$f)<=10 or $f<=10) return $r;
    else if(
$maxvarianzpercent>0){
        
$f=1;
        while(
$d*$f!=intval($d*$f) and ($d*$f)-intval($d*$f) > $maxvarianzpercent/100){
            
$f++;
        }
        return 
intval($d*$f).'/'.$f;
    } else return 
$r;
}
?>

[#6] lummox [2008-02-02 07:24:56]

Wouldn't the following function do the same but a lot easier than the one in the comment before?

function trimInteger($targetNumber,$newLength) {
    return $targetNumber%pow(10,$newLength); 
}

[#7] Mike [2008-01-09 19:23:33]

//had a mistake in last post, heres the corrected version



function trimInteger($targetNumber,$newLength) {

    $digits = pow(10,$newLength);

    $s = ($targetNumber/ $digits); //make the last X digits the                  decimal part

    $t = floor($targetNumber / $digits); //drop the last X digits (the decimal part)

    $h = $s - $t; //remove all  but the decimal part

    $newInteger = ($h*$digits); //make the everything after the decimal point the new number

    return $newInteger;
}

[#8] ddarjany at yahoo dot com [2007-09-05 10:25:15]

Tim's fix of Evan's ordinal function causes another problem, it no longer works for number above 100.  (E.g. it returns 111st instead of 111th).  
Here is a further modified version which should work for all numbers.

<?PHP

function ordinal($cardinal)    {
  
$cardinal = (int)$cardinal;
  
$digit substr($cardinal, -11);

  if (
$cardinal <100$tens round($cardinal/10);
  else 
$tens substr($cardinal, -21);

  if(
$tens == 1)  {
    return 
$cardinal.'th';
  }

  switch(
$digit) {
    case 
1:
      return 
$cardinal.'st';
    case 
2:
      return 
$cardinal.'nd';
    case 
3:
      return 
$cardinal.'rd';
    default:
      return 
$cardinal.'th';
  }
}
 
?>

[#9] barry at megaspace dot com [2006-12-02 09:14:13]

Here's a least common denominator (lcd) function:

$array = array(3,4,6,8,18,2);

function lcd($array,$x) {

$mod_sum = 0;

for($int=1;$int < count($array);$int++) {
$modulus[$int] = ($array[0]*$x) % ($array[$int]);
$mod_sum = $mod_sum + $modulus[$int];
}
 
if (!$mod_sum) {
echo "LCD: ".($array[0]*$x)."\n";
}

else {
lcd($array,$x+1);
}

}

lcd($array,1);

[#10] tembenite at gmail dot com [2006-11-06 13:36:18]

To add to what Cornelius had, I have written a function that will take an array of numbers and return the least common multiple of them:

function lcm_arr($items){
//Input: An Array of numbers
//Output: The LCM of the numbers
while(2 <= count($items)){
array_push($items, lcm(array_shift($items), array_shift($items)));
}
return reset($items);
}

//His Code below with $'s added for vars

function gcd($n, $m) {
   $n=abs($n); $m=abs($m);
   if ($n==0 and $m==0)
       return 1; //avoid infinite recursion
   if ($n==$m and $n>=1)
       return $n;
   return $m<$n?gcd($n-$m,$n):gcd($n,$m-$n);
}

function lcm($n, $m) {
   return $m * ($n/gcd($n,$m));
}

[#11] tim at durge dot org [2006-10-27 05:51:04]

In Evan's ordinal function, the line:

<?php
  $tens 
substr($cardinal, -21);
?>


needs to be replaced by:

<?php
  $tens 
round($cardinal/10);
?>


or similar. At least on PHP 4.3.10,  substr("1", -2, 1)  returns '1' - so Evan's function gives "1th", as well as "11th".  This is contrary to the documentation, but is noted in the comments on the substr manual page.

[#12] Evan Broder [2006-07-26 11:42:56]

A slightly more complex but much more accurate cardinal=>ordinal function (the one below doesn't account for 11th, 12th, and 13th, which don't follow the usual rules):

<?php

    
function ordinal($cardinal)
    {
        
$cardinal = (int)$cardinal;
        
$digit substr($cardinal, -11);
        
$tens substr($cardinal, -21);
        if(
$tens == 1)
        {
            return 
$cardinal.'th';
        }
        
        switch(
$digit)
        {
        case 
1:
            return 
$cardinal.'st';
        case 
2:
            return 
$cardinal.'nd';
        case 
3:
            return 
$cardinal.'rd';
        default:
            return 
$cardinal.'th';
        }
    }

?>

[#13] edward at edwardsun dot com [2006-07-19 18:24:11]

well just a note.. maybe i'm a bit stupid.. but remember to use pow() rather than the "^" sign for exponents.. as it took me 5 minutes to figure out why it wasn't working.

[#14] twoscoopsofpig at NOSPAM dot gmail dot com [2006-07-07 09:07:14]

@ Moikboy:

This may or may not be more simplified factorialization:

<?php
$f
=$fact=25;
while (
$fact>0)
{
$f=$f*$fact--;}
echo 
$f;
?>

[#15] marasek.SPAMLESS at telton.de [2006-06-08 05:23:15]

I could not resist to do a simpler version of the ordinal function:
<?php
function ordinal($num)
{
    
$num = (int)$num;
    
$digit substr($num, -11);
    
$ord "th";
    switch(
$digit)
    {
        case 
1$ord "st"; break;
        case 
2$ord "nd"; break;
        case 
3$ord "rd"; break;
    break;
    }
return 
$num.$ord;
}
?>

One could replace the typecast with

<?php
if($num===NULL or $num==="")
{return 
NULL;}
?>


to get an empty result instead of "0th" in case $num is empty too.

[#16] moikboy (nospam!) moikboy (nospam!) hu [2006-05-10 01:15:36]

I think, this is the optimal code for calculating factorials:

<?php
function fact($int){
    if(
$int<2)return 1;
    for(
$f=2;$int-1>1;$f*=$int--);
    return 
$f;
};
?>


And another one for calculating the $int-th Fibonacci-number:

<?php
function fib($int){
    static 
$fibTable=array();
    return empty(
$fibTable[$int])?$fibTable[$int] = $int>1?fib($int-2)+fib($int-1):1:$fibTable[$int];
};
?>

[#17] Florian [2006-03-03 13:36:33]

A function that simulates the sum operator. (http://en.wikipedia.org/wiki/Sum). Be careful with the expression because it may cause a security hole; note the single quotes to don't parse the "$".
<?php
# @param    string    $expr    expression to evaluate (for example (2*$x)^2+1)
# @param    string    $var      dummy variable (for example "x")
# @param    integer    $start
# @param    integer    $end
# @param    integer    $step

function sum($expr,$var,$start,$end,$step 1) {
    
$expr str_replace(';','',$expr);
    
$var str_replace('$','',$var);
    
$start = (int)$start;    $end = (int)$end;    $step = (int)$step;    $sum 0;
    
    for (
$i $start$i <= $end$i $i $step) {
        
$_expr str_replace('$'.$var,$i,$expr);    
        
$_eval '$_result = '.$_expr.'; return $_result;';
        
$_result = eval($_eval);
        if(
$result === FALSE) return "SYNTAX ERROR : $expr";
        
$sum += $_result;
    }
    return (int)
$sum;
}
?>

[#18] jos at gtacrime dot nl [2006-02-17 01:39:05]

Thanks to Chronial "at" cyberpunkuniverse.de, I was able to create the binompdf(n, p, k) function.

<?php
function nCr($n$k){
   if (
$k $n)
     return 
NaN;
   if ((
$n $k) < $k)
     return 
nCr($n, ($n $k));
   
$return 1;
   for (
$i=0$i<$k$i++){
     
$return *= ($n $i) / ($i 1);
   }
   return 
$return;


function 
binompdf($n$p$k){
    
$return nCr($n$k) * pow($p$k) * pow(($p), ($n $k));
    return 
$return;
}
?>

[#19] peter-stangl at t-online dot de [2006-02-01 15:16:59]

I needed to approximate an integral because i was not able to calculate it, so i wrote this function. It approximates an integral with the composite Simpson's rule.
More information on Simpson's rule: http://en.wikipedia.org/wiki/Simpson%27s_rule

<?php

function simpsonf($x){
// returns f(x) for integral approximation with composite Simpson's rule
   
return(pow((1+pow($x, (-4))), 0.5));
}
function 
simpsonsrule($a$b$n){
// approximates integral_a_b f(x) dx with composite Simpson's rule with $n intervals
// $n has to be an even number
// f(x) is defined in "function simpsonf($x)"
   
if($n%2==0){
      
$h=($b-$a)/$n;
      
$S=simpsonf($a)+simpsonf($b);
      
$i=1;
      while(
$i <= ($n-1)){
         
$xi=$a+$h*$i;
         if(
$i%2==0){
            
$S=$S+2*simpsonf($xi);
         }
         else{
            
$S=$S+4*simpsonf($xi);
         }
         
$i++;
      }
      return(
$h/3*$S);
      }
   else{
      return(
'$n has to be an even number');
   }
}

?>

[#20] daniel at g-loc dot org [2005-12-01 10:01:46]

If you're an aviator and needs to calculate windcorrection angles and groundspeed (e.g. during flightplanning) this can be very useful.

$windcorrection = rad2deg(asin((($windspeed * (sin(deg2rad($tt - ($winddirection-180))))/$tas))));
$groundspeed = $tas*cos(deg2rad($windcorrection)) + $windspeed*cos(deg2rad($tt-($winddirection-180)));

You can probably write these lines more beautiful, but they work!

[#21] monte at ohrt dot com [2005-10-18 06:37:30]

This is an efficient method of calculating the binomial coefficient C(n,k). This code was derived from Owant: Mastering Algorithms with Perl.

<?php
   
// calculate binomial coefficient
   
function binomial_coeff($n$k) {

      
$j $res 1;

      if(
$k || $k $n)
         return 
0;
      if((
$n $k) < $k)
         
$k $n $k;

      while(
$j <= $k) {
         
$res *= $n--;
         
$res /= $j++;
      }

      return 
$res;

   }
?>


If you compiled php with --enable-bcmath, you can get full integer values of extremely large numbers by replacing:

$res *= $n--;
$res /= $j++;

with:

$res = bcmul($res, $n--);
$res = bcdiv($res, $j++);

[#22] bjcffnet at gmail dot com [2005-07-26 16:57:27]

thearbitcouncil at gmail dot com, you could just use array_sum():
<?php
function average($arr)
{
   if (!
is_array($arr)) return false;

   return 
array_sum($arr)/count($arr);
}

$array = array(51015);
echo 
average($array); // 10
?>

[#23] graywh at gmail DELETE dot com [2005-06-01 12:48:13]

If you're really concerned about speed, you could compute the factorial of large numbers using the Gamma function of n-1.

Integral y^(t-1)*Exp(-y) for y from 0 to Infinity

For Fibonacci numbers, there's a better-than-recursive way.

((1+sqrt(5))/2)^(n/sqrt(5)) - ((1-sqrt(5))/2)^(n/sqrt(5))

[#24] eric at woolhiser dot com [2005-03-10 20:41:20]

For all you guys writing mortgage calculators out there:

<?php

function payment($apr,$n,$pv,$fv=0.0,$prec=2){
    

    
    
    
if ($apr !=0) {
        
$alpha 1/(1+$apr/12);
        
$retval =  round($pv * ($alpha) / $alpha 
        (
pow($alpha,$n)),$prec) ;
    } else {
        
$retval round($pv $n$prec);
    }
    return(
$retval);

}
?>

[#25] tmpa at yahoo dot com [2005-02-19 12:42:39]

while joogat's one line function is short, it is probably better to calculate factorial iteratively instead of recursively. keep in mind if you want large factorials, you'll need to use some sort of arbitrary precision integer or perhaps the BCMath functions. then again, unless you're trying to do large numbers (170! is the highest that you can do that does not return infinity) you probably won't notice any time difference.
<?php
function factorial($in) {
    
// 0! = 1! = 1
    
$out 1;

    
// Only if $in is >= 2
    
for ($i 2$i <= $in$i++) {
        
$out *= $i;
    }

    return 
$out;
}
?>

[#26] thearbitcouncil at gmail dot com [2005-01-06 14:32:20]

Two functions I didn't find elsewhere... one to compute mean of an array of numbers, and another to computer variance of a sample of numbers. Both take an array of numbers as arguments. Not much error checking, or optimization...

(note: variance function uses the average function...)

<?php

function average($arr)
{
    if (!
count($arr)) return 0;

    
$sum 0;
    for (
$i 0$i count($arr); $i++)
    {
        
$sum += $arr[$i];
    }

    return 
$sum count($arr);
}

function 
variance($arr)
{
    if (!
count($arr)) return 0;

    
$mean average($arr);

    
$sos 0;    // Sum of squares
    
for ($i 0$i count($arr); $i++)
    {
        
$sos += ($arr[$i] - $mean) * ($arr[$i] - $mean);
    }

    return 
$sos / (count($arr)-1);  // denominator = n-1; i.e. estimating based on sample 
                                    // n-1 is also what MS Excel takes by default in the
                                    // VAR function
}

echo 
variance(array(4,6,23,15,18)); // echoes 64.7...correct value :)

?>

[#27] info at gavinvincent dot co dot uk [2004-11-17 04:34:45]

If you need to deal with polar co-ordinates for somereason you will need to convert to and from x,y for input and output in most situations: here are some functions to convert cartesian to polar and polar to cartesian
<?php
//returns array of r, theta in the range of 0-2*pi (in radians)
function rect2polar($x,$y)
{
     if(
is_numeric($x)&&is_numeric($y))
    {
        
$r=sqrt(pow($x,2)+pow($y,2));
        if(
$x==0)
        {
             if(
$y>0$theta=pi()/2;
            else 
$theta=3*pi()/2;
        }
        else if(
$x<0$theta=atan($y/$x)+pi();
        else if(
$y<0$theta=atan($y/$x)+2*pi();
        else 
$theta=atan($y/$x);
        
$polar=array("r"=>$r,"theta"=>$theta);
        return 
$polar;
    }
    else return 
false;
}

//r must be in radians, returns array of x,y
function polar2rect($r,$theta)
{
 if(
is_numeric($r)&&is_numeric($theta))
 {
        
$x=$r*cos($theta);
    
$y=$r*sin($theta);
    
$rect=array("x"=>$x,"y"=>$y);
 }
 else
 {
   return 
false;
 }
}
?>

[#28] help at gjbdesign dot com [2004-09-25 09:05:57]

Occasionally a user must enter a number in a form. This function converts fractions to decimals and leaves decimals untouched. Of course, you may wish to round the final output, but that is not included here.

<?php

function Deci_Con($q){
//check for a space, signifying a whole number with a fraction
    
if(strstr($q' ')){
        
$wa strrev($q);
        
$wb strrev(strstr($wa' '));
        
$whole true;//this is a whole number
    
}
//now check the fraction part
    
if(strstr($q'/')){
        if(
$whole==true){//if whole number, then remove the whole number and space from the calculations
              
$q strstr($q' ');
        }
$b str_replace("/","",strstr($q'/'));//this is the divisor
//isolate the numerator
$c strrev($q);
$d strstr($c'/');
$e strrev($d);
$a str_replace("/","",$e);//the pre-final numerator
        
if($whole==true){//add the whole number to the calculations
            
$a $a+($wb*$b);//new numerator is whole number multiplied by denominator plus original numerator    
        
}
$q $a/$b;//this is now your decimal
return $q;
    }else{
        return 
$q;//not a fraction, just return the decimal
    
}
}
?>

[#29] donnieb819 at hotmail dot NOSPAM dot com [2004-09-16 05:58:00]

Method to convert an arbitrary decimal number to its most reduced fraction form (so a string is returned, this method would probably be used for output formatting purposes.)  There were other methods similar to this one on the page, but none did quite what I wanted.  It's maybe not the most elegant code, but it gets the job done.  Hope this helps someone.  An iterative form of Euclid's algorithm is used to find the GCD.

<?php
function dec2frac$decimal )
{
  
$decimal = (string)$decimal;
  
$num '';
  
$den 1;
  
$dec false;
  
  
// find least reduced fractional form of number
  
for( $i 0$ix strlen$decimal ); $i $ix$i++ )
  {
    
// build the denominator as we 'shift' the decimal to the right
    
if( $dec $den *= 10;
    
    
// find the decimal place/ build the numberator
    
if( $decimal{$i} == '.' $dec true;
    else 
$num .= $decimal{$i};
  }
  
$num = (int)$num;
    
  
// whole number, just return it
  
if( $den == ) return $num;
    
  
$num2 $num;
  
$den2 $den;
  
$rem  1;
  
// Euclid's Algorithm (to find the gcd)
  
while( $num2 $den2 ) {
    
$rem $num2 $den2;
    
$num2 $den2;
    
$den2 $rem;
  }
  if( 
$den2 != $den $rem $den2;
    
  
// now $rem holds the gcd of the numerator and denominator of our fraction
  
return ($num $rem ) . "/" . ($den $rem);
}
?>


Examples:
echo dec2frac( 10 );
echo dec2frac( .5 );
echo dec2frac( 5.25 );
echo dec2frac( .333333333 );

yields:
10
1/2
21/4
333333333/1000000000

[#30] pat.mat AT sympatico DOT com [2004-06-08 19:36:45]

For people interest in Differential Equations, I've done a function that receive a string like: x^2+x^3 and put it in
2x+3x^2 witch is the differantial of the previous equation.

In the code there is one thing missing: the $string{$i} is often going outOfBound (Uninitialized string offset: 6 in...)
if your error setting is set a little too high... I just dont know how to fix this.

So there is the code for differential equation with (+ and -) only:

<?php
function differentiel($equa)
{
    
$equa strtolower($equa);
    echo 
"Equation de depart: ".$equa."<br>";
    
$final ""
    
    for(
$i 0$i strlen($equa); $i++)
    {
        
//Make a new string from the receive $equa
        
if($equa{$i} == "x" && $equa{$i+1} == "^")
        {
            
$final .= $equa{$i+2};
            
$final .= "x^";
            
$final .= $equa{$i+2}-1;
        }
        elseif(
$equa{$i} == "+" || $equa{$i} == "-")
        {
            
$final .= $equa{$i};
        }
        elseif(
is_numeric($equa{$i}) && $i == 0)
        {
            
//gerer parenthese et autre terme generaux + gerer ^apres: 2^2
            
$final .= $equa{$i}."*";
        }
        elseif(
is_numeric($equa{$i}) && $i && $equa{$i-1} != "^")
        {
            
//gerer ^apres: 2^2
            
$final .= $equa{$i}."*";
        }
        elseif(
$equa{$i} == "^")
        {
            continue;
        }
        elseif(
is_numeric($equa{$i}) && $equa{$i-1} == "^")
        {
            continue;
        }
        else
        {
            if(
$equa{$i} == "x")
            {
                
$final .= 1;
            }
            else
            {
                
$final .= $equa{$i}; 
            }
        }
    }
    
//
    //Manage multiplication add in the previous string $final
    //
    
$finalMul "";
    for(
$i 0$i strlen($final); $i++)
    {
        if(
is_numeric($final{$i}) && $final{$i+1} == "*" && is_numeric($final{$i+2}))
        {
            
$finalMul .= $final{$i}*$final{$i+2};
        }
        elseif(
$final{$i} == "*")
        {
            continue;
        }
        elseif(
is_numeric($final{$i}) && $final{$i+1} != "*" && $final{$i-1} == "*")
        {
            continue;
        }
        else
        {
            
$finalMul .= $final{$i};    
        }
    }
    echo 
"equa final: ".$finalMul;
}
?>


I know this is not optimal but i've done this quick :)
If you guys have any comment just email me.
I also want to do this fonction In C to add to phpCore maybe soon...
Patoff

[#31] ausvald at tut dot by [2004-04-30 17:48:28]

I see there are some factorial functions below.

I'll provide the best one:

<?php
function factorial($n){ $n=(int)$n;
  
$f=1;
  for(;
$n>0;--$n$f*=$n;
  return 
$f;
}
?>

[#32] florian at shellfire dot de [2004-04-28 14:48:36]

Please note that shorter is not always better
(meaning that really short faculty implementation above).

In my opinion, a clearer way to code this is, including a check
for negative or non-integer values.

In order to calculate the faculty of a positive integer,
an iterative way (which might be harder to understand)
is usually a bit faster, but I am using it only for small
values so it is not really important to me:

<?php

    
// Calculate the Faculty of a positive int-value
    
function iFaculty($a_iFac)
    {
      if (
$a_iFac 0)
      { 
          return 
$a_iFac $this->iFaculty($a_iFac 1);
      }
      elseif (
$a_iFac == 0)
      { 
          return 
1;
      }
      else
      {
          return 
0;  // Wrong argument!
      
}
    } 
?>


I've also written another function to calculate the
binomial coefficient of 2 values, I didn't find it anywhere yet so I hope it might help someone (works fine with the above stated faculty-function and ready to be used inside of your own classes!)

<?php

    
// calculates the binomial coefficient "n over k" of 2 positive int values
    // for n >= k
    
function iBinCoeff($a_iN$a_iK)
    {
        
// the binomial coefficient is defined as n! / [ (n-k)! * k! ]
        
return $this->iFaculty($a_iN) / ($this->iFaculty($a_iN $a_iK) * $this->iFaculty($a_iK));    
    } 

?>

[#33] Chronial "at" cyberpunkuniverse.de [2004-01-13 13:47:57]

Here are are a nPr and a nPc function
(had to define NaN - don't know, how to this the "rigth" way)

<?php
define 
(NaN,acos(1.01));

function 
nCr($n,$r){
   if (
$r $n)
      return 
NaN;
   if ((
$n-$r) < $r)
      return 
nCr($n,($n-$r));
   
$return 1;
   for (
$i=0;$i $r;$i++){
      
$return *= ($n-$i)/($i+1);
   }
   return 
$return;
}

function 
nPr($n,$r){
   if (
$r $n)
      return 
NaN;
   if (
$r)
      return 
$n*(nPr($n-1,$r-1));
   else
      return 
1;
}
?>

[#34] chris at free-source dot com [2003-10-07 09:37:15]

to "convert" scientific notation to a float simply cast it:
<?php
$val 
'3.5e4';
$val = (float) $val;
echo 
$val;
?>


output:
35000

[#35] jl85 at yahoo dot com [2003-10-05 04:00:46]

Here's yet another greatest common denominator (gcd) function, a reeeeally small one.

function gcd($n,$m){
if(!$m)return$n;return gcd($m,$n%$m);
}

It works by recursion. Not really sure about it's speed, but it's really small! This won't work on floating point numbers accurately though. If you want a floating point one, you need to have at least PHP 4, and the code would be

function gcd($n,$m){
if(!$m)return$n;return gcd($m,fmod($n,$m));
}

[#36] fabien_mornand at yahoo dot fr [2003-09-30 15:46:13]

here is an algorithm to calculate gcd of a number. This is Euclid algorithm i was studying in Maths. I've converted it in php for the fun.

<?php
 
if($a && $b)
  { 
$ax=$a$bx=$b;
   
$r=fmod($a,$b);
  if(!
$r){$rx=$r;}
   while(
$r){
    
$rx=$r;
    
$a=$b;
    
$b=$r;
    
$r=fmod($a,$b);
    }
   }
echo 
'PGCD ('.$ax.' , '.$bx.' ) = '.$rx;
?>

[#37] jordanolsommer at imap dot cc [2003-08-27 08:07:24]

The reason the bitwise AND ("&") operator works to determine whether a number is odd or even is because odd numbers expressed in binary always have the rightmost (2^0) bit = 1 and even numbers always have the 2^0 bit = 0. 

So if you do a " 1 & $num", it will return zero if the number is even (since xxxxxxx0 [the even number in binary] and 00000001 [the 1]) don't share any bits, and will return 1 if the number is odd (xxxxxx1 and 000001).

a clever way of doing things, but $num % 2 would work as well i think :).

[#38] matthew_gaddis at yahoo dot com [2003-04-24 14:23:08]

Here is a cleaner factorial function:

function factorial($s){
if($s) $r = $s * factorial($s - 1);
else $r = 1;
return $r;
}

[#39] jerry dot wilborn at fast dot net [2003-04-16 11:10:41]

Here is how to calculate standard deviation in PHP where $samples is an array of incrementing numeric keys and the values are your samples:

$sample_count = count($samples);

for ($current_sample = 0; $sample_count > $current_sample; ++$current_sample) $sample_square[$current_sample] = pow($samples[$current_sample], 2);

$standard_deviation = sqrt(array_sum($sample_square) / $sample_count - pow((array_sum($samples) / $sample_count), 2));

[#40] jl85 at yahoo dot com [2003-02-22 08:04:18]

Theres another faster way of doing even/odd number checking by using bitwise operators. Don't ask me how it works, I just found this out by experimenting with it (could the editor possibly explain?)

if ((1&$num)) {
 echo "$num is odd";
}

if (!(1&$num)) {
 echo "$num is even";
}

How it works is (1&$num) returns a 1 for odd numbers and returns 0 when it's an even number.

[#41] nazgul26 (at_sign) windfox dot net [2002-12-08 14:58:00]

This code will convert a decimal to it's fraction equivalent. The precision can be set by changing PRECISION.

<?php
define
(PRECISION.01);

$count=0;
$result=array();
decimalToFraction($_REQUEST['dec'],$count,&$result);
$count count($result);
$simp_fract simplifyFraction($result,$count,1,$result[$count]);

echo 
$simpl_fract;

// Start of functions


function decimalToFraction($decimal,$count,$result) {
    
$a = (1/$decimal);
    
$b = ( $a floor($a)  );
    
$count++;
    if (
$b .01 && $count <= 5decimalToFraction($b,$count,&$result);
    
$result[$count] = floor($a);
}


function simplifyFraction($fraction,$count,$top,$bottom) {
    
$next $fraction[$count-1];
    
$a = ($bottom $next) + $top;
    
$top $bottom;
    
$bottom $a;
    
$count--;
    if (
$count 0simplifyFraction($fraction,$count,$top,$bottom);
    else {
        return 
"<font size=1>$bottom/$top</font>";
    }
}
?>

[#42] jbeardsl at gte dot net [2002-11-09 10:36:06]

I needed a truncate function to operate on real numbers. I preferred not to use a string-manipulation method, so here's my solution. HTH...

function truncate ($num, $digits = 0) {

    //provide the real number, and the number of 
    //digits right of the decimal you want to keep.

    $shift = pow(10 , $digits);
    return ((floor($num * $shift)) / $shift);

}

[#43] jbeardsl [found_at] gte [d0t] net [2002-11-08 13:15:03]

I was looking for a truncate function. Not finding one, I wrote my own. Since it deals with everything as a number, I imagine it's faster than the alternative of using string functions. HTH...

<?php
function truncate ($num$digits 0) {

    
//provide the real number, and the number of 
    //digits right of the decimal you want to keep.

    
$shift pow(10$digits);
    return ((
floor($num $shift)) / $shift);
}
?>

[#44] patience at worldonline dot nl [2002-08-05 09:08:05]

The example for Factorials given above is wrong. Here a correct version, so that you do not have to reinvent the wheel again...

<?php
function mathFact$s )
{
  
$r = (int) $s;

  if ( 
$r )
    
$r 1;
  else {
    for ( 
$i $r-1$i 1$i-- )
      
$r $r $i;
  }

  return( 
$r );
}
?>

[#45] shanx at shanx dot com [2002-07-08 13:13:03]

<?php


 
function base36($value$base
{
    
$baseChars = array('0''1''2''3''4''5',
                       
'6''7''8''9''a''b',
                       
'c''d''e''f''g''h',
                       
'i''j''k''l''m''n',
                       
'o''p''q''r''s''t',
                       
'u''v''w''x''y''z'
                     
);

    
$remainder 0;
    
$newval "";
    
    while ( 
$value 
    {
        
$remainder $value $base;
        
$value = ( ($value $remainder)/ $base );
        
$newval .= $baseChars[$remainder];
    }
    return 
strrev($newval);
    
}

echo 
"The string for 46655, for instance, is " base36(4665536);

?>

[#46] webkid%webkid.com [2002-05-31 15:54:02]

And the reason I needed a Factorial function is because I there were no nPr or nCr functions native to PHP, either.

function n_pick_r($n,$r){$n=(int)$n; $r=(int)$r;return (fact($n)/fact($n-$r));}
function n_choose_r($n,$r){$n=(int)$n; $r=(int)$r;return (n_pick_r($n,$r)/fact($r));}

Hope that helps someone!

[#47] webkid%webkid.com [2002-05-31 15:49:40]

I found it kind of irritating that PHP had no native functionality for a calculating Factorials. Since I really didn't feel like loading the GMP library, I figured I'd write my own function.

function fact($s){$r=(int)$s; for ($i=$r;$i--;$i>1){$r=$r*$i;} return $r;}

I think that's right... I havn't tested it extensively but it should work.

[#48] cornelius at skjoldhoej dot dk [2001-06-12 14:03:38]

I found that when dealing with tables, a 'least common multiple' function is sometimes useful for abusing tablespan and the likes.

So here goes (you may choose to remove the first part of the gcd function if the function call is well-behaved):

<?php
function gcd(nm//greatest common divisor
{
    
n=abs(n); m=abs(m);
    if (
n==and m==0)
        return 
1//avoid infinite recursion
    
if (n==and n>=1)
        return 
n;
    return 
m<n?gcd(n-m,n):gcd(n,m-n);
}

function 
lcm(nm//least common multiple
{
    return 
m*(n/gcd(n,m));
}
?>


This may or may not be something to consider adding to the mathematical function library.

[#49] ian at mp3 dot com [2001-02-19 15:43:02]

for those looking for a credit card verification function i wrote a simple LUHN Formula algorithm:

<?php
$valid 
1;

$numOfDigits strlen($ccNumber);

$i = -1;
while (
$i>=$numOfDigits){
  if ((
$i 2) == 0){
    
$double 2*(substr($ccNumber$i1));
    
$total += substr($double,0,1);
    if (
strlen($double 1)){
      
$total += substr($double,1,1);
    }
  } else {
    
$total += substr($ccNumber$i1);
  }
  
$i--;
}

if ((
$total 10) != 0){
  
$valid 0;
}
?>

上一篇: 下一篇: