Sei sulla pagina 1di 8

Operaciones aritmticas

En pginas anteriores hemos podido ver que PHP permite utilizar un tipo de variables las numricas
cuyos valores puedan seroperados de la misma forma que se hace con los nmeros en la vida cotidiana.
Los resultados de las operaciones pueden utilizarse de forma directa o ser recogidos en una nueva
variable. Si asignamos a una nueva variable el resultado de una operacin el valor contenido en ella no se
modifica si cambian posteriormente los de las variables que intervinieron su creacin.

Sintaxis de print y echo


Si queremos encadenar en una sola instruccin echo print el resultado de una operacin junto con
otras variables (o cadenas) esimprescindible poner entre parntesis las instrucciones de la operacin. Esta
norma solo tiene dos excepciones: en caso de que el print solo contenga la propia operacin o cuando
utilicemos echo y el separador sea una coma.

Operadores aritmticos
Las diferentes operaciones aritmticas se realizan en PHP utilizando la siguiente sintaxis:
$a + $b

Devuelve la suma de los valores nmericos contenidos en las variables $a y $b.


$a $b

Devuelve la diferencia de los valores nmericos contenidos en las variables $a y $b.


$a * $b

Devuelve el producto de los valores nmericos contenidos en las variables $a y $b.


$a / $b

Devuelve el cociente de los valores nmericos contenidos en las variables $a y $b.


(int)($a / $b)

Devuelve el cociente entero de los valores nmericos contenidos en las variables $a y $b.
$a % $b

Devuelve el resto de la divisin entera de los valores nmericos contenidos en las variables $a y $b.
Sqrt($a)

Devuelve la raz cuadrada del valor nmerico contenido en la variables $a.


pow($a,$b)

Devuelve el resultado de elevar el valor nmericos contenido en la variable $a a la potencia indicada


en la variable $b (ab)
pow($a,1/$b)

Devuelve el resultado de elevar el valor nmericos contenido en la variable $a a la potencia indicada


en la variable 1/$b lo cual no es otra cosa que la raz de ndice $b de $a.
Abs($a);

Devuelve el valor absoluto del valor nmerico contenido en la variable $a.

<?php
# definamos dos variables numricas asignandoles valores
$a=23; $b=34;
/* hagamos una suma y escribamos directamente los resultados
utilizando las instrucciones print y echo
con todas sus posibles opciones de sintaxis */
print("La suma de $a + $b es: " . $a . "+" . $b . "=" . ($a+$b)."<br>");
print "La suma de $a + $b es: " . $a . "+" . $b . "=" . ($a+$b) ."<BR>";
print ("La suma de $a + $b es: " . $a . "+" . $b . "=" . ($a+
$b) ."<BR>");
echo "La suma de $a + $b es: " . $a . "+" . $b . "=" . ($a+$b) ."<BR>";
echo "La suma de $a + $b es: " , $a , "+" , $b . "=" , ($a+$b) ."<BR>";
echo "La suma de $a + $b es: " , $a , "+" , $b , "=" , $a+$b ,"<BR>";
# guardemos ahora el resultado de esa operacin en una nueva variable
$c=$a+$b;
/*ahora presentemos el resultado utilizando esa nueva variable
adviertiendo el la salida */
print ("Resultados recogidos en una nueva variable<br>");
print "La suma de $a + $b es: " . $a . "+" . $b . "=" . $c ."<BR>";
print ("La suma de $a + $b es: " . $a . "+" . $b . "=" . $c ."<BR>");
echo "La suma de $a + $b es: " . $a . "+" . $b . "=" . $c ."<BR>";
echo "La suma de $a + $b es: " , $a , "+" , $b . "=" , $c ."<BR>";
echo "La suma de $a + $b es: " , $a , "+" , $b , "=" , $c ,"<BR>";
/* modifiquemos ahora los valores de $a y $b comprobando que el cambio
no modifica lo contenido en la variable $c */
$a=513; $b=648;
print ("<br> C sigue valiendo: " . $c ."<br>");
# experimentemos con los parntesis en un supuesto de operaciones
combinada
# tratemos de sumar la variable $a con la variable $b
# y multiplicar el resultado por $c.
# Si escribimos print($a+$b*$c) nos har la multiplicacin antes que la
suma
print "<br>No he puesto parntesis y el resultado es: ".($a+$b*$c);
# Si escribimos print(($a+$b)*$c) nos har la suma y luego multiplicar
print "<br>He puesto parntesis y el resultado es: ".(($a+$b)*$c);
?>

ejemplo33.php

Operaciones aritmticas
Operacin

Sintaxis

Resultado

Suma

$a+$b

12

-7.3

4.7

Diferencia

$a-$b

12

-7.3

19.3

Producto

$a*$b

12

-7.3

-87.6

Cociente

$a/$b

12

-7.3

-1.64383561644

Cociente entero

(int)($a/$b)

12

-7.3

-1

Resto de la divisin

$a%$b

12

Potencias a

pow($a,$b)

12

248832

Potencias a

pow($a,$b)

-7.3

-3

-0.00257058174836

Raz cuadrada

Sqrt($a)

12

3.46410161514

Raz cuadrada

Sqrt($a)

-7.3

NAN

Raz ensima

pow($a,(1/$b)

12

Valor absoluto

Abs($b)

2.28942848511

-7.3

7.3

Al realizar una operacin cuyo resultado no es un nmero real PHP devuelve la cadena NaN tal
como puedes ver en el ejemplo de laraz cuadrada de un nmero negativo.

Redondeo de resultados
PHP dispone de tres opciones de redondeo:
floor($z)

Redondeo por defecto


ceil($z)

Redondeo por exceso


round($z)

Redondeo tradicional
Redondeos
tipo

Sintaxis

Resultado

Parte entera

(int)$a

12

12

Parte entera

(int)$a

-7.3

-7

Parte entera

(int)$a

-13.8546

-13

Parte entera

(int)$a

-24.5

-24

Parte entera

(int)$a

13.8546

13

Parte entera

(int)$a

24.5

24

Redondeo por defecto

floor($a)

12

12

Redondeo por defecto

floor($a)

-7.3

-8

Redondeo por defecto

floor($a)

-13.8546

-14

Redondeo por defecto

floor($a)

-24.5

-25

Redondeo por defecto

floor($a)

13.8546

13

Redondeo por defecto

floor($a)

24.5

24

Redondeo por exceso

ceil($a)

12

12

Redondeo por exceso

ceil($a)

-7.3

-7

Redondeo por exceso

ceil($a)

-13.8546

-13

Redondeo por exceso

ceil($a)

-24.5

-24

Redondeo por exceso

ceil($a)

13.8546

14

Redondeo por exceso

ceil($a)

24.5

25

Redondeo

round($a)

12

12

Redondeo

round($a)

-7.3

-7

Redondeo

round($a)

-13.8546

-14

Redondeo

round($a)

-24.5

-25

Redondeo

round($a)

13.8546

14

Redondeo

round($a)

24.5

25

Orden de operacin
Cuando una misma instruccin contiene una secuencia con varias operaciones el orden de ejecucin
de las mismas sigue los mismos criterios que las matemticas. No se realiza una ejecucin secuencial sino
que se respeta el orden de prioridad matemtico. Es decir, las potencias y races tienen prioridad frente a los
productos y los cocientes, y estos, son prioritarios respecto a la suma y las diferencias.
Igual que en matemticas se pueden utilizar los parntesis para modificar el orden de ejecucin de las
operaciones, e igual que allPHP tambin permite encerrar parntesis dentro de parntesis.

Cuidado!
Cuando realices operaciones combinadas, no olvides establecer mediante parntesis las
prioridades que sean necesarias. No temas abusar de ellos! Te evitarn muchos problemas.

Punto flotante y precisin arbitraria


Las funciones aritmticas que estamos estudiando utilizan la sintaxis de punto flotante cuya
precisin es limitada y, aunque depende del sistema, PHP tpicamente utiliza el formato de doble precisin
IEEE 754, el cual puede dar un error relativo mximo por aproximacin del orden de 1.11*1016.

Las operaciones aritmticas ms elementales nunca van a dar grandes errores aunque la dimensin
de estos podr irse incrementando a medida que se concatenar varios de esos errores simples en
operaciones compuestas.
Hay que tener en cuenta la existencia de fracciones que se pueden representar de forma exacta como
nmeros de punto flotante en base 10 (por ejemplo 1/10 7/10) pero que carecen de esa exactitud al ser
expresados en base 2 que es la usada internamente por PHP.
As pues, hemos de tener cuidado al considerar nmeros de coma flotante hasta su ltimo dgito por
los imprevisibles efectos sobretodo a la hora de la comparacin de esos errores en el resultado.
Para operaciones matemticas que necesiten una mejor precisin PHP (innecesaria en el mbito
cotidiano y limitada a casos muy puntuales del mbito cientfico) ofrece la calculadora binaria que soporta
nmeros de cualquier tamao y precisin representados como cadenas. Las funciones que utilizan esa
forma de clculo son las siguientes:
bcadd($a,$b,c)

Devuelve la suma de los valores numricos contenidos en las cadenas $a y $b con una precisin
(nmero de cifras decimales) especificada por el nmero entero especificado en el parmetro c.
bcsub($a,$b,c)

Devuelve la diferencia entre los valores numricos contenidos en las cadenas $a y $b con una
precisin (nmero de cifras decimales) especificada por el nmero entero especificado en el parmetro c.
bcmul($a,$b,c)

Devuelve el producto de los valores numricos contenidos en las cadenas $a y $b con una precisin
(nmero de cifras decimales) especificada por el nmero entero especificado en el parmetro c.
bcdiv($a,$b,c)

Devuelve el resultado de dividir los valores numricos contenidos en las cadenas $a y $b con la
precisin especificada por el nmero entero contenido en el parmetro c.
bcmod($a,$b)

devuelve el resto de la divisin entera de los valores contenidos en las cadenas $a y $b.
bcpow($a,$b,c)

Devuelve el resultado de elevar el valor numrico contenido en la cadena $a a la potencia expresada


por la cadena $b dando el resultado con la cantidad de decimales sealada por el parmetro c.

bcsqrt($a,c)

Devuelve la raz cuadrada del valor numrico contenido en la cadena $a con la cantidad de decimales
sealada por el parmetro c.
bccomp($a,$b,c)

Compara los valores contenidos en las cadenas $a y $b teniendo en cuenta nicamente el nmero de
decimales especificados en c. Si $a>$b devuelve 1. Si las magnitudes comparadas son iguales devuelve 0 y
si son distintas devuelve 1.
Si comparamos $a='3.456' (es necesario
con $b='3.45' obtendremos como resultado:
bccomp($a,$b,0)=0
bccomp($a,$b,1)=0
bccomp($a,$b,2)=0
bccomp($a,$b,3)=1

indicar

siempre

los

valores

como

cadenas)

Compara 3 con 3 que obviamente son iguales


Compara 34 con 34. Son iguales y por tanto devuelve cero
Compara 345 con 345. Son iguales y por tanto devuelve cero
Compara 3456 con 3450. No son iguales y por tanto devuelve uno

En el cuadro puedes ver, sealados en rojo, los resultados de efectuar la misma operacin utilizando
el operador de coma flotante y estas funciones de precisin arbitraria. Si comparas las diferencias en los
resultados obtenidos con cada una de ellas podrs darte idea del error provocado por los inevitables
redondeos de la operacin con coma flotante.

Comparacin de punto flotante y precisin arbitraria


Comparacin de funciones matemticas
Operacin

S
U
M
A

R
E
S
T
A

Variable

Valor

$A

"12345678910123456789012345678901234567890"

$B

"45678910123456789012345678901234567890123"

bcadd($A,$B,0)

58024589033580245801358024580135802458013

$a=(double)$A

1.23456789101E+40

$b=(double)$B

4.56789101235E+40

$a+$b

5.80245890336E+40
58024589033580236333428572634998418440192

$C

"0.0002345678902"

$D

"0.00000000000000000000000000000000000000001523786"

bcadd($C,$D,50)

0.00023456789020000000000000000000000000001523786000

$c=(double)$C

0.0002345678902

$d=(double)$D

1.523786E-41

$c+$d

0.0002345678902
0,00023456789020000001029161995624860992393223568797

$A

"12345678910123456789012345678901234567890"

$B

"45678910123456789012345678901234567890123"

bcsub($A,$B,0)

-33333231213333332223333333222333333322233

$a=(double)$A

1.23456789101E+40

$b=(double)$B

4.56789101235E+40

$a-$b

-3.33332312133E+40

-33333231213333327795815413198205132734464

P
R
O
D
U
C
T
O

D
I
V
I
S
I

R
E
S

$C

"0.0002345678902"

$D

"0.00000000000000000000000000000000000000001523786"

bcsub($C,$D,50)

0.00023456789019999999999999999999999999998476214000

$c=(double)$C

0.0002345678902

$d=(double)$D

1.523786E-41

$c-$d

0.0002345678902
0,00023456789020000001029161995624860992393223568797

$A

"12345678910123456789012345678901234567890"

$B

"45678910123456789012345678901234567890123"

bcmul($A,$B,0)

56393715734858534797546128354926080723008626986848
1383972550423718379870903950470

$a=(double)$A

1.23456789101E+40

$b=(double)$B

4.56789101235E+40

$a*$b

5.63937157349E+80
56393715734858529559076134525051001632068799181691
5078270593363632973621514731520

$C

"0.0002345678902"

$D

"0.00000000000000000000000000000000000000001523786"

bcmul($C,$D,62)

0.000000000000000000000000000000000000000000003574
312671362972

$c=(double)$C

0.0002345678902

$d=(double)$D

1.523786E-41

$c*$d

3.57431267136E-45 0
0,000000000000000000000000000000000000000000003574
31267136297184

$A

"12345678910123456789012345678901234567890"

$B

"45678910123456789012345678901234567890123"

bcdiv($A,$B,30)

0.270270872854818178953756836882

$a=(double)$A

1.23456789101E+40

$b=(double)$B

4.56789101235E+40

$a/$b

0.270270872855
0,270270872854818211550309570157

$C

"0.0002345678902"

$D

"0.00000000000000000000000000000000000000001523786"

bcdiv($C,$D,30)

15393755435474535138136194977509965310.08947450626
2690430283517501801

$c=(double)$C

0.0002345678902

$d=(double)$D

1.523786E-41

$c/$d

1.53937554355E+37
15393755435474536238109275036946792448,00000000000
0000000000000000000

$A

"12345678910123456789012345678901234567890"

$B

"57"

P
O
T
E
N
C
I
A

R
A
I
Z

C
U
A
D
R
A
D
A

bcmod($A,$B)

19

$a=(double)$A

1.23456789101E+40

$b=(double)$B

57

$a % $b

$A

"12345678910123456789012345678901234567890"

$B

"13"

bcpow($A,$B)

15477282435120092620517640487873307882539433894477
02478876805675247359287360605519476488004915460644
30130253272627846453956411651820029120439549209342
64779279536097719586538292066102759581864670705845
47341619065960659102701030110334399943453939049941
81961179086427277645221130645386339095405377300948
55610257804029129290263282188925049521874093123594
94558994966581650612470024575134583192369561297975
69626211024080786875604177270092747586939296603680
65512433192215011092075340601280601173670507434702
7729224690000000000000

$a=(double)$A

1.23456789101E+40

$b=(double)$B

13

pow($a, $b)

INF
inf

$A

"12345678910123456789012345678901234567890"

$B

"13"

bcsqrt($A,15)

111111110651111110153.9111071478030905799220364

$a=(double)$A

1.23456789101E+40

$b=(double)$B

13

Sqrt($a)

1.11111110651E+20
111111110651111112704,0000000000000000000000000

Aunque las diferencias de resultados puedan parecer muy grandes en valor absoluto (hemos
exagerado premeditadamente los valores operados (tanto en valores grandes como en valores pequeos) los
errores relativos son de escasa significacin. En la inmensa mayora de las situaciones (por no decir todas las
cotidianas) resulta suficiente utilizar los operadores de coma flotante.

Potrebbero piacerti anche