Jump to content

JSA

Members
  • Content count

    4
  • Joined

  • Last visited

Community Reputation

0 Comum

About JSA

  1. Foi questão de semântica. Não existe comparação direta entre um tipo e outro na linguagem C, por exemplo, if (float == double). Certamente comparamos o conteúdo que é moldado pelo o tipo da variável que armazena tal conteúdo. Porém, sua observação foi interessante. Escrevi de outra forma o texto para enfatizar mais ainda a questão da comparação entre os conteúdos numéricos envolvidos e suas respectivas precisões.
  2. _Isis_ o que você disse é exatamente o que eu falei no poste anterior. Não vejo diferença! Quando eu falo por padrão, estou querendo dizer, levando em consideração as regras oficiais da linguagem, como é o caso das documentadas na ISO C. Como eu falei, por padrão, literais não tipados são considerados constantes para o compilador, por exemplo, o 9.8 que se encontra na condição if. Quando um literal não tipado é um número ponto flutuante, por padrão o compilador (certamente baseando-se em regras documentadas no ISO C) encara a constante como double. Se o compilador trata 9.8 como double e inicialmente a comparação foi em relação a um 9.8 float (da variável n1), sem dúvida a comparação estava dando falso porque existia uma comparação entre números de tipos distintos, logo com precisões distintas. :)
  3. Então @x8mhz , agradeço por participar do tópico. Realmente a solução é está. Eu já tinha enxergado isto ao usar o cast antes do número (float) 9.8. E sim, a especificação de tipo do literal numérico (inserir o f após o numero real) também é uma forma de definir um tipo para o número. Legal que você tenha visto isso também. A minha maior curiosidade era saber PORQUE só o tipo float necessita de casting (ou definição literal do tipo do dado) dentro do if . Depois de passar algum tempo estudando, focado em encontrar uma justificativa eis que a solução foi observada. O if nesta situação, não tem nada a ver com essa questão do float, a não ser possibilitar a sintaxe para a comparação. O problema está na declaração de constantes dentro do programa. Isso mesmo, constantes. Sempre que colocamos um número PONTO FLUTUANTE dentro do código que NÃO tenha sido atrelado a um tipo, o COMPILADOR passa a tratar este número (por padrão) como sendo uma constante do tipo DOUBLE! Por isso que a condição do if é falsa sempre que estiver desta forma: float n1 = 9.8; if ( n1 == 9.8 ) { //instruções } A variável n1, por declaração, é do tipo float e a constante 9.8 está sendo visto pelo compilador como sendo uma constante double. Para o compilador, um número ponto flutuante com precisão estabelecida pelo tipo float é diferente de um número ponto flutuante com precisão estabelecida pelo tipo double. Ambos possuem precisões distintas. Ao colocar o cast ou a especificação literal de tipo, ambos os números 9.8 passam a possuir a mesma precisão, imposta pelo tipo float. Consequentemente, a condição do if após a alteração passa a ser verdadeira. :D
  4. Olá a todos. Observem o seguinte código extremamente simples: #include <stdio.h> int main() { float n1 = 9.8; if (n1 == 9.8) { printf("ok!\n\n"); } printf("Fim do programa...!\n"); scanf("%*c"); return 0; } Esse código não gera a frase ok! porque o compilador não enxerga n1 igual 9.8 apesar de, visualmente, a condição ser verdadeira devido a comparação entre números reais idênticos. Porém, quando eu insiro cast antes do 9.8 na condição do if o código funciona corretamente: if (n1 == (float) 9.8) Esse problema só existe quando eu uso números reais do tipo float diferentes de 9.0 e 9.5, ou seja, escrevendo dessa forma if (n1 == 9.0) ou desta outra forma if (n1 == 9.5), sem cast, o código funciona perfeitamente. Para números dos tipos int e double esse problema de comparação na condição do if não ocorre. Estou usando o codeblocks, com compilador GCC, no windows 7, processador i3, 64bits. Alguém com mais anos de prática na Linguagem C poderia esclarecer por qual razão o tipo floatnecessita de casting na condição do if?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.