Aula 9
--------------------------------------------
Representação em vírgula flutuante
Tabelas
Raízes pelo método das bissecções sucessivas
Integral definido
--------------------------------------------
O tipo float e double
Norma: trabalhar sempre com double, %lf
double %lf %le
sizeof(double)
printf("%d %d %d\n",sizeof(int),sizeof(float),sizeof(double));
double rad;
scanf("%lf",&rad);
printf("%lf\n",rad);
......
-----------------------------------------------------
Exercício
-----------------------------------------------------
Imprimir uma tabela de senos e cosenos para os ângulos
0, 10, ..., 180 com o seguinte formato
x seno coseno
--------------------------------
0 0.000000 1.000000
10 0.173648 0.984808
... ........ ........
180 -0.000003 -1.000000
Notas:
No início: #include <math.h>
Compilação: gcc -lm tab.c
Nas funções do sistema sin(), cos(),... os ângulos são e radianos
PI = 3.1415927
seno.c
-----------------------------------------------------
Exercício
-----------------------------------------------------
Escreva um programa que determine experimentalmente de forma aproximada
o maior "double" representável / ...o menor...
Método: inicie x=1; imprima x e multiplique por (p. ex.) 2
até ocorrer "overflow". Como é que se verifficou o "overflow"?
max.c
-----------------------------------------------------
Exercício
-----------------------------------------------------
Método das bissecções sucessivas para determinar uma raíz
---------------------------------------------------------
Escreva um programa que determine de forma a raiz de uma equação
f(x)=0
onde f() é uma função do programa, por exemplo
double f(double x){
return(sin(x)-cos(x));
}
São dados os limites a, b, entre os quais a raiz se encontra e
o erro máximo tolerável.
Em cada passo:
- determina-se m=(a+b)/2;
- se o sinal de m é igual ao de a, faz-se a=m
- caso contrário, faz-se b=m
até |a-b|<erro.
O programa escreve no fim a (ou b, ou (a+b)/2).
Se houver mais que uma raíz? Experimentar... como proceder...
-----------------------------------------------------
Exercício
-----------------------------------------------------
Seja f(x) não negativa em [a,b]. Um método aproximado de calcular
a área entre [a,b] e f(x) é
- dividir [a,b] em n intervalos
[a,a+h], [a+h,a+2h],..., [a+(n-1)h,b]
- somar a contribuição de cada parte
(f(a+ih)+f(a+(i+1)h))/2*h
f(a+ih) ........
|\
| \
| \
| \.............. média
| \
| \
| \
f(a+(i+1)h)... | ......|
| |
| |
| | Área do trapézio:
| | (f(a+ih)+f(a+(i+1)h))/2*h
| |
| h |
----------------------------------------
a a+h a+2h a+3h ....... b
Escreva um programa contendo a função f() que, dados a, b e n
determine a área referida.
Esquema:
s=0.0;
for(i=0;i<n;i++)
s = s + (f(i*h)+f((i+1)*h))/2 * h;
Experimente com f(x)=c0s(x), a=0, b=pi/2 = 1.570796, n=100.
O resultado exacto é 1.
PC/PI - página reservada - versão 2005.02.08