PHP 8.4.0 RC4 available for testing

Funções Matemáticas

Índice

  • abs — Valor absoluto
  • acos — Arco cosseno
  • acosh — Arco cosseno hiperbólico
  • asin — Arco seno
  • asinh — Arco seno hiperbólico
  • atan — Arco tangente
  • atan2 — Arco tangente de duas variáveis
  • atanh — Arco tangente hiperbólico
  • base_convert — Converte um número entre bases arbitrárias
  • bindec — Binário para decimal
  • ceil — Arredonda frações para cima
  • cos — Cosseno
  • cosh — Cosseno hiperbólico
  • decbin — Decimal para binário
  • dechex — Decimal para hexadecimal
  • decoct — Decimal para octal
  • deg2rad — Converte o número em graus para o equivalente em radianos
  • exp — Calcula o expoente de e
  • expm1 — Retorna exp($num) - 1, computado de forma precisa mesmo quando o valor do número está próximo de zero.
  • fdiv — Divide dois números de acordo com a IEEE 754
  • floor — Arredonda frações para baixo
  • fmod — Retorna o resto (módulo) em ponto flutuante da divisão dos argumentos
  • fpow — Raise one number to the power of another, according to IEEE 754
  • hexdec — Hexadecimal para decimal
  • hypot — Calcula o comprimento da hipotenusa de triângulo retângulo
  • intdiv — Divisão de inteiros
  • is_finite — Verifica se um float é finito
  • is_infinite — Verifica se um float é infinito
  • is_nan — Verifica se um float é NAN
  • log — Logaritmo natural
  • log10 — Logaritmo na base 10
  • log1p — Retorna log(1 + número), calculado de forma que seja preciso mesmo quando o valor do número seja próximo de zero.
  • max — Localiza o maior valor
  • min — Encontra o menor valor
  • octdec — Octal para decimal
  • pi — Obtém o valor de pi
  • pow — Expressão exponencial
  • rad2deg — Converte o número em radianos para o equivalente em graus
  • round — Arredonda um float
  • sin — Seno
  • sinh — Seno hiperbólico
  • sqrt — Raiz quadrada
  • tan — Tangente
  • tanh — Tangente hiperbólica
adicione uma nota

Notas Enviadas por Usuários (em inglês) 26 notes

up
11
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
1
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
0
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
-1
php at keith tyler dot com
14 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
-1
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
-1
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
-1
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
-1
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
-2
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
-2
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
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
-2
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
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
18 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
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
-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
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
-4
Aiden880
9 years ago
Lowest Common Denominator:
function lcd($num, $start) {
while($num % $start != 0) {
$start++;
}
return $start;
}
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;
}
?>
To Top