• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

TaoOo

Virgula Flutuante

12 mensagens neste tópico

Boas,

tou com umas duvidas.

Neste exemplo:

37199029dm6.jpg

Não consigo perceber como é que .625 em base 2 fica .101

pode ser uma coisa basica mas nao sei  :hmm:

se alguem me conseguir explicar como isto se faz agradecia.

Cumprimentos,

TaoOo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se bem me lembro funciona +/- assim...

Pegas no 0,625 e multiplicas por 2 e vais retirando a parte fraccionaria e substituindo da esquerda pra direita os algarismos por 1 (se o resultado da multiplicação for maior ou igual a 1) ou por 0 (se a multiplicação for inferior a 1)

,625 -> XXX

0.625x2=1.25 por isso vai ser 1

.625 -> 1XX

pegas no 0,25 e multiplicas por 2

0.25x2 = 0.5 por isso vai ser 0

.625 -> 10X

.5x2 = 1 por isso vai ser 1

0.625 -> 101

:P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hum, se for assim parece me bastante simples, so uma coisa, so fazemos isso o numero de vezes tantas as casas decimais que o numero tiver  não é ?

neste caso eram 3 fez-se 3 vezes, certo ?

é esse o factor de decisão ?

Obrigado pela resposta.

cumprimentos,

TaoOo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não. É até dar 1. Por isso é que aritmética de números de vírgula flutuante dá tantos problemas.

E por isso é que 0,2 * 5 não é exactamente 1,0

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok tks.

mas se 0.2 * 5 != 1 entao 0.5 * 2 = 1 ?!?...

se tivesse k fazer numa dessas contas 0.2 * 5 iria por o resultado como 1 =)

mas isso ja é outra historia...

thanks pelas respostas, fiquei elucidado.

Cumprimentos,

TaoOo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas se 0.2 * 5 != 1 entao 0.5 * 2 = 1 ?!?...

se tivesse k fazer numa dessas contas 0.2 * 5 iria por o resultado como 1 =)

Não percebi nada do que disseste.

Mas se estavas a perguntar se querias verificar se o resultado era igual a 1. Então a resposta é nunca usar o =

Nunca com números de vírgula flutuante uses o = (ou outro símbolo de equivalência) usa sempre uma comparação com o < e > e com uma margem de erro muito reduzida.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim era isso =)

entao o melhor pa comparar sera fazer estas duas comparacoes:

0.2 * 5 < 1 e 0.2 * 5 > 1 e terem que dar as 2 falso , é o melhor ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epa... vamos com calma que já para aqui estamos a misturar e confundir calculos matemáticos exactos com comparações de tipos de dados de resolução finita.

0,2*5 é efectivamente igual a 1

Penso que ninguem tem duvidas em relação a isso. Se estiveres a resolver um exercicio destes, se te dá 1 então pões um 1. Pnto final. O problema que pode aparecer é se o tipo de dados que estiveres a usar não incluir o valor 0.2 exactamente. E em vez disso incluir um valor muito próximo. Aí podes caír em bugs nas comparações se não tiveres cuidado. Mas isto quando estas a executar um programa! Não quando estás tu a fazer as tuas continhas.

Moral da história: não te preocupes com isso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

entao o melhor pa comparar sera fazer estas duas comparacoes:

0.2 * 5 < 1 e 0.2 * 5 > 1 e terem que dar as 2 falso , é o melhor ?

Não. Nunca será os 2 falsos a não ser que seja = a 1, e o problema tá aí. Tens é de comparar a um intervalo pequeno. Tipo

float margem_erro = 0.001

(0.2 * 5 > 1 - margem_erro ) AND (0.2 * 5 < 1 + margem_erro)

Claro que a margem de erro escolhes conforme a precisão que queres ter.

Epa... vamos com calma que já para aqui estamos a misturar e confundir calculos matemáticos exactos com comparações de tipos de dados de resolução finita.

Mas não estamos a falar de cálculos matemáticos exactos e sim de tipos de dados de resolução finita (vírgula flutuante).

0,2*5 é efectivamente igual a 1

Em vírgula flutuante não é (pode ser, depende da arquitectura que poderá arredondar para 1), já que não dá para representar 0.2, só uma aproximação.

Um breve teste, em ambos os casos para 5 deu bem, arredondou para 1. Mas por exemplo:

Prelude> 0.2 * 3 :: Float

0.6

Prelude> 0.2 * 3 :: Double

0.6000000000000001

Prelude>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas betovsky... foi precisamente para isso que eu chamei a atenção.

tu estás a entrar com tipos de dados de resolução finita. E o exercicio é um simples exercicio matemático. Os problemas de resolução são uma coisa completamente à parte da matemática. São limitações tecnicas do hardware.

Nesta tua ultima citação tiveste que escrever "float" e "double", que não são referidos em lado nenhum no exercicio.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora