Math Functions

Table of Contents

  • abs — Absolute value
  • acos — Arc cosine
  • acosh — Inverse hyperbolic cosine
  • asin — Arc sine
  • asinh — Inverse hyperbolic sine
  • atan — Arc tangent
  • atan2 — Arc tangent of two variables
  • atanh — Inverse hyperbolic tangent
  • base_convert — Convert a number between arbitrary bases
  • bindec — Binary to decimal
  • ceil — Round fractions up
  • cos — Cosine
  • cosh — Hyperbolic cosine
  • decbin — Decimal to binary
  • dechex — Decimal to hexadecimal
  • decoct — Decimal to octal
  • deg2rad — Converts the number in degrees to the radian equivalent
  • exp — Calculates the exponent of e
  • expm1 — Returns exp($num) - 1, computed in a way that is accurate even when the value of number is close to zero
  • fdiv — Divides two numbers, according to IEEE 754
  • floor — Round fractions down
  • fmod — Returns the floating point remainder (modulo) of the division of the arguments
  • hexdec — Hexadecimal to decimal
  • hypot — Calculate the length of the hypotenuse of a right-angle triangle
  • intdiv — Integer division
  • is_finite — Checks whether a float is finite
  • is_infinite — Checks whether a float is infinite
  • is_nan — Checks whether a float is NAN
  • log — Natural logarithm
  • log10 — Base-10 logarithm
  • log1p — Returns log(1 + number), computed in a way that is accurate even when the value of number is close to zero
  • max — Find highest value
  • min — Find lowest value
  • octdec — Octal to decimal
  • pi — Get value of pi
  • pow — Exponential expression
  • rad2deg — Converts the radian number to the equivalent number in degrees
  • round — Rounds a float
  • sin — Sine
  • sinh — Hyperbolic sine
  • sqrt — Square root
  • tan — Tangent
  • tanh — Hyperbolic tangent
add a note

User Contributed Notes 26 notes

up
12
pat.mat AT sympatico DOT com
20 years ago
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:

<?
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 > 0 && $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
up
5
daniel at g-loc dot org
18 years ago
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!
up
3
lummox
16 years ago
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);
}
up
0
info at gavinvincent dot co dot uk
19 years ago
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
<?
//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;
}
}
?>
up
-1
Anonymous
6 years ago
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!
exmple:https://vb.3dlat.com/
up
-2
php at keith tyler dot com
13 years ago
Another ordinal method, which does not involve utilizing date functions:

<?php
sprintf
( "%d%s", $t, array_pop( array_slice( array_merge( array( "th","st","nd","rd"), array_fill( 4,6,"th")), $t%10, 1)));'
?>
up
-2
Mike
16 years ago
//had a mistake in last post, heres the corrected version

/*
Just a simple function to trim digits from the left side of an integer. TRIM DOWN TO 4-> (ie. 987654 => 7654)
*/

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;
}
up
-2
florian at shellfire dot de
20 years ago
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));
}

?>
up
-3
capripot at gmail dot com
12 years ago
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 - 9 : $v);
}
return (
$add%10 == 0);
}
?>

Don't know if foreach and arrays operations are faster than while and substr, but I feel it clearer.
up
-3
edward at edwardsun dot com
18 years ago
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.
up
-2
jordanolsommer at imap dot cc
21 years ago
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 :).
up
-3
moikboy (nospam!) moikboy (nospam!) hu
18 years ago
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];
};
?>
up
-3
Chronial "at" cyberpunkuniverse.de
20 years ago
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;
}
?>
up
-3
AsherMaximum gmail
13 years ago
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 ? $1 : $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==1 ? $i.'st' : ( ($n2==2 ? $i.'nd' : ($n2==3 ? $i.'rd' : $i.'th') ) ) )
?>
up
-3
jl85 at yahoo dot com
21 years ago
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.
up
-4
help at gjbdesign dot com
20 years ago
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
/*Some example values of $q
$q = "2.5";
$q = "2 1/2";
$q = "5/2";
*/
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
}
}
?>
up
-3
tembenite at gmail dot com
17 years ago
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));
}
up
-4
jerry dot wilborn at fast dot net
21 years ago
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));
up
-3
patience at worldonline dot nl
22 years ago
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 < 2 )
$r = 1;
else {
for (
$i = $r-1; $i > 1; $i-- )
$r = $r * $i;
}

return(
$r );
}
?>
up
-3
barry at megaspace dot com
17 years ago
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);
up
-3
jl85 at yahoo dot com
21 years ago
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));
}
up
-3
ian at mp3 dot com
23 years ago
for those looking for a credit card verification function i wrote a simple LUHN Formula algorithm:

<?php
$valid
= 1;

$numOfDigits = 0 - strlen($ccNumber);

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

if ((
$total % 10) != 0){
$valid = 0;
}
?>
up
-4
Florian
18 years ago
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;
}
?>
up
-5
webkid%webkid.com
22 years ago
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!
up
-5
fabien_mornand at yahoo dot fr
21 years ago
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;
?>
up
-5
Aiden880
9 years ago
Lowest Common Denominator:
function lcd($num, $start) {
while($num % $start != 0) {
$start++;
}
return $start;
}
To Top