Ir ao conteúdo
  • Cadastre-se

Perda de precisão


Cid2009

Posts recomendados

Olá, programa a pouco tempo em C, e estou encontrando dificuldades em fazer um programa que converte um número do sistema decimal para um número no sistema binário.

O problema é o seguinte:

Ao atribuir o valor 0.1 para uma váriavel "num" do tipo float o computador guarda o valor 0.10000000149011612.

Como o programa faz várias iterações multiplicando o valor de num por 2, chega um momento em que aqueles número a partir da oitava casa ficam maiores a ponto de interferir no resultado que eu quero.

Então a pergunta é:

Tem como fazer a váriavel num receber 0.1000000000000000000 ao invés de 0.10000000149011612?

Link para o comentário
Compartilhar em outros sites

Olá, programa a pouco tempo em C, e estou encontrando dificuldades em fazer um programa que converte um número do sistema decimal para um número no sistema binário.

O problema é o seguinte:

Ao atribuir o valor 0.1 para uma váriavel "num" do tipo float o computador guarda o valor 0.10000000149011612.

Como o programa faz várias iterações multiplicando o valor de num por 2, chega um momento em que aqueles número a partir da oitava casa ficam maiores a ponto de interferir no resultado que eu quero.

Então a pergunta é:

Tem como fazer a váriavel num receber 0.1000000000000000000 ao invés de 0.10000000149011612?

Esta usando o scanf() para ler dados?

Link para o comentário
Compartilhar em outros sites

Tem alguma coisa errada nessa declaração.

Ao atribuir o valor 0.1 a variável deveria ser 0.1(00000000...) apenas.

Mostre como você tá fazendo...

Estou usando scanf(), segue abaixo como declarei a variavel e como atribui o valor:

float num

printf("Informe um numero: ");

scanf("%f", &num);

E para ter certeza que ele esta atribuindo 0.10000000149011612 para a váriavel num eu usei um printf() como no exemplo abaixo:

printf("\nNumero: %.17f", num);

Não sei se é importante mencionar, mas uso Windows 7 e o dev-C++.

Link para o comentário
Compartilhar em outros sites

Até onde eu sei não tem a ver com o scanf,mas sim com a representação interna de um float.que não admite essa precisão toda (17 digitos pra uma variavel com 32-bits?você pirou?).

No seu caso,use o tipo double (ou até long double,se possivel) e se mesmo assim ainda precisar de precisão,considere o uso da biblioteca GMP.

Se eu não me engano a precisão do float é de 6 a 10 digitos (contando todos os digitos).

Att. regreth

Link para o comentário
Compartilhar em outros sites

Testei com double e long double e o resultado foi o mesmo:

Ao atribuir 0.1 para num ele atribuiu 0 no lugar de 0.1.

O código ficou assim com double:

/**************************************************/

double num;

printf("Informe um numero: ");

scanf("%f", &num);

printf("\nNumero: %.17f", num);

/**************************************************/

Como saida ele mostrou na tela: 0.00000000000000000.

Gostaria de saber se estou usando algo errado nesse trecho do código.

OBS: Ao atribuir 0.11 para uma váriavel float ele guarda 0.10999999940395355 para a váriavel. O que é estranho pois eu havia entendido que o float tinha ao mesmo 6 casas de precisão.

E lembrando mais uma vez que o eu queria é que ele atribuí-se somente o valor todo certinho, ou seja, quando eu mandasse 0.1 para a variavel eu gostaria que ele ficasse só como 0.1, e não com aquele monte de números no final que interferem depois de umas 20 iterações do programa. O mesmo vale para o 0.11 que ele esta armazenando como 0.10.

Link para o comentário
Compartilhar em outros sites

Você usou uma variavel do tipo double mas como parametro do scanf disse que a variavel era float.Leia os warnings do compilador ora!

O resultado não é o mesmo.


#include <stdio.h>

int main()
{
double n;
scanf("%lg", &n);
printf("%.17lg\n", n);
return 0;
}

Vai exibir 0.10000000000000001 quando você digitar 0.1.

Vai exibir 0.11 quando você digitar 0.11.


#include <stdio.h>

int main()
{
long double n;
scanf("%Lg", &n);
printf("%.17Lg\n", n);
return 0;
}

Que deve exibir 0.1 quando for digitado 0.1.

Existe um limite de precisão claro,leve isso em consideração em seu programa.

Att. regreth

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para 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...