PHP 8.4.0 Beta 5 available for testing

# Math Functions

• 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

### User Contributed Notes 26 notes

13
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 in2x+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`
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!```
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); }`
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,yfunction 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; }}?>`
-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/`
-2
php at keith tyler dot com
13 years ago
`Another ordinal method, which does not involve utilizing date functions:<?phpsprintf( "%d%s", \$t, array_pop( array_slice( array_merge( array( "th","st","nd","rd"), array_fill( 4,6,"th")), \$t%10, 1)));'?>`
-3
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;}`
-3
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)); } ?>```
-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.`
-3
moikboy (nospam!) moikboy (nospam!) hu
18 years ago
`I think, this is the optimal code for calculating factorials:<?phpfunction 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:<?phpfunction fib(\$int){ static \$fibTable=array(); return empty(\$fibTable[\$int])?\$fibTable[\$int] = \$int>1?fib(\$int-2)+fib(\$int-1):1:\$fibTable[\$int];};?>`
-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)<?phpdefine (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;}?>`
-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') ) ) ) ?>```
-4
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.```
-4
help at gjbdesign dot com
19 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 decimalreturn \$q; }else{ return \$q;//not a fraction, just return the decimal }}?>`
-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 ); } ?>```
-3
jl85 at yahoo dot com
20 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 befunction gcd(\$n,\$m){if(!\$m)return\$n;return gcd(\$m,fmod(\$n,\$m));}`
-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; } ?>```
-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 \$stepfunction 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;}?>`
-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!`
-4
fabien_mornand at yahoo dot fr
20 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;?>`
-3
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 :).`
-4
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.`
-5
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));`
-4
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 varsfunction 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));}`
-4
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);`
-5
Aiden880
9 years ago
`Lowest Common Denominator:function lcd(\$num, \$start) { while(\$num % \$start != 0) { \$start++; } return \$start;}`