Ir ao conteúdo

Transformar double em int


Ir à solução Resolvido por Visitante,

Posts recomendados

Postado

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?

  • Solução
Postado

@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

Postado

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

Postado

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

Postado

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!