Professional Documents
Culture Documents
2 Aritmtica Racional
Nmeros racionais so nmeros que podem ser representados como a razo de
dois inteiros, i.e. qualquer nmero p/q onde p e q so inteiros um nmero raci-
onal. A linguagem C aproxima nmeros no-inteiros racionais usando nmeros
de ponto-flutuante (floats e doubles), mas esses tipos so representaes impre-
cisas. Para esse EP, voc representar nmeros racionais com uma estrutura
com dois inteiros:
typedef struct {
unsigned long num;
unsigned long den;
} Rational;
1
Rational a, b, c;
a = RATinit(1,3);
b = RATinit(1,4);
c = RATadd(a, b);
RATshow(c);
typedef struct {
unsigned long num;
unsigned long den;
} Rational;
#include "RAT.h"
2
Passo 2
Escreva um programa e.c que usa as implementaes das funes do Rational
para calcular uma aproximao racional para e (nmero de Euler), usando a
expanso da srie de Taylor
1 1 1 1 1 1
e= + + + + + + ...
0! 1! 2! 3! 4! 5!
.
Leia um inteiro n da entrada padro usando scanf() e imprima as n pri-
meiras aproximaes. Por exemplo, a sada para n = 6 :
#include "RAT.h"
Agora, voc pode usar variveis do tipo Rational no seu programa cliente,
mas certifique-se de manipular seu tipo de dado apenas atravs das
funes definidas na interface. Lembre-se de adicionar o arquivo rat.c em
seu processo de compilao.
Passo 3
Uma implementao ingnua da interface de aritmtica de racionais possui um
problema chamado de transbordamento aritmtico (arithmetic overflow ) que
ocorre quando uma operao aritmtica de inteiros produz um nmero que ne-
cessita de mais bits (i.e. um nmero com muitos dgitos) para ser representado
do que o computador est utilizando para armazen-lo . impossvel evitar o
transbordamento aritmtico, mas possvel reduzir sua ocorrncia. Por exem-
plo, no quarto termo do exemplo acima, tanto o numerador quanto o denomi-
nador so divisveis por 4, ento podemos simplificar o termo 32 8
12 para 3 , que
possui nmeros que necessitam de menos bits para serem representados.
Desenvolva uma implementao melhorada ratbetter.c que minimiza trans-
bordamento (overflow ) aritmtico atravs do algoritmo de Euclides [2], usando-o
para modificar sua implementao para aderir conveno que funes somente
retornam nmeros racionais cujos numeradores e denominadores so relativa-
mente primos.
Obs: mesmo com a simplificao das fraes, o problema de transborda-
mento aritmtico ainda pode ocorrer mesmo em casos que as fraes simplifi-
cadas podem ser armazenadas. Isso ocorre porque tanto as somas quanto os
produtos obtidos pelas funes de aritmtica racional podem transbordar, ge-
rando resultados errados. Por exemplo, ab dc igual ao valor reduzido de acbd ,
3
mas tanto ac quanto bd podem transbordar antes da reduo, mesmo que a res-
posta reduzida possa ser representada sem problemas (por exemplo, o mtodo
40 26
direto de calcular 2325 3241 = 32 transbordaria, pois as duas fraes sendo multi-
plicadas j esto em sua forma simplificada e os valores de 240 326 e 325 241
ultrapassam o valores mximo do tipo unsigned long). Similarmente, ab + dc
igual ao valor reduzido de (ad+bc)
bd , mas tanto ad + bc quanto bd podem trans-
bordar antes da reduo, mesmo que a resposta reduzida possa ser armazenada
sem problemas. possvel otimizar as operaes para contornar este tipo de
problema mas, para este EP, tal otimizao pode ser ignorada.
Passo 4
Escreva um programa cliente sqrt.c que calcule uma aproximao racional da
raiz quadrada de um nmero S utilizando o metdo babilnico [3] conforme
mostrado abaixo:
(
xn = 21 xn1 + xn1
S
, se n > 0
S
x0 , se n = 0
Seu programa deve ler um valor inteiro S 0, um valor inteiro n 0 e um
chute inicial racional
x0 0 para a aproximao e calcular o valor racional
aproximado de S utilizando o metdo acima. Por exemplo, para S = 2, n = 4
e x0 = 11 , sua sada deve ser:
665857/470832
4 Compilao e Submisso
Use os seguintes parmetros para compilar seu cdigo:
4
Referncias
[1] R. Sedgewick, Programming Assignments - Rational Arithmetic.
http://www.cs.princeton.edu/courses/archive/spr03/cs126/
assignments/rat.html, 1999. [Online; acessado dia 21 de maro de
2017].
[2] Wikipedia, Euclidean algorithm . https://en.wikipedia.org/wiki/
Euclidean_algorithm#Implementations. [Online; acessado dia 29 de
maro de 2017].
[3] Methods of computing square roots. https://en.wikipedia.org/wiki/
Methods_of_computing_square_roots. [Online; acessado dia 21 de maro
de 2017].
[4] Perguntas e Respostas mais Frequentes sobre Compilao . http:
//vision.ime.usp.br/~ronaldo/mac0122-2017/compilacao/. [Online;
acessado dia 29 de maro de 2017].