Não entra no if ( inic == 0 ) [RESOLVIDO]

1. Não entra no if ( inic == 0 ) [RESOLVIDO]

Felipe Oliveira de Sena
felippesena

(usa Fedora)

Enviado em 25/04/2012 - 09:59h

Bom dia pessoal, alguem sabe me dizer pq loop não entra no Zero ( if(inic < 0.0) )?
pois quando chega no zero ele pula para MAIOR que sero ( else if ( inic > 0.0 ) ) !

#include<stdio.h>
void main(){
double inic =-9.00;
int i;
printf(" Valor Inicia = -9.00 - ");
printf(" Incremento de + 0.90\n");
printf("Entre com numero de vezer o que sera incrementado = 15 \n");

for(i = 15; i>= 0; i--){
inic = inic + 0.90;
if(inic < 0.0){
printf("MENOR que zero - valor = %f\n", inic);
}
else if (inic == 0.0){ // Não entra Nesse Loop
printf(" ****IGUAL a zero - valor = %f*****\n", inic);
}
else if ( inic > 0.0){
printf("MAIOR que Zero - valor = %f\n", inic);
}
}
}


  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/04/2012 - 11:18h

Você não está fazendo nada de errado. Como falei são questões de arredondamento. Não sou um escovador de bits mas aposto na mudança do sinal negativo para positivo que gera uns bits na parte menos significativa do número. A mudança para float apenas vai deixar o número para mais perto do 0, mas ainda não será um zero. Vai ser algo em torno de 1.55431e-7. Se você colocar um print em inic antes da formatação vai verificar isso.

3. Re: Não entra no if ( inic == 0 ) [RESOLVIDO]

Bruno Rogério Fernandes
brunorf

(usa Arch Linux)

Enviado em 25/04/2012 - 10:07h

Uai, como assim não entra? Testei aqui o código e funcionou normal:

saída:

Valor Inicia = -9.00 - Incremento de + 0.90
Entre com numero de vezer o que sera incrementado = 15
MENOR que zero - valor = -8.100000
MENOR que zero - valor = -7.200000
MENOR que zero - valor = -6.300000
MENOR que zero - valor = -5.400000
MENOR que zero - valor = -4.500000
MENOR que zero - valor = -3.600000
MENOR que zero - valor = -2.700000
MENOR que zero - valor = -1.800000
MENOR que zero - valor = -0.900000
MAIOR que Zero - valor = 0.000000
MAIOR que Zero - valor = 0.900000
MAIOR que Zero - valor = 1.800000
MAIOR que Zero - valor = 2.700000
MAIOR que Zero - valor = 3.600000
MAIOR que Zero - valor = 4.500000
MAIOR que Zero - valor = 5.400000



4. Re: Não entra no if ( inic == 0 ) [RESOLVIDO]

Felipe Oliveira de Sena
felippesena

(usa Fedora)

Enviado em 25/04/2012 - 10:18h

Se vc verificar não entra no loop
else if (inic == 0.0)... pq deveria parecer a messagem
printf("IGUAL a zero - valor = %f\n", inic);

ele pula direto para maior que zero, vc sabe pq?


5. Re: Não entra no if ( inic == 0 ) [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/04/2012 - 11:01h

São questões de arredondamento. O valor que você espera que seja 0 na verdade é 1.55431e-15. Como você está formatando a saída para um float, a formatação simplesmente desconsidera os valores menos significativos e mostra ele sendo como 0.


Entre com numero de vezer o que sera incrementado = 15
Valor de inic: -8.1 MENOR que zero - valor = -8.100000
Valor de inic: -7.2 MENOR que zero - valor = -7.200000
Valor de inic: -6.3 MENOR que zero - valor = -6.300000
Valor de inic: -5.4 MENOR que zero - valor = -5.400000
Valor de inic: -4.5 MENOR que zero - valor = -4.500000
Valor de inic: -3.6 MENOR que zero - valor = -3.600000
Valor de inic: -2.7 MENOR que zero - valor = -2.700000
Valor de inic: -1.8 MENOR que zero - valor = -1.800000
Valor de inic: -0.9 MENOR que zero - valor = -0.900000
Valor de inic: 1.55431e-15 MAIOR que Zero - valor = 0.000000
Valor de inic: 0.9 MAIOR que Zero - valor = 0.900000
Valor de inic: 1.8 MAIOR que Zero - valor = 1.800000
Valor de inic: 2.7 MAIOR que Zero - valor = 2.700000
Valor de inic: 3.6 MAIOR que Zero - valor = 3.600000
Valor de inic: 4.5 MAIOR que Zero - valor = 4.500000
Valor de inic: 5.4 MAIOR que Zero - valor = 5.400000



6. Re: Não entra no if ( inic == 0 ) [RESOLVIDO]

Felipe Oliveira de Sena
felippesena

(usa Fedora)

Enviado em 25/04/2012 - 11:16h

hcabzlus escreveu:

São questões de arredondamento. O valor que você espera que seja 0 na verdade é 1.55431e-15. Como você está formatando a saída para um float, a formatação simplesmente desconsidera os valores menos significativos e mostra ele sendo como 0.


Entre com numero de vezer o que sera incrementado = 15
Valor de inic: -8.1 MENOR que zero - valor = -8.100000
Valor de inic: -7.2 MENOR que zero - valor = -7.200000
Valor de inic: -6.3 MENOR que zero - valor = -6.300000
Valor de inic: -5.4 MENOR que zero - valor = -5.400000
Valor de inic: -4.5 MENOR que zero - valor = -4.500000
Valor de inic: -3.6 MENOR que zero - valor = -3.600000
Valor de inic: -2.7 MENOR que zero - valor = -2.700000
Valor de inic: -1.8 MENOR que zero - valor = -1.800000
Valor de inic: -0.9 MENOR que zero - valor = -0.900000
Valor de inic: 1.55431e-15 MAIOR que Zero - valor = 0.000000
Valor de inic: 0.9 MAIOR que Zero - valor = 0.900000
Valor de inic: 1.8 MAIOR que Zero - valor = 1.800000
Valor de inic: 2.7 MAIOR que Zero - valor = 2.700000
Valor de inic: 3.6 MAIOR que Zero - valor = 3.600000
Valor de inic: 4.5 MAIOR que Zero - valor = 4.500000
Valor de inic: 5.4 MAIOR que Zero - valor = 5.400000




felippesena escreveu:

Bom dia hcabzlus, então montei o código abaixo.
#include<stdio.h>
void main(){
float inic =-9.00;
int i;
printf(" Valor Inicia = -9.00 - ");
printf(" Incremento de + 0.90\n");
printf("Entre com numero de vezer o que sera incrementado = 15 \n");

for(i = 15; i>= 0; i--){
inic = inic + 0.90;
if(inic < 0.0){
printf("MENOR que zero - valor = %f\n", inic);
}
else if (inic == 1.55431e-15){
printf("IGUAL a zero - valor = %f\n", inic);
}
else if ( inic > 0.0){
printf("MAIOR que Zero - valor = %f\n", inic);
}
}
}

e o resultado ficou igual.

Valor Inicia = -9.00 - Incremento de + 0.90
Entre com numero de vezer o que sera incrementado = 15
MENOR que zero - valor = -8.100000
MENOR que zero - valor = -7.200000
MENOR que zero - valor = -6.300000
MENOR que zero - valor = -5.400000
MENOR que zero - valor = -4.500000
MENOR que zero - valor = -3.600000
MENOR que zero - valor = -2.700000
MENOR que zero - valor = -1.800000
MENOR que zero - valor = -0.900000
MAIOR que Zero - valor = 0.000000
MAIOR que Zero - valor = 0.900000
MAIOR que Zero - valor = 1.800000
MAIOR que Zero - valor = 2.700000
MAIOR que Zero - valor = 3.600000
MAIOR que Zero - valor = 4.500000
MAIOR que Zero - valor = 5.400001

o que estou fazendo errado? obs.. estou usando Microsolt Visual C++


7. Re: Não entra no if ( inic == 0 ) [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/04/2012 - 11:23h

Olha como fica fazendo com que inic seja do tipo float:


Valor Inicia = -9.00 - Incremento de + 0.90
Entre com numero de vezer o que sera incrementado = 15
Valor de inic: -8.1 MENOR que zero - valor = -8.100000
Valor de inic: -7.2 MENOR que zero - valor = -7.200000
Valor de inic: -6.3 MENOR que zero - valor = -6.300000
Valor de inic: -5.4 MENOR que zero - valor = -5.400000
Valor de inic: -4.5 MENOR que zero - valor = -4.500000
Valor de inic: -3.6 MENOR que zero - valor = -3.600000
Valor de inic: -2.7 MENOR que zero - valor = -2.700000
Valor de inic: -1.8 MENOR que zero - valor = -1.800000
Valor de inic: -0.9 MENOR que zero - valor = -0.900000
Valor de inic: 1.43051e-07 MAIOR que Zero - valor = 0.000000
Valor de inic: 0.9 MAIOR que Zero - valor = 0.900000
Valor de inic: 1.8 MAIOR que Zero - valor = 1.800000
Valor de inic: 2.7 MAIOR que Zero - valor = 2.700000
Valor de inic: 3.6 MAIOR que Zero - valor = 3.600000
Valor de inic: 4.5 MAIOR que Zero - valor = 4.500000
Valor de inic: 5.4 MAIOR que Zero - valor = 5.400001

Note que o valor 1.43051e-07 é um número bem próximo de zero, mas não é um zero, é maior que 0.


8. Re: Não entra no if ( inic == 0 ) [RESOLVIDO]

cr0n
_di0

(usa FreeBSD)

Enviado em 25/04/2012 - 15:00h

Na maioria dos casos, quando se trabalha com objetos com conversões doubles/float, você está lhe dando com aproximações, não com valor exato. Em razão disso, trabalhe com conversões precisas nos testes condicionais.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts