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

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

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@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@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br

http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-n...
print(y$dp, digits = 13) [1] 0.005773502691896 0.005773502691897
2011/4/14 Benilton Carvalho <beniltoncarvalho@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@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@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br

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@gmail.com> escreveu:
http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-n...
print(y$dp, digits = 13) [1] 0.005773502691896 0.005773502691897
2011/4/14 Benilton Carvalho <beniltoncarvalho@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@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@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br

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@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@gmail.com> escreveu:
http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-n...
print(y$dp, digits = 13) [1] 0.005773502691896 0.005773502691897
2011/4/14 Benilton Carvalho <beniltoncarvalho@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@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@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br

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@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@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@gmail.com> escreveu:
http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-n...
print(y$dp, digits = 13) [1] 0.005773502691896 0.005773502691897
2011/4/14 Benilton Carvalho <beniltoncarvalho@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@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@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
_______________________________________________ R-br mailing list R-br@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)

Estava olhando a discussão, e gostaria de saber como calcula esta representação binária. 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....

On Fri, 2011-04-15 at 00:09 -0300, Mauro Sznelwar wrote:
Estava olhando a discussão, e gostaria de saber como calcula esta representação binária.
Mauro veja o documento http://www.validlab.com/goldberg/paper.pdf -- []s Tura

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@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@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@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@gmail.com> escreveu:
http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-n...
print(y$dp, digits = 13) [1] 0.005773502691896 0.005773502691897
2011/4/14 Benilton Carvalho <beniltoncarvalho@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@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@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
_______________________________________________ R-br mailing list R-br@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)

Cézar, pode fazer assim (dividir em 2 comparações): 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) refer=y$dp[1] y$dp < refer | all.equal(y$dp - refer,rep(0,2)) 2011/4/15 Cézar Freitas <cezarcamelo@gmail.com>
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@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@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@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@gmail.com> escreveu:
http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-n...
print(y$dp, digits = 13) [1] 0.005773502691896 0.005773502691897
2011/4/14 Benilton Carvalho <beniltoncarvalho@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@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@listas.c3sl.ufpr.br > https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br > > _______________________________________________ R-br mailing list R-br@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)
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br

On Thu, 2011-04-14 at 20:11 -0300, Cézar Freitas wrote:
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.
Cezar, Não tem pista nenhuma! Nada mudou! Só número que são potencias de 2 (2^t) ou que podem ser representados na forma de uma fração x/2^y são representados de forma exatas por computadores. Questões como esta já foram levantadas algumas vezes na antiga R_STAT e várias vezes na R-HELP Sempre se manda a pessoa ver o link: http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-n... e ler o documento http://www.validlab.com/goldberg/paper.pdf E se gasta um tempo até que a pessoas note que não existe representação binária perfeita para seu problema. Tudo que você que você sabia continua valendo até que se muda a estrutura dos processadores e eles deixem de ser binários. -- []s Tura
participantes (6)
-
Benilton Carvalho
-
Bernardo Rangel Tura
-
Cézar Freitas
-
Gustavo Henrique de Carvalho
-
Mauro Sznelwar
-
Rodrigo Coster