[R-br] precisão numérica no R - uma falha?

Cézar Freitas cezarcamelo em gmail.com
Sexta Abril 15 07:41:56 BRT 2011


Excelente pdf.
E a motivação binária é válida.
Vou estudar a função all.equal para ver se descolo alguma do tipo all.less,
pois no fundo meu problema é marcar quem está abaixo de um limite. Por ora
vou definir um epsilon e verificar se x+epsilon<limite.

Obg,
C.

Em 14 de abril de 2011 21:11, Benilton Carvalho
<beniltoncarvalho em gmail.com>escreveu:

> Cezar,
>
> note que nem todos estes numeros nao possuem representacao binaria
> perfeita:
>
> 4.96 = 100.11110101110000101000111101011100001010001111010111 ( =
>
> 4.9599999999999999383484909024105265228684473934444104163875499178081282073594053273515617319174792...)
> 4.97 = 100.1111100001010001111010111000010100011110101110000101 ( =
>
> 4.9699999999999999522262787102249791917074708051575354490781853972972047883147623040656351019280470...)
> 5.02 = 101.0000010100011110101110000101000111101011100001010001111011
> (exatamente)
> 5.03 = 101.0000011110101110000101000111101011100001010001111010111
> (exatamente)
>
> Por fim, como a matematica e' feita na representacao binaria (que
> neste caso e' imperfeita), a gente nao pode esperar os mesmos
> resultados.
>
> Por isso a minha sugestao de usar o all.equal(), que permite o uso de
> tolerancia para compensar estes problemas na representacao binaria....
>
> b
>
> 2011/4/15 Gustavo Henrique de Carvalho <gustavo.bio em gmail.com>:
> > Aquela resposta na página que enviei explica o porquê. Ainda, ela leva
> > à esse pdf:
> >
> > http://www.validlab.com/goldberg/paper.pdf
> >
> > De qualquer forma, só para ilustrar:
> >
> >> a <- c(4.96, 4.97, 4.96)
> >> b <- c(5.02, 5.03, 5.03)
> >> d <- c(5.96, 5.97, 5.96)
> >> sd(a) == sd(b)
> > [1] FALSE
> >> sd(a) == sd(d)
> > [1] TRUE
> >
> >> 0.2 * 0.4 == 0.08
> > [1] FALSE
> >
> > 2011/4/14 Cézar Freitas <cezarcamelo em gmail.com>:
> >> Acho que não fui claro o suficiente: os desvios deveriam, de fato, ser
> >> iguais (os números estão à mesma distância de suas respectivas médias),
> >> porém o R não retrata assim (independentemente da quantidade de dígitos)
> e
> >> eu fiquei surpreso.
> >>
> >> Na minha época, sei que havia coisinhas que evitávamos, como elevar
> números
> >> muito grandes ao quadrado para somá-los e depois dividi-los, quando era
> >> possível contornar o problema aplicando a divisão previamente, mas nas
> >> máquinas de hoje eu achei que não era necessário preocupar-se com tais
> >> acontecimentos.
> >>
> >> Alguma outra pista?
> >>
> >> C.
> >>
> >> Em 14 de abril de 2011 17:13, Gustavo Henrique de Carvalho
> >> <gustavo.bio em gmail.com> escreveu:
> >>>
> >>>
> >>>
> http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f
> >>>
> >>> > print(y$dp, digits = 13)
> >>> [1] 0.005773502691896 0.005773502691897
> >>>
> >>> 2011/4/14 Benilton Carvalho <beniltoncarvalho em gmail.com>:
> >>> > Cezar,
> >>> >
> >>> > o que vc esta' procurando e' o seguinte:
> >>> >
> >>> > all.equal(y$dp - refer, rep(0, 2))
> >>> >
> >>> > b
> >>> >
> >>> > 2011/4/14 Cézar Freitas <cezarcamelo em gmail.com>:
> >>> >> Olá.
> >>> >>
> >>> >> Bem, escrevo apenas para ilustrar algo que me surpreendeu. Estava
> >>> >> plotando
> >>> >> gráficos e os colorindo segundo seu desvio padrão estava ou não
> acima
> >>> >> de um
> >>> >> ponto de corte. Reproduzo abaixo a parte do código que interessa:
> >>> >>
> >>> >> y=as.data.frame(matrix(c(4.96,5.02,4.97,5.03,4.96,5.03), ncol=3))
> >>> >> y$dp=apply(y,1,sd)
> >>> >>
> >>> >>> y
> >>> >>     V1   V2   V3          dp
> >>> >> 1 4.96 4.97 4.96 0.005773503
> >>> >> 2 5.02 5.03 5.03 0.005773503
> >>> >>
> >>> >> refer=y$dp[1]
> >>> >>
> >>> >> y$dp<=refer
> >>> >>
> >>> >> [1]  TRUE FALSE
> >>> >>
> >>> >> Sei que o R é extremamente preciso e até podemos alterar sua
> mantissa
> >>> >> nos
> >>> >> cálculos, mas isso não é rotineiro para cálculos tão simples. O
> pessoal
> >>> >> do
> >>> >> cálculo numérico saberia dizer o que evitar para não cair nessas
> >>> >> armadilhas
> >>> >> no futuro?
> >>> >>
> >>> >> Abraços,
> >>> >> Cézar Freitas
> >>> >>
> >>> >> _______________________________________________
> >>> >> R-br mailing list
> >>> >> R-br em listas.c3sl.ufpr.br
> >>> >> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> >>> >>
> >>> >>
> >>> > _______________________________________________
> >>> > R-br mailing list
> >>> > R-br em listas.c3sl.ufpr.br
> >>> > https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> >>> >
> >>
> >>
> >
>
>
>
> --
> Successful people ask better questions, and as a result, they get
> better answers. (Tony Robbins)
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20110415/4799b7c8/attachment.html>


Mais detalhes sobre a lista de discussão R-br