Ir ao conteúdo
  • Cadastre-se

Variável tipo float retornando zero negativo


GuiRitter

Posts recomendados

Olá galera do fórum!

Criei este código como parte de uma lista de exercícios. O código em sí é fácil e funciona perfeito, com uma exceção...

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

float a,b,c,d,r1,r2;

main(){
printf("Insira a,b e c de uma equacao de 2o. grau: \n");
scanf("%f",&a);
scanf("%f",&;
scanf("%f",&c);
if(a != 0){
d = pow(b,2) - 4 * a * c;
if(d >= 0){
r1 = (-b + sqrt(d))/ 2 * a;
r2 = (-b - sqrt(d))/ 2 * a;
if(r1 == r2){
printf("A equacao possui uma raiz dupla, igual a %f\n",r1);
}else{
printf("A equacao possui raizes iguais a %f e %f\n",r1,r2);
}
}else{
printf("A equacao possui raizes complexas\n");
printf("%f\n",d); // linha de debug, retorna -0.000000
}
}else{
printf("A equacao nao e' de segundo grau\n");
}
system("pause");
}

Se for inserido 1, -10 e 25, deveria retornar raíz dupla 5, como comprovado matematicamente, pois o delta dá 0. Mas na execução do programa, ao invés de informar a raíz ele informa que as raízes são complexas (delta < 0). Com aquela linha de debug eu ví que ele retornou -0.000000. E o programa não reconhece -0 no IF. O que eu faço?

Link para o comentário
Compartilhar em outros sites

Insira a,b e c de uma equacao de 2o. grau: 
1
-10
25
a: 1.000000 b: -10.000000 c: 25.000000
d: 0.000000
r1: 5.000000
r2: 5.000000
A equacao possui uma raiz dupla, igual a 5.000000

Não mudei nada no código, apenas coloquei uns printfs pra conferir os valores de a, b, c e d mesmo. Compilei no gcc.

Pelo que eu li, parece que a função sqrt reconhece apenas valores 'double' em vez de 'float' em alguns compiladores e portanto isso poderia ser a causa do erro.

Tente encher o seu código de printfs pra conferir os valores em todos os pontos e se puder tente testar o código em outro compilador.


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

float a,b,c,d,r1,r2;

int main(){
printf("Insira a,b e c de uma equacao de 2o. grau: \n");
scanf("%f",&a);
scanf("%f",&;
scanf("%f",&c);
printf("%f %f %f\n", a, b, c);

if(a != 0){
d = pow(b,2) - 4 * a * c;
printf("d: %f\n", d);
if(d >= 0){
r1 = (-b + sqrt(d))/ 2 * a;
printf("r1: %f\n", r1);
r2 = (-b - sqrt(d))/ 2 * a;
printf("r2: %f\n", r2);
if(r1 == r2){
printf("A equacao possui uma raiz dupla, igual a %f\n",r1);
}else{
printf("A equacao possui raizes iguais a %f e %f\n",r1,r2);
}
}else{
printf("A equacao possui raizes complexas\n");
printf("%f\n",d); // linha de debug, retorna -0.000000
}
}else{
printf("A equacao nao e' de segundo grau\n");
}

return 0;
}

Link para o comentário
Compartilhar em outros sites

Eu tentei utilizar o Turbo C, mas não achei uma versão que funcionasse e a minha parou de funcionar. Tentei várias coisas até me tocar de que a sua resposta não faz sentido.

"Pelo que eu li, parece que a função sqrt reconhece apenas valores 'double' em vez de 'float' em alguns compiladores e portanto isso poderia ser a causa do erro."

d recebe -0 antes do programa chegar na parte que involve sqrt. Observe meu programa:

d = pow(b,2) - 4 * a * c; // d recebe -0
if(d >= 0){ // o valor de d é checado; a condição do if retorna 0
r1 = (-b + sqrt(d))/ 2 * a; // esta linha não é lida, pois a condição do if retornou 0

Obs¹.: Me liguei que o correto é r1 = (-b + sqrt(d)) / (2 * a); , me esquecí dos parênteses, mas não faz diferença no erro.

Obs².: Me liguei também que o correto é d = pow(b,2) - (4 * a * c); , mas esta alteração não deu diferença no cálculo. Neste caso, 100 - 100 continua igualando a -0.

Obs³.: Criei duas variáveis auxiliares, que recebem o valor de cada metade do valor do delta. É regra que sempre que estes valores forem iguais delta será 0. Coloquei a condição dos dois serem iguais no if descrito acima, e aí sim ele entra no cálculo das raízes, mas retorna raíz dupla iguai a -1.#IND00 WTF???

d = pow(b,2) - (4 * a * c);
aux1 = pow(b,2);
aux2 = 4 * a * c;
if(d > 0 || aux1 == aux2){
r1 = (-b + sqrt(d))/ (2 * a);
r2 = (-b - sqrt(d))/ (2 * a);

Link para o comentário
Compartilhar em outros sites

Eu tentei utilizar o Turbo C, mas não achei uma versão que funcionasse e a minha parou de funcionar. Tentei várias coisas até me tocar de que a sua resposta não faz sentido.

??????

Na minha resposta eu disse apenas que o código rodou normalmente. Não houve problema nenhum. Como a sintaxe do código estava correta, eu busquei no google informações sobre as duas únicas funções que você usou no código, e que poderiam estar criando algum problema, a pow() e a sqrt().

Foi então que eu li que a sqrt() é implementada de modo bugado em alguns compiladores e recomendei que você testasse em outros.

Nesse site é possível compilar códigos em c:

http://codepad.org/MzJvvKdo

Eu compilei e rodei o código e ele também rodou normal, mostrando os resultados que você esperava.

Insira a,b e c de uma equacao de 2o. grau:

a:1.000000 b:-10.000000 c:25.000000

d: 0.000000

r1: 5.000000

r2: 5.000000

A equacao possui uma raiz dupla, igual a 5.000000

Espero que a resposta tenha feito sentido agora.

Link para o comentário
Compartilhar em outros sites

Eu disse que não fazia sentido pois você disse que o problema estava no sqrt, mas o programa nem chegava lá. Mas, você está certo, é problema do DEV-C++, pois eu também rodei o código nesse site e rodou legal. Mas eu realmente gostaria de poder rodá-lo no DEV. Acho que vou dar uma pesquisada no site deles e/ou fazer um update.

Muito obrigado mesmo assim, pelo menos agora eu sei onde está o problema e ainda descobrí um ótimo site!

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Olá GuiRitter, também estou com esse problema (zero negativo) qual foi a solução? Tb uso o DEV.

Olá, talvez faça tempo sobre essa discussão, mas fiz um programa em C, até que básico, sem usos de muitas funções, nem a library math.h utilizei.

Sei que ele tá retornando para uma variável float, zero negativo -0.00000000 e cara... já olhei de tudo no programa e não é nada no programa.... engraçado que fiz outro programinha para testar e se a gente faz a conta direto usando por exemplo 0/-8 não dá negativo. Agora no outro programa, que o divisor é encontrado de acordo com o programa, quando cai em algo do tipo (0/(numero negativo) ai sai -0.00000000

Qual foi a explicação que você encontrou?

Abração e aguardo sua resposta!!!

Link para o comentário
Compartilhar em outros sites

O problema não é do DEV-C++, ele é só uma IDE, o máximo que ele faz é ser um editor de texto e chamar o seu compilador, esse sim é quem traduz o seu código e pode introduzir esse comportamento estranho. Tente o minGW se estiver no windows ou o gcc se estiver em algum *nix, o que provavelmente já estaria instalado dependendo da sua distribuição.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!