Ir ao conteúdo
  • Cadastre-se

Transformar double em int


eliumoraes
Ir à solução Resolvido por CiroboyBR,

Posts recomendados

Saudações galera, 

 

Meu professor pediu para resolver todos os problemas de iniciante no URI e faz alguns dias que estou batendo a cabeça com o ex(https://www.urionlinejudge.com.br/judge/pt/problems/view/1098). Minha dificuldade é para transformar o double em int e fazer a comparação, eu tentei resolver utilizando "for", ele até funciona nos dois primeiros casos, quando i vale zero e quando i vale um, porém no terceiro caso ele não entra na condicional, quando i vale 2:

 

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

int main(){
	int ii, jj, c;
	double i,j=1;
	
	for(i=0;i<=2;i=(i+0.2)){
		
		for(c=0;c<3;c++){
			
			ii = (int)round(i);
			jj = (int)round(j);

			
			if(i==ii){
				printf("I=%d J=%d\n",ii,jj+c+ii);
			}
			else{
				printf("I=%.1lf J=%.1lf\n",i,j+c+i);
			}
			
		}
		
		
	}
	
	return 0;
	
}

Para tentar entender o problema eu fiz um pequeno código que vai subindo de zero até 2, somando sempre 0.2 e verificando se a parte decimal (double) é exatamente igual a parte inteira (int), mas o código diz que 2.00 não é igual  a 2, como podem ver no exemplo:

 

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

int main(){
	
	double a;
	int b,c;
	
	for(a=0;a<=2;a=(a+0.2)){
		
		for(c=0;c<3;c++){
			
			b = (int)floor(a);
			
			if(b>=a) printf("IGUAL:\n");
			
				printf("A = %.2lf\n",a);		
				printf("B = %d\n\n",b);		
		
					
		}
		
		
	}
	
	
}

A transformação eu tentei com floor e round, mas o erro continua em ambos os casos. Alguém poderia me ajudar por gentileza?

Link para o comentário
Compartilhar em outros sites

  • Solução

@eliuccb Eu resolvi essa questão criando um limite superior e inferior para o numero. Pensa bem, a variável é incrementada de 0.2 em 0.2, e o erro na precisão do float é coisas de 0.00000001 . Basta você criar 2 variáveis uma limite_inferior e outra limite_superior. ai você adiciona nelas o valor da do contador e + 0.100 no limite superior, e -0.100 no limite inferior. Depois quando for comparar você não usa igualdade, você compara se o valor esta entre esses 2 limites, se o valor estiver dentro dos limites, você imprime o inteiro, se estiver fora, você imprime a casa decimal.

tipo assim:

      limiar_a = i - 0.100;
      limiar_b = i + 0.100;
      
      if (ii > limiar_a && ii < limiar_b)
        printf("I=%.0f J=%.0f\n",i ,j+i);
      else
        printf("I=%.1f J=%.1f\n",i ,j+i);

Nesse código, ii é um int que recebeu i, simplesmente por atribuição " int  ii = i", o i é um contador do tipo float

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@CiroboyBR Muito obrigado pela ajuda. Tentei fazer do jeito que você falou, descobri que se for double não funciona e se for float ele conta errado, então tive que aumentar fazer contar de 0 até 2.2 para dar 2:

#include <stdio.h>

int main(){
	int ii,c;
	float i,j=1,la,lb;
	
	for(i=0;i<=2.2;i=(i+0.2)){
		
		for(c=0;c<3;c++){
			
			ii = i;
			la = i - 0.100;
			lb = i + 0.100;
						
			if(ii>la && ii<lb){
				printf("I=%.0f J=%.0f\n",i,j+c+i);
			}
			else{
				printf("I=%.1f J=%.1f\n",i,j+c+i);
			}
			
		}
		
		
	}
	
	return 0;
	
}

Mesmo que o problema tenha sido resolvido lá no URI eu não consegui entender o motivo de ter que contar assim e o motivo do double não dar certo.

Link para o comentário
Compartilhar em outros sites

Esse exercício é pouco claro... no exemplo da a perfilar 2 caminhos possíveis, o que você tomou, que ao parecer é o mais obvio, porém ja pensou que o final poderia ser:

I=2 J=1.6
I=2 J=2.6
I=2 J=3.6

 

 

 

No seu exercicio j sempre deve incrementar em 0.2 porém como você chegou a essa conclusao? Não da para tomar uma decisão baseado no exemplo disponivel pois sabemos que existe 2 iteraçoes:

I=0 J=1
I=0 J=2
I=0 J=3
I=0.2 J=1.2
I=0.2 J=2.2
I=0.2 J=3.2

 

Mas que acontece nas seguintes iterações? Poderia ser que siga até.... 

I=0.2 J=1.2
I=0.2 J=2.2
I=0.2 J=3.2
I=0.4 J=1.4
I=0.4 J=2.4
I=0.4 J=3.4
I=0.6 J=1.6
I=0.6 J=2.6
I=0.6 J=3.6
I=0.8 J=1.8
I=0.8 J=2.8
I=0.8 J=3.8 <- esse ponto

 

E que acontece aqui? A j vale 4.0? ou j vale 1.0? Está completamente seguro do que está fazendo. porque eu não estou muito. Para você fazer uma ideia do que estou falando te deixo um exemplo:

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

int main (){
    const float incremento = 0.2f;
    float i=, j=1.0f, n=;
    
    for ( i=i; i<2+incremento/*i<2.2*/; i+=incremento/*iincrementa em 0.2*/, ((n>1)? (n=):(n+=incremento))/*Essa parte é discutivel(Exemplo mal explicado)*/ ) {
        for ( j=1+n; j<4; j++ ) {
            printf("I=%.1f J=%.1f\n", i, j);
        }
    }

    getchar();
    return ;
}

Deixo constância que apostaria pelo mesmo caminho que você tomou perante a duvida, porém com o exemplo ilustrado não da para tomar uma decisão 100% fiável. você não acha?

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@vangodp Boa vango. faz todo sentido. Como não pensei nisso antes? kkkk

 

@eliumoraes O motivo desse incremento 0.2 dar erro é devido há um problema na arquitetura dos computadores. O problema é relativo a maneira que o computador utiliza pra fazer os cálculos de ponto flutuante nos números binários. Se você estuda computação, lá em Arquitetura de computadores você vai ver isso.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@vangodp , acho que a confusão é porque ele sempre demonstra utilizando o J, mas para cada I é como se ele tivesse uma contagem diferente. Eu observei que em cada vez que ele acrescenta 0.2 o I é repetido 3 vezes já o J é como se fosse três J diferentes, um que conta de 1 a 3, outro de 2 a 4 e um último de 3 a 5.

 

@CiroboyBR Muito obrigado, na verdade eu faço Mecatrônica, mas irei perguntar ao professor sobre isso.

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...

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!