search for in the

 Last updated: Fri, 17 May 2013

# Math İşlevleri

## İçindekiler

• abs — Absolute value
• acos — Arc cosine
• acosh — Inverse hyperbolic cosine
• asin — Arc sine
• asinh — Inverse hyperbolic sine
• atan2 — Arc tangent of two variables
• atan — Arc tangent
• 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(number) - 1, computed in a way that is accurate even when the value of number is close to zero
• floor — Round fractions down
• fmod — Returns the floating point remainder (modulo) of the division of the arguments
• getrandmax — Show largest possible random value
• hexdec — Hexadecimal to decimal
• hypot — Calculate the length of the hypotenuse of a right-angle triangle
• is_finite — Finds whether a value is a legal finite number
• is_infinite — Finds whether a value is infinite
• is_nan — Finds whether a value is not a number
• lcg_value — Combined linear congruential generator
• 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
• log — Natural logarithm
• max — Find highest value
• min — Find lowest value
• mt_getrandmax — Show largest possible random value
• mt_rand — Generate a better random value
• mt_srand — Seed the better random number generator
• octdec — Octal to decimal
• pi — Get value of pi
• pow — Exponential expression
• rad2deg — Converts the radian number to the equivalent number in degrees
• rand — Generate a random integer
• round — Rounds a float
• sin — Sine
• sinh — Hyperbolic sine
• sqrt — Square root
• srand — Seed the random number generator
• tan — Tangent
• tanh — Hyperbolic tangent

 Last updated: Fri, 17 May 2013

User Contributed Notes Math İşlevleri - [61 notes]
edward at edwardsun dot com
6 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. ```
capripot at gmail dot com
10 months 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. ```
lummox
5 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); } ```
peter-stangl at t-online dot de
7 years ago
``` 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');    } } ?> ```
monte at ohrt dot com
7 years ago
``` 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 < 0 || \$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++); ```
graywh at gmail DELETE dot com
7 years ago
``` 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)) ```
eric at woolhiser dot com
8 years ago
``` For all you guys writing mortgage calculators out there: <?php function payment(\$apr,\$n,\$pv,\$fv=0.0,\$prec=2){     /* Calculates the monthly payment rouned to the nearest penny     ** \$apr = the annual percentage rate of the loan.     ** \$n   = number of monthly payments (360 for a 30year loan)     ** \$pv    = present value or principal of the loan     ** \$fv  = future value of the loan     ** \$prec = the precision you wish rounded to     */     /****************************************\     ** No Warranty is expressed or implied. **     *****************************************/         if (\$apr !=0) {         \$alpha = 1/(1+\$apr/12);         \$retval =  round(\$pv * (1 - \$alpha) / \$alpha /         (1 - pow(\$alpha,\$n)),\$prec) ;     } else {         \$retval = round(\$pv / \$n, \$prec);     }     return(\$retval); } ?> ```
tmpa at yahoo dot com
8 years ago
``` 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; } ?> ```
help at gjbdesign dot com
8 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     } }?> ```
Chronial "at" cyberpunkuniverse.de
9 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; } ?> ```
chris at free-source dot com
9 years ago
``` to "convert" scientific notation to a float simply cast it: <?php \$val = '3.5e4'; \$val = (float) \$val; echo \$val; ?> output: 35000 ```
jerry dot wilborn at fast dot net
10 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)); ```
jbeardsl [found_at] gte [d0t] net
10 years ago
``` 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); } ?> ```
webkid%webkid.com
10 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! ```
cornelius at skjoldhoej dot dk
11 years ago
``` 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(n, m) //greatest common divisor {     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) //least common multiple {     return m*(n/gcd(n,m)); } ?> This may or may not be something to consider adding to the mathematical function library. ```
info at gavinvincent dot co dot uk
8 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;  } } ?> ```
tim at durge dot org
6 years ago
``` In Evan's ordinal function, the line: <?php   \$tens = substr(\$cardinal, -2, 1); ?> 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. ```
webkid%webkid.com
10 years ago
``` 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. ```
-1
Anonymous
6 years ago
``` Here is another way of calculating the nth term of the Fibonacci sequence, based on Binet's formula (see http://en.wikipedia.org/wiki/Fibonacci_series#Closed_form_expression for more information on this). In this example, it would display the 17th term of the Fibonacci sequence. <?php \$n = 17; // Sets a value for \$n, the nth term \$phi = (1 + sqrt(5)) / 2; // Sets the value of phi for use in the formula \$u = (pow(\$phi, \$n) - pow(1 - \$phi, \$n)) / sqrt(5); echo "U<sub>\$n</sub> = \$u"; ?> Here is a script that lists the Fibonacci sequence from whatever two terms you specify, in this example from the 12th term to the 27th term (inclusive). <?php \$f = 12; // Sets the 'f'th term, the term from which to start listing \$t = 27; //Sets the 't'th term, the term at which to stop listing \$phi = (1 + sqrt(5)) / 2; // Sets the value of phi for use in the formula while(\$f <= \$t) {   \$u = (pow(\$phi, \$f) - pow(1 - \$phi, \$f)) / sqrt(5);   echo "U<sub>\$f</sub> = \$u<br>\n";   \$f++; } ?> ```
AsherMaximum gmail
2 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') ) ) ) ?> ```
php at keith tyler dot com
2 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)));' ?> ```
rubo77 at spacetrace dot org
4 years ago
``` <?php function lcd(\$n,\$m, \$maxvarianzpercent=0){     // set \$maxvarianzpercent=5 to get a small, but approx. result     /* a better lcd function with varianz:     for example use     lcd(141,180,5) to get the approx. lcd '7/9' which is in fact 140/180     */     // 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; } ?> ```
PiledHigher at jovi dot net
5 years ago
``` // Ordinal one liner tests good up to PHP_INT_MAX-7 on GNU/Linux function ordinal(\$n) {                                                                                                                                                       return \$n . gmdate("S", (((abs(\$n) + 9) % 10) + ((abs(\$n / 10) % 10) == 1) * 10) * 86400);                                                                           } ```
Mike
5 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; } ```
ddarjany at yahoo dot com
5 years ago
``` 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, -1, 1);   if (\$cardinal <100) \$tens = round(\$cardinal/10);   else \$tens = substr(\$cardinal, -2, 1);   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';   } }  ?> ```
barry at megaspace dot com
6 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); ```
tembenite at gmail dot com
6 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)); } ```
jaakko dot mantila at sagas dot fi
6 years ago
``` Here is another payment function with working future value(\$fv) option: function payment(\$r,\$np,\$pv,\$fv,\$prec) {    /* Calculates the monthly payment    ** \$apr = the annual percentage rate of the loan.    ** \$n  = number of monthly payments (360 for a 30year loan)    ** \$pv    = present value or principal of the loan    ** \$fv  = future value of the loan (after payments)    ** \$prec = the precision you wish rounded to    */    /****************************************\    ** No Warranty is expressed or implied. **    *****************************************/ if(!\$fv) \$fv = 0; \$mypmt=\$r * (-\$fv+pow((1+\$r),\$np)*\$pv)/(-1+pow((1+\$r),\$np)); return round(\$mypmt, \$prec); } ```
twoscoopsofpig at NOSPAM dot gmail dot com
6 years ago
``` @ Moikboy: This may or may not be more simplified factorialization: <?php \$f=\$fact=25; while (\$fact>0) {\$f=\$f*\$fact--;} echo \$f; ?> ```
marasek.SPAMLESS at telton.de
6 years ago
``` I could not resist to do a simpler version of the ordinal function: <?php function ordinal(\$num) {     \$num = (int)\$num;     \$digit = substr(\$num, -1, 1);     \$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. ```
moikboy (nospam!) moikboy (nospam!) hu
7 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]; }; ?> ```
Florian
7 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; } ?> ```
jos at gtacrime dot nl
7 years ago
``` 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((1 - \$p), (\$n - \$k));     return \$return; } ?> ```
daniel at g-loc dot org
7 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! ```
crescentfreshpot at yahoo dot com
7 years ago
``` Median: number median ( number arg1, number arg2 [, number ...] ) number median ( array numbers ) <?php function median() {     \$args = func_get_args();     switch(func_num_args())     {         case 0:             trigger_error('median() requires at least one parameter',E_USER_WARNING);             return false;             break;         case 1:             \$args = array_pop(\$args);             // fallthrough         default:             if(!is_array(\$args)) {                 trigger_error('median() requires a list of numbers to operate on or an array of numbers',E_USER_NOTICE);                 return false;             }             sort(\$args);                         \$n = count(\$args);             \$h = intval(\$n / 2);             if(\$n % 2 == 0) {                 \$median = (\$args[\$h] + \$args[\$h-1]) / 2;             } else {                 \$median = \$args[\$h];             }             break;     }         return \$median; } ?> ```
bjcffnet at gmail dot com
7 years ago
``` 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(5, 10, 15); echo average(\$array); // 10 ?> ```
thearbitcouncil at gmail dot com
8 years ago
``` 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 :) ?> ```
donnieb819 at hotmail dot NOSPAM dot com
8 years ago
``` 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 == 1 ) 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 ```
pat.mat AT sympatico DOT com
8 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 ```
churkl at hotmail dot com
8 years ago
``` Here is my factorial function which i think is very simple and without any confusion. email me comments if you like if i had something wrong. <?php function factorial(\$number) {     \$temp = 1;     while (\$number > 1){         \$temp *= \$number--;     }     return \$temp; } ?> ```
ausvald at tut dot by
9 years ago
``` I see there are some factorial functions below. I'll provide the best one: <? function factorial(\$n){ \$n=(int)\$n;   \$f=1;   for(;\$n>0;--\$n) \$f*=\$n;   return \$f; } ?> ```
florian at shellfire dot de
9 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));        } ?> ```
jl85 at yahoo dot com
9 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)); } ```
fabien_mornand at yahoo dot fr
9 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; ?> ```
jordanolsommer at imap dot cc
9 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 :). ```
10 years ago
``` Here is a cleaner factorial function: function factorial(\$s){     if(\$s) \$r = \$s * factorial(\$s - 1);     else \$r = 1;     return \$r; } ```
nazgul26 (at_sign) windfox dot net
10 years ago
``` 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 /*    Converts a decimal to unsimplified fraction represented in an array */ function decimalToFraction(\$decimal,\$count,\$result) {     \$a = (1/\$decimal);     \$b = ( \$a - floor(\$a)  );     \$count++;     if (\$b > .01 && \$count <= 5) decimalToFraction(\$b,\$count,&\$result);     \$result[\$count] = floor(\$a); } /*     Simplifies a fraction in an array form that is returned from      decimalToFraction */ function simplifyFraction(\$fraction,\$count,\$top,\$bottom) {     \$next = \$fraction[\$count-1];     \$a = (\$bottom * \$next) + \$top;     \$top = \$bottom;     \$bottom = \$a;     \$count--;     if (\$count > 0) simplifyFraction(\$fraction,\$count,\$top,\$bottom);     else {         return "<font size=1>\$bottom/\$top</font>";     } } ?> ```
jbeardsl at gte dot net
10 years ago
``` 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); } ```
patience at worldonline dot nl
10 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 ); } ?> ```
shanx at shanx dot com
10 years ago
``` <? /**  * Function to calculate base36 values from a number. Very  * useful if you wish to generate IDs from numbers.  *  * @param \$value The number  * @param \$base The base to be applied (16, 36 or 64)  * @return The calculated string  * @author Shashank Tripathi (shanx@shanx.com)  * @version 0.1 - Let me know if something doesnt work  *  */   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 > 0 )     {         \$remainder = \$value % \$base;         \$value = ( (\$value - \$remainder)/ \$base );         \$newval .= \$baseChars[\$remainder];     }     return strrev(\$newval);     } echo "The string for 46655, for instance, is " . base36(46655, 36); ?> ```
ian at mp3 dot com
12 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; } ?> ```
-1
zero dot affect at hotmail dot com
3 years ago
``` I was editing some code and made up two functions which may come in handy, they are to work out the average value of multiple values. Working with array: <?php function avgval(\$avg_vals) {  if ( is_array(\$avg_vals) && count(\$avg_vals) > 1 ) {         \$return_vals = ( array_sum(\$avg_vals) / count(\$avg_vals) );  } elseif ( is_array(\$avg_vals) && count(\$avg_vals) == 1 ) {         \$return_vals = current(\$avg_vals);  } else {         \$return_vals = FALSE;  }    return \$return_vals; }    echo avgval(array(6,11,7)); // outputs 8    echo avgval(array(6)); // outputs 6 ?> Working with string: <?php function avgvals(\$avg_vals,\$avg_delimiter=',') {  if ( (is_string(\$avg_vals) && strlen(\$avg_vals) > 2) && (is_string(\$avg_delimiter) && !empty(\$avg_delimiter)) ) {     \$average_vals = explode(\$avg_delimiter, \$avg_vals);         \$return_vals = ( array_sum(\$average_vals) / count(\$average_vals) );  } elseif ( (is_string(\$avg_vals) && strlen(\$avg_vals) <= 2) && (is_string(\$avg_delimiter) && !empty(\$avg_delimiter)) ) {         \$return_vals = \$avg_vals;  } else {         \$return_vals = FALSE;  }    return \$return_vals; }    echo avgvals('6,11,7'); // outputs 8    echo avgvals('6-11-7', '-'); // outputs 8    echo avgvals('6'); // outputs 6 ?> ```
-1
chris at chrisstockton dot org
4 years ago
``` Recently I needed to determine the size of N is unknown, only the state of N is known. May seem like a weird thing to need, but a example is finding the maximum size of sending email to a SMTP server when the maximum size is currently unknown. You  can send \$size email each iteration and the direction will be TRUE if the email is to big and is rejected by the server, or FALSE if the email is accepted. Below is a example. <?php // our arbitrary number that if not being used in this example, would be // otherwise unknown \$n = 1; echo "Finding: \$n\n"; \$direction = FALSE; \$step = 1; \$size = \$sizeLeast = \$sizeMax = \$i = 0; while(1) {     // small var for counting, could be taken out if you don't care how many     // iterations it took (in common use you wouldn't)     \$i++;     // this should be a function call or something that says what the current     // state of N is, above (true) or below (false), here \$n is just a arbitrary     // number and to determine the state we compare it against current \$size     \$direction = (\$size > \$n);     // simple steps based on the current state of n (direction), the call could     // be here instead of assigning direction for more performance     if(\$direction) {         \$sizeMax = \$size;         \$step = (int) round(\$step/2);         \$size -= \$step;     } else {         \$sizeLeast = \$size;         \$step = \$step*2;         \$size += \$step;     }     // if sizemax - sizeleast is 1, then obviously the size is sizeLeast     if(1 === (\$sizeMax - \$sizeLeast) && 1 === \$step) {         break;     } } echo "Found: \$size in \$i iterations\n"; ?> ```
-1
Kollege
4 years ago
``` If somebody needs to convert a hexal input (i'm NOT talking about hexaDEZIMAl), e.g. a time like 02:30 h to dezimal, like - in this case -: 2.5 i can recommend this simple function: <? function HexalToDezimal (\$hexal) {  \$dezimal = floor(\$hexal) + round((\$hexal - floor(\$hexal)) * (1 / 0.6), 2);  return (\$dezimal);  } ?> This can be usefull e.g. if you want to work with unix-timestamps and hexal inputs; e.g. if you want to compute: time() + [2 houres : 30 minutes] That is: time() + (2.5 * 60 * 60) ```
-1
Evan Broder
6 years ago
``` 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, -1, 1);         \$tens = substr(\$cardinal, -2, 1);         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';         }     } ?> ```
-1
nessthehero at comcast dot net
7 years ago
``` Just a simple function to find the ordinal ending to any number if you're printing for example: "The nth result is..." function ordinal(\$num) {     \$digit = substr(\$num,-1,1);     \$ord = array(         0 => 'th',         1 => 'st',         2 => 'nd',         3 => 'rd',         4 => 'th',         5 => 'th',         6 => 'th',         7 => 'th',         8 => 'th',         9 => 'th'     );            \$string = \$num.\$ord[\$digit];     return \$string; } ```
-1
nbraczek at bsds dot de
7 years ago
``` Under some circumstances, it is appropriate to round floats to a given number of significant digits. This function will do it for you: /**  * Round to significant digits  *  * @param float   \$f The number to be rounded  * @param integer \$n Number of significant digits  */ function round_significant(\$f, \$n) {     if (\$f==0) return \$f;     return round(\$f, \$n-floor(log10(abs(\$f)))-1); } ```
-1
8 years ago
``` The fastest O(1) factorial function has a lookup table of all the factorials that fit within the output range. With an array of the first 34 (float) or 170 (double) factorials, you get identical results in a fraction of the time. ```
-1
jl85 at yahoo dot com
10 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. ```
-1
php at casaforge dot com (Hal)
10 years ago
``` This might be useful in generating fractional numbers for construction, if only because most carpenters would rather put a nail in your foot than hear about any number that ends with .8125". Since I couldn't figure out the fraction code above, this is my simple-minded take on the problem. Also, align by "char" doesn't seem to work yet in html, so it seems necessary to use tables (egad!) to make numbers align properly. The following code illustrates a way to make a dynamically sized table with aligned fractions from an array of random numbers. Since I don't care about fractions less than 1/16, this rounds them into oblivion. Also, it sorts the list from long to short and collates multiples in the array. One bit of cleverness here (gleaned from these pages) that might not be obvious: I'm using 1 *bitwise and* (1 &) to determine odd numbers. If you copy and paste the following code, try refreshing the page a few times to see how the table adjusts itself. <?php // get some numbers to play with \$x = rand(0,130000)/10; \$y = rand(0,1200); \$z = rand(0,4)/64; \$array = array(\$x, \$x, \$x, \$y, \$y, \$z, 324.19, 425/7, sqrt(2), pi(), pi()); // functions function mult(\$n) { return intval (round (\$n*16)); } function frac(\$num) { \$mod = fmod (\$num,1)*16; if (1 & \$mod) { return " - ".\$mod."/16"; } else \$mod = \$mod/2; if (1 & \$mod) { return " - ".\$mod."/8"; } else \$mod = \$mod/2; if (1 & \$mod) { return " - ".\$mod."/4"; } else \$mod = \$mod/2; if (1 & \$mod) {return " - ".\$mod."/2";} } // make a table echo '<table>'; \$array = array_map("mult", \$array); \$array = (array_filter(\$array, strval)); //get rid of zeros \$array = (array_count_values (\$array)); krsort (\$array); while (list (\$key, \$val) = each (\$array)) { \$key = \$key/16; echo "<tr><td>\$val</td><td>&nbsp; @ &nbsp;</td><td align=\"right\">".intval(\$key)." </td><td> ".frac(\$key)." </td></tr>"; } echo '</table>'; ?> ```
-1
cathody at mail dot ru
12 years ago
``` Converting non-standard form: you can use something like this: <?php \$v=0.3e-9; \$v=sprintf ( "%2.9f", \$v); ?> ```