Mat01099 - Seminário Integrador III - UFRGS

Prof. João Batista Carvalho

representação de números reais em máquinas digitais: o padrão IEEE 754

Nos computadores atuais, números reais são representados usando um sistema de representação chamado sistema ponto flutuante, seguindo o padrão IEEE 754 (criado em 1985, atualizado em 2008), considerado nas definições a seguir.

Um número ponto-flutuante não-nulo normalizado $x$ em base 2 tem a forma:

$\displaystyle x = (-1)^s 0.1d_2d_3\dots d_p 2^E , d_i=0 \mbox{\ ou \ } 1;
\mbox{ para } 2 \leq i \leq p $
ou seja, ele é representado pelos $p$ algarismos binários $(s,d_2,d_3,\dots,d_p)$ e por uma potência $E$, também em binário. De outra forma,
$\displaystyle x = \pm M 2^E$
onde $M$ é a mantissa, $E$ é o expoente, $p$ é o parâmetro de precisão. Pelo padrão IEEE, o expoente $E$ pode ser qualquer número inteiro entre um mínimo $L$ e um máximo $U$. Valores recomendados são

Em ambiente computacionais como Matlab, Maple e Scilab, precisão dupla é adotada por padrão. Uma vez que a base decimal é a que compreendemos e vivenciamos, é importante conhecermos a quantos algarismos decimais (dígitos) corresponde o padrão $p=53$ (precisão dupla) em binário, bem como para o caso $p=24$ (precisão simples).

Tarefas:

  1. Usando format, em Scilab, podemos estabelecer quantos dígitos são mostrados na tela do computador. Descubra como format funciona, e também o número máximo de casas significativas corretas que a mantissa de um número real precisão dupla pode ter, imprimindo dízimas periódicas $u=1/3$ e $u=1/9$ na tela do Scilab.
  2. Descubra, em Scilab, qual a menor potência de $10$ que pode ser adicionada ao número $u=1$ e ainda resultar em um número diferente deste.
  3. Descubra, em Scilab, qual a menor potência de $10$ que não é convertida (arredondada) para zero.
  4. Descubra, em Scilab, qual a maior potência de $10$ possível.
  5. Repita as tarefas anteriores usando a linguagem FORTRAN 90 em ambiente de precisão simples, a partir do protótipo abaixo (template):

program teste1
  integer :: i
  real   :: u
!
!  definimos u variavel real de precisao simples
!  alternativamente, usariamos   double precision u
! 
  write(*,*) 'Mat01099 - Seminario Integrador III'
  i = 1
  u = 1.0/3
  write(*,'(a,i2,a,x,f20.18)') 'i=',i,', u=',u
end program



Joao Batista Carvalho 2014-03-06