Ir para conteúdo
Fórum Script Brasil
  • 0

Problema com divisão


Rômulo Fraga

Pergunta

Olá! Por favor, alguém poderia me ajudar? Estou tendo problema com a divisão do código abaixo, se coloco 5/9 o resultado sempre é 0, mas se troco a divisão pelo resultado dela (0,55) o programa funciona normalmente. Por que ele não funciona com 5/9, mas funciona 0,55?

#include <stdio.h>
int main()
{
    int i, fah, cel;
    i=20;
    fah=0;
    cel=0;
    while(fah<=300)
    {    
        cel = 5/9*(fah-32);
        printf("Temperatura Fahrenheit: %d - ", fah);
        printf("Temperatura Celsius: %d \n",cel);
        fah = fah + i;
    }
    return 0;
}

Editado por Rômulo Fraga
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Se você for na calculadora do windows e fazer 5/9, no modo normal vai sair 0.55555.... como resultado:
Screenshot_2.jpg.1a6e87bb1f8796cd1ccf917e0ce27e83.jpg

Mas isso é no modo padrão da calculadora.
Screenshot_2.jpg.1a6e87bb1f8796cd1ccf917e0ce27e83.jpg

 

Porem si mudamos para o modo "Programador":
Screenshot_3.jpg.32d3297880e1455faf014fe1d40269ec.jpg

Essa mesma expressão matemática da como resultado 0.
Screenshot_4.jpg.9a66aa08a29be050a039a96074b463e4.jpg

Tá errado? Não! Isso é por causa do tipo de dado e as conversões de forma explicitas que acontecem na linguagem de programação.
Quando eu divido 5/9 eu divido um valor que é 5, por outro que é um inteiro, que é o 9; então eu tenho algo dividido por um inteiro, e o valor sempre será um inteiro. Seria um disparate se eu dividir algo por um int e me desse como resultado um char não é?shueseh.
Para arrumar esse problema e gerar o tal 0.555555... com decimais, preciso dizer para o compilador de forma IMPLÍCITA(tinha errado aqui sry) que quero fazer a divisão de algo por um numero real(float); e essa forma é indicando que se trata de um literal real() ou fazendo um casting desta forma: 5/9.0


Então algumas formas de faze-lo de forma correta são:
 

#include<stdio.h>
#include<stdlib.h>

int main(){
    float r = 5/9;
    printf("Erro de lógica: %f\n", r); //Incorreto. Por muito que você queira dividir 5 por 9(um valor por int) o resultado sempre será um int

    r = 5/9.0;
    printf("Correto: %f\n", r); //Correto. Estou dividindo algo por um valor real(mesmo ele sendo literal). O compilador toma o 9 como se fosse um double.

    //r = 5/9f; //Somente funciona em C++
    //printf("Correto: %f\n", r); //Correto. Estou dividindo algo por um valor real(mesmo ele sendo literal). O compilador toma o 9f como se fosse um float pois indico de forma explicita

    r = 5/(float)9; //Indicamos de forma explicita para o compilador que o 9 se trata de um float e não de um int. É considerado boa pràtica de programação pois indicamos que se trata de um (float)9 e que temos o programa baixo controle todo o tempo.
    printf("Correto: %f\n", r); //Correto. O resultado de dividir algo por um float é sempre um float. O resultado deve ser guardado em outro float, si não pode perder a parte decimal si o resultado for guardado em um int por exemplo, pois acontecerá um cast implicito neste caso e isso foge ao controle do programador gerando resultados erroneos.

    int r2 = 5/(float)9;
    printf("Incorreto: %d\n", r2);// Como podemos ver, si guardamos um float em um int perdemos a parte decimal e ficamos com um zero(comentado no exemplo anterior).

    //curiosidade.
    //Si imprimimos r2 como um float el resultado aparentemente é correto porem isso se deve a que em memoria um float no meu sistema ocupa o mesmo que um int porem se nos detemos a olhar os resultados tem diferenças e isso pode gerar programas imprecisos.
    printf("Incorreto: %f\n", r2); //Incorreto!!! r2 é um int não um float
    
    return 0;
}

note que ao imprimir r2 como um float mesmo ele sendo um int pode parecer que gera resultados corretos, mas realmente isso é devido a que em alguns sistemas um float ocupa o mesmo que um int, então digamos que a nível de bits ambos tem a mesma quantidade de bits, e por isso da a impressão de funcionar correto mas não é assim se você guardou o resultado em um int deve imprimi-lo como um int.

Screenshot_5.jpg.0b59df02954630d5dc1a44c5d95ceee5.jpg

Screenshot_1.jpg

Meu conselho é que aprenda mais sobre castings(conversões de tipos), tanto implícita como explicitamente, e também sobre Literais.

Meu conselho é que aprenda mais sobre castings(conversões de tipos), tanto implícita como explicitamente, e também sobre Literais.

Editado por vangodp
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...