Ir ao conteúdo
  • Cadastre-se

Dúvida em programa C


Ir à solução Resolvido por isrnick,

Posts recomendados

#include <stdio.h>main (){    float a,b,c;    scanf ("%f%f%f",&a, &b, &c);    if (a>=b+c || b>=a+c || c>=a+    {        printf ("n\n");    }    else    {        if(a>=b && a>=c){            if((a*a) == (b*+(c*c)){                printf("r\n");            }            else if((a*a)<(b*+(c*c)){                printf("a\n");            }            else if((a*a)>(b*+(c*c)){                printf("o\n");            }        }        else if(b>a && b>c){               if((b* == (a*a)+(c*c)){                printf("r\n");            }            else if((b*<(a*a)+(c*c)){                printf("a\n");            }            else if((b*>(a*a)+(c*c)){                printf("o\n");            }        }        else if(c>a && c>{               if((c*c) == (b*+(a*a)){                printf("r\n");            }            else if((c*c)<(b*+(a*a)){                printf("a\n");            }            else if((c*c)>(b*+(a*a)){                printf("o\n");            }        }    }}

Era pra o programa fazer os cálculos e dizer se o triangulo é retangulo,acutangulo ou obtusangulo. Porém, ainda não entendi o por que dele,em alguns casos, não calcular corretamente. Por exemplo, se a entrada for: "6 6.1 1.1", era pra ele retornar "r", que é retangulo, mas ele retorna "a", acutangulo. Alguém pode me dizer o que está errado?

Link para o comentário
Compartilhar em outros sites

  • Solução

O problema é que você está comparando números com pontos flutuantes... Embora esses números (nesse caso b*b e a*a+c*c) sejam impressos como iguais, eles na verdade não são completamente iguais na memória, bit a bit, há um grau de imprecisão nas operações matemáticas diferentes que resultam em números armazenados na memória ligeiramente diferentes, portanto a comparação == não é avaliada como VERDADEIRA...

 

O melhor modo de comparar números com pontos flutuantes é trabalhar com erros.

 

Por exemplo: Desejamos comparar as variáveis float var1 e var2, para isso devemos então admitir uma margem de erro máximo, como ERRO = 0.000001, e então verificamos se a diferença entre as duas variáveis é menor que a margem de erro, se for menor então var1 é igual a var2, caso contrário eles são diferentes...

 

No caso faríamos as comparações assim:

if (abs(var1 - var2) <= ERRO){   // var1 == var2}if(var1 - var2 > ERRO){   // var1 > var2}if(var1 - var2 < -ERRO{   // var1 < var2}
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...