Ir para conteúdo
Fórum Script Brasil
  • 0

Float X Double (ou %f x %lf)


Felipe Amadio

Pergunta

Pra começar, eu trabalho em C (não C++)

Eu fiz um programa que no meio dele deve calcular LN(preco1/preco2).

e minha saida para isso foi essa:

fprintf(saida1,"%lf ", log(preco1/preco2) );

porém, caso eu mude o "%lf" por %f, o resultado fica exatamente igual, e, na minha opinião, com uma precisão muito baixa! somente 5 casas decimais (a 6a é aproximada), e nesse meu caso, que eu calculo um ln, é muito importante uma precisão de algo em torno de 8 ou 9 casas decimais (até por que, esse valor retornado vai ser uma porcentagem, então só nessa "operação" de usar como porcentagem, eu já perco mais duas casas decimais, e acabo tendo uma precisão horrível de apenas 3 casas decimais...!!

(obs: tanto preco1 quanto preco2 estão declarados como double)

achei estranho, e resolvi criar um programa que compare float e double, e daí que vi que a coisa ficou ruim!

ai vai o programa que eu fiz:

float f;
double d;
f = 0.12345678901234567890;
d = 0.12345678901234567890;

printf("f = %f  %lf\n\n", f, f);
printf("d = %f  %lf\n\n", d, d);

e as saidas me retornaram valores EXATAMENTE identicos! com 5 casas decimais, e a 6a casa aproximada!

Portanto, pra que serve o Double, sendo que ele ocupa o dobro de bits do float e, em teoria, ele não me fornece mais casas decimais??

Outra coisa, muda algo usar, em qualquer ponto do codigo, seja em scanf ou printf, %lf ou invés de %f?

E, por fim, e o mais importante a titulo de resolver o meu problema de verdade, e não só as minhas duvidas e curiosidades:

Alguém tem ideia de como eu fazer o meu LOG(preco1/preco2) aparecer com mais casas decimais...??

(tentei um migue, fazer log(pow(preco1,100)/pow(preco2,100)), o que já me daria o valor em porcentagem, mas não deu certo, a precisao ficou igual a se eu fizesse 100*log(preco1/preco2) - numericamente eu sei que é igual, mas achei que poderia enganar o pc fazendo ele me dar mais precisão, mas não funcionou...

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Na verdade, seis casas decimais é a quantidade padrão de um printf em que não se especifica o número de casas decimais desejada. Internamente na memória a precisão do double é maior que a do float e de ambas é maior que seis casas decimais (7 casas decimais para float e 16 para double, e ainda 18 para long double), tente escrever o seguinte no printf:

float f;
double d;
f = 0.12345678901234567890;
d = 0.12345678901234567890;

printf("f = %.7f  %.16lf\n\n", f, f);
printf("d = %.7f  %.16lf\n\n", d, d);

Link para o comentário
Compartilhar em outros sites

  • 0

Hum... muito obrigado!!

Eu já sabia dessa história de pedir para imprimir numero com o numero de casas decimais definidas, mas, como disse no inicio do programa, eu gostaria de saber a precisão, mesmo, de cada tipo de variável, de modo que sua resposta ajudou muito!

para ilustrar para todos, resolvi meu problema (que era o de não ter precisao ao calcular log(preco1/preco2)), da seguinte maneira:

Eu exportava meus dados para um arquivo .txt

Ao invés de dar um fprintf com %lf, fiz com %.16lf e a minha precisão aumentou consideravelmente!!!

e agora, mais alguns detalhes, a titulo de curiosidade:

Usar o %.16lf e o %.16f me parece ser a mesmíssima coisa! tem alguma diferença...???

E, quanto ao seu LONG DOUBLE, nunca ouvi falar disso! como funciona? como é feito a declaração e como faço as chamadas de printf e scanf?

da mesma forma que com o double? com %f mesmo?

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...