Hola a todos,

Desde el principio me ha interesado mucho esta pregunta, y vais por el buen
camino. Obviamente hay un problema con la representación de números reales
en base diez a la hora de convertirlos en binarios en un ordenador.

Como bien habéis indicado, el estandar es el IEEE-754, que establece unos
criterios para el redondeo en casos no claros, como los 0.5. La norma que
nos explicaron en el colegio es muy sencilla, pero es matemáticamente
errónea puesto que está a la misma distancia, por ejemplo, 1.5 de 1 que de
2, luego redondear al superior no es esencialmente correcto. La solución
tomada por convenio (creo que propuesta por Gauss) es aproximar siempre al
par más cercando (ronding to even), aunque también se podría haber aproximar
al impar más cercano.

Así, round(40,435,2) devuelve correctamente 40,44 (atención que
round(40,445,2) también sería 40,44). Es en el otro caso donde hay
incosistencia, round (20,435,2). Comprobemos su representación binaria [1].

20.435 convertido a punto flotante en doble precisión (64bits), es
40346F5C28F5C28F, que si lo convertimos de nuevo a decimal, sería
20.435000000000000. Esta conversión es totalmente correcta.

Sin embargo, si 20.435 lo convertimos en precisión sencilla (32 bits),
resulta 41A37AE1, que de nuevo a decimal es 20.434999
Y he aquí el "problema".

Parece ser que R está trabajando con precisión sencilla. Si existe algún
modo de obligarle a que utilice doble precisión, ahí tendrás una posible
solución a tu problema.

Respecto a lo que dice Pepe, que en OpenOffice no ocurre este problema, es
cierto, acabo de comprobarlo en Calc de OpenOffice y en el Excel de
Microsoft, redondean correctamente a 20,44. Esto es así porque no siguen el
estandar IEE754 de redondeo hacia el par, sino que lo hacen según el método
sencillo que nos enseñan en el colegio. Si pruebas a poner 20,445, te lo
redondea a 20,45.


[1] http://babbage.cs.qc.edu/IEEE-754/Decimal.html

--
Un Saludo, Roldán
http://www.tiendadeultramarinos.es


2009/12/11 Francesc Carmona <fcarmona@ub.edu>

>  Creo que hay mucho que estudiar, pero este documento nos muestra que el
> problema no es trivial:
>
> http://perso.wanadoo.es/jgoizueta/doc/round.pdf
>
> Saludos,
>
> Paco
>
> En/na Usuario R ha escrit:
>
> Hola,
>
> Alguien entiende porqué se redondea esto asi:
>
>  round( 20.435, 2 )
> [1] 20.43
>
> Y sin embargo:
>
>  round( 40.435, 2 )
> [1] 40.44
>
> Gracias!
>
> Patricia
>
> 	[[alternative HTML version deleted]]
>
>
>
> ------------------------------
>
> _______________________________________________
> R-help-es mailing listR-help-es@r-project.orghttps://stat.ethz.ch/mailman/listinfo/r-help-es
>
>
> _______________________________________________
> R-help-es mailing list
> R-help-es@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>
>

	[[alternative HTML version deleted]]

