INF1018 - Software Básico

Representação de Ponto Flutuante (extra)

  1. Compile e execute o programa abaixo, verificando sua saída:
    #include <stdio.h>
    #include <math.h>
    
    int main() {
      int i = 16777216; /* 2^24 */
      float f = 16777216.0;
      double d = 16777216.0;
    
      printf("[2^24]:\ti = %d f = %f d = %f\n",i,f,d);
    
      i++;
      f++;
      d++;
      printf("[+1]:\ti = %d f = %f d = %f\n",i,f,d);
    
      i = 536870912; /* 2^29 */
      f = 536870912.0;
      d = 536870912.0;
      printf("\n[2^29]:\ti = %d f = %f d = %f\n",i,f,d);
    
      i+=32;
      f+=32.0;
      d+=32.0;
      printf("[+32]:\ti = %d f = %f d = %f\n",i,f,d);
    
      i = 536870912;
      f = 536870912.0;
      d = 536870912.0;
      i += 64;
      f += 64.0;
      d += 64.0;
      printf("[+64]:\ti = %d f = %f d = %f\n",i,f,d);
      return 0;
    }
    
    O que aconteceu? Conhecendo a representação de valores de ponto flutuante no padrão IEEE-754, como você explica esse resultado? (Escreva no papel a representação dos valores dados em float e double para dar sua resposta.)

  2. Escreva uma função compara que recebe dois valores de ponto flutuante do tipo float e retorne um inteiro:
    • igual a 0, se os dois valores são iguais
    • menor que 0, se o primeiro valor é menor que o segundo
    • maior que 0, se o primeiro valor é maior que o segundo

    Sua função deve fazer a comparação manipulando as representações dos valores! Para extrair as partes da representação de um valor de ponto flutuante você pode usar, novamente, as macros fornecidas aqui.

    O protótipo da função é:

    int compara(float f1, float f2);
    

    Uma sugestão de main para testar suas funções de conversão está aqui.