2012-05-24 42 views
20

¿Existe una especificación oficial para la función round en Haskell? En GHCi versión 7.0.3 veo el siguiente comportamiento:Redondea al entero más cercano

ghci> round (0.5 :: Double) 
0 
ghci> round (1.5 :: Double) 
2 

Dado que tanto el 0,5 y el 1,5 son representables exactamente como números de punto flotante, que esperaba ver el mismo comportamiento que en Python:

>>> round(0.5) 
1.0 
>>> round(1.5) 
2.0 

¿Hay alguna razón para la diferencia, o es una peculiaridad de GHCi?

+5

Tenga en cuenta que Python 3 se comporta de la misma manera que GHCi aquí. –

+0

Interesante, gracias. ¿Sabes por qué IEEE especifica el redondeo al número par? Parece poco intuitivo para mí, ya sea de ronda o ronda desde cero tendría más sentido. –

+1

Supongo que hace más probable que los errores de redondeo se cancelen si redondea un grupo de números y luego los resume ... –

Respuesta

23

Está en la especificación. Se puede ver en la sección 6.4.6 de the Haskell report:

round x devuelve el entero más cercano a x, el entero par si es x equidistante entre dos enteros.

Como se ha señalado por @dflemstr, esto es de acuerdo con la IEEE Standard for Floating-Point Arithmetic.

+4

Esto está de acuerdo con el estándar de modo de redondeo de punto flotante IEEE 754. – dflemstr

+0

Aquí está el código para 'round' si alguien está interesado: http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/GHC-Real.html#round the check for even is quite obvio allí. – Poindexter

+2

FWIW, para comparar, la ronda de pitón() es un contenedor alrededor de la función C99 round(), que en una implementación que sigue a C99 Anexo F redondea las relaciones desde cero. – janneb

Cuestiones relacionadas