|
Aula 14: Funções Matemáticas
|
|
Quase cada linguagem de programação tem muitas funções
de matemática implemetadas. Como exemplo, vamos aprender as funções
mais úteis da PASCAL. Não é muito importante saber
o formato exacto de estas funções. melhor é lembrar
que as funções existe e quando precisa de uma função
lê o muanual da linguagem que está a usar.
Função
|
descrição
|
argumento
|
resultado
|
exemplos
|
Abs |
Valor absoluto do argumento.
Argumento pode ser real ou inteiro
Abs retornerá o mesmo tipo. |
real
integer |
real
integer |
Abs(-23.2) = 23.1
Abs(12.3) = 12.3
Abs(-10) = 10 |
Cos |
Cosine do argumento. Argumento em
radians (2p rad = 360o) |
real |
real |
Cos(1.0) = 0.5403 |
Sin |
Sine do argumento. Argumento em
radians (2p rad = 360o) |
real |
real |
Sin(1.0) = 0.8415 |
ArcTan |
Inverso tangent do argumento |
real |
real |
ArcTan(1.0) = p/4 |
Exp |
Exponent do argumento |
real |
real |
Exp(1.0) = 2.718 |
Ln |
Logaritmo natural do argumento |
real (>0) |
real |
Ln(10.0) = 2.303 |
Odd |
Determine se o argumento é impar |
integer |
boolean |
Odd(3) = TRUE |
Round |
Arredondamento do argumento para
o inteiro mais perto |
real |
integer |
Round(3.4) = 3
Round(3.5) = 4 |
Int |
Arredondamento do argumento para
o inteiro abaixo |
real |
real |
Int(3.99) = 3.00 |
Frac |
Retorno a parte do número depois
o ponto décimal |
real |
real |
Frac(3.99) = 0.99 |
Trunc |
Arredondamento do argumento para
o inteiro abaixo |
real |
integer |
Trunc(3.99) = 3 |
Sqrt |
Raiz do argumento |
real (>0) |
real |
Sqrt(3.0) = 1.732 |
Sqr |
Quadrado do argumento |
real |
real |
Sqr(2.0) = 4.0 |
Random |
Gera número aleatório |
integer |
real
integer |
Random = 0.0234
Random(10) = 3 |
Randomize |
Randomizar o gerador dos
números aleatórios |
|
|
|
Funções trigonométricas
As funções trigonométricas implementadas em PASCAL
são Sin e Cos que retornam o sine e cosine do
argumento, respectivamente. Nota que a função Tan não
existe, mas (eu espero) nos sabemos que Tan(x) é igual a
Sin(x)/Cos(x). Nota também que os argumentos (os parámetros
a passar à função) têm unidades de radians (2p
rad = 360o). Exemplo:
código PASCAL
PROGRAM Trigonometry;
Var xdeg, xrad, ysin, ycos, ytan: real;
begin
xdeg := 45.0;
xrad := Pi*xdeg/180.0;
(* convert to radians! Note
that the
value Pi is defined in
PASCAL *)
ysin := Sin(xrad);
ycos := Cos(xrad);
ytan := ysin/ycos;
Writeln('x = ',xdeg:0:3);
WriteLn('Sin = ', ysin:0:4);
WriteLn('Cos = ', ycos:0:4);
WriteLn('Tan = ', ytan:0:4);
end. |
output
x = 45.000
Sin = 0.7071
Cos = 0.7071
Tan = 1.0000 |
Esixte só uma única função trigonométrica
inversa, nomeademente Tan-1 qual
chama-se ArcTan em PASCAL (e ATan nas algumas outras
linguagens). As outras funções inversas (ArcCos and ArcSin)
podem ser derivadas de ArcTan. Como? (Na aula seguinta vou dar a solução).
código PASCAL
PROGRAM InverseTrigonometry;
Var x, y, angle: real;
begin
x := 0.5;
y := ArcTan(x);
angle := 180.0*y/Pi;
Writeln('x = ', x:0:3);
WriteLn('ArcTan = ', angle:0:4);
end. |
output
x = 0.500
ArcTan = 26.5651 |
Funções exponenciais e xn
A função Exp retorna o expoente do argumento:
Exp(x) = ex (com e o número de Nepper)
Ln retorna logaritmo (natural) do argumento. O argumento deve
ser maior que zero, obviamento.
A função 10Log(x), ou geralmente as
funções nLog(x) e xn
não existem em PASCAL, mas podem ser facilmente derivadas das funções
Ln
e Exp acimas:
xn = Exp(Ln(xn)) =
Exp(n*Ln(x))
nLog(x) = nLog(eLn(x))
= Ln(x)* nLog(e) = Ln(x) / eLog(n)
= Ln(x) / Ln(n)
Tem linguagens com funções do tipo xn,
por exemplo em C: pow(x,n), mas de qualquer modo, esta função
é implementado da forma acima no nível abaixo (Linguagem
da máquina).
Nos computadores modernos com coprocessadores matemáticos
(todos os processadores Pentium têm um incorporado) os cálculos
complicados Ln, Exp, mas também Sin e Cos e ArcTan são executados
muito rápido, porque usam tabelas com valores precalculados dentro
do processador.
Há linguagens, onde o logaritmo natural chama-se Log. Isto pode
dar confusão, e por isso: sempre LÊ AS INSTRUÇÔES!
Exemplo:
código PASCAL
PROGRAM ExponentAndLogarithm;
Var x, y: real;
begin
x := 100.0;
y := Ln(x)/Ln(10.0);
WriteLn('Log(',x:0:1,') = ',y:0:1);
x := 3.0;
y := Exp(x*Ln(10));
WriteLn('10^',x:0:1,' = ',y:0:1);
end. |
output
Log(100.0) = 2.0
10^3.0 = 1000.0 |
Embora da possibilidade de exprimir xn com funções
Exp e Ln, duas formas são usadas tão muito que merecem as
suas implementações próprias, nomeademente: Sqr(x)dáx2
e Sqrt(x)dá x1/2. Exemplo:
código PASCAL
PROGRAM SquareRootAndSquare;
Var x, y: real;
begin
x := 3.0;
y := Sqrt(x);
WriteLn('The square-root of ', x:0:3,
' is ',y:0:1);
y := Sqr(x);
WriteLn('The square of ',x:0:3,
' is ',y:0:1);
end. |
output
The square-root of 3.0 is 1.732
The square of 3.0 is 9.000 |
Arredondamento
Existem quatro funções de arredonademnto em PASCAL, Round,
Int, Frac, e Trunc.
Round retorna o número
inteiro mias perto. O valor retornado é do tipo integer. Exemplos:
Round(1.2)
= 1, Round(2.5) = 3, Round(4.99) = 5.
Int retorna a parte do número
antes o ponto flutuante, então, o número inteiro imediatemente
abaixo. O tipo do valor retornado é real. Isto pode dar alguma confusão;
Int
não retornerá um valor do tipo integer (como, por exemplo
em C)!. Exemplos
Int(1.2) = 1.0, Int(2.5) = 2.0,
Int(4.99)
= 4, Int(5.0) = 5.0.
Frac retorna a parte do número
depois o ponto flutuante, então um número entre 0 e 1. Por
isso, é sempre do tipo real. Exemplos: Frac(1.2) = 0.2,
Frac(2.5)
= 0.5, Frac(4.99) = 0.99, Frac(5.0) = 0.0.
Trunc é igual a Int, mas
converte a integer. Exemplos: Trunc(1.2) = 1, Trunc(2.5)
= 2, Trunc(4.99) = 4, Trunc(5.0) = 5.
A função Odd
Uma função estranha é Odd.
Odd
retorna TRUE se o argumento é impar, FALSE se contrário.
Então, esta função Odd(x) é igual
a(x MOD 2)>0 que tammbém retorneria TRUE ou FALSE, dependente
da imparidade do argumento x.
Números aleatórios
Uma das coisas mais interessante da programação é
usar números aleatórios. Até já o resultado
do programa foi sempre previsível (embora de ser difícil).
Com números aleatórios mesmo o programador próprio
não sabe o resultado do seu programa. É parecido com atirar
uma moeda no ar. Mesmo se sabemos todas as leis da física, não
sebemos o resultado de um experimente de atirar uma moeda no ar.
Gerar números aleatórios é nada fácil.
Computadores são exelente em fazer coisas numa maneira previsível,
mas fazer coisas numa maneira imprevisível é muito difícil
(com os humanos é o contrário). Os geradores de números
aleatórios dos computadores na verdade não são muito
bons, mas servem para nossos aplicações. Em PASCAL existem
três funções para gerar números aleatórios,
Random,
Random(x)
e Randomize.
Para gerar números aleatórios entre 0 and 1 podemos usar
a função
Random. Por exemplo,
chamar a função cinco vezes poderia gerar a série
0.3354, 0.2134, 0.2200, 0.9876, 0.0230.
Se queremos números inteiros entre 0 e n-1
podemos usar as funções da secção acima: Trunc(n*Random).
Em veze de usar Trunc podemos usar a fução Random com argumento,
Random(n),
o que retornerá exactamente a mesma coisa, um valor inteiro
entre 0 e n-1.
Nota que cada vez o programa corre, o resultado será igual. A
função gerará cada vez a mesma série. Para
evitar isso podemos chamar
Randomize.
código PASCAL
PROGRAM RandomNumbers;
Var x, y: real;
i: integer;
begin
Randomize;
for i := 1 to 5 do
Writeln(Random:0:4);
for i := 1 to 5 do
WriteLn(Random(10));
end. |
output
0.7132
0.5111
0.0638
0.7837
0.3810
8
5
0
8
1 |
Com estas funções podemos escrever programa de jogos com
cartas, simular trânsito nas estradas, simular decay nuclear ou qualquer
outro processo aleatório. A função Random é
homogénio, o que significa que cada número entre 0 e 1 tem
a mesma probabilidade de ser gerado. Se queremos outras distribuições
podemos usar a função Random como função da
fonte. Nas outras cadeiras de programação vão apredender
isto. Quem já quer saber mais, eu recomendo o livro "Numerical Recipes
in Pascal" (ou C ou Fortran).
Quick Test
Para testar o seu conhecimento, sobre o que aprendeu nesta aula, clique
aqui
para um teste on-line.
Peter Stallinga. Universidade do Algarve, 17 março
2002