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