¿Por qué algunos idiomas se redondean al entero INCLUSO más cercano?

44

Los lenguajes de programación como Scheme (R5RS) y Python ( vea esta pregunta ) se redondean hacia el entero par más cercano cuando el valor está exactamente entre los enteros circundantes.

¿Cuál es el razonamiento detrás de esto?
¿Existe una idea matemática que haga que razonar a continuación sea más fácil de razonar?

(R5RS hace referencia al estándar de coma flotante IEEE como fuente de este comportamiento).

Profpatsch
fuente
44
¿Leíste floating-point-gui.de ?
Basile Starynkevitch
1
IEEE permite el modo de redondeo múltiple. Este es uno de ellos. Algunos idiomas incluso permiten cambiar el modo de redondeo durante la ejecución.
Tobias Brandt
55
Es posible que desee leer la sección de desempate para redondear en Wikipedia y el razonamiento de la asociación detrás de cada uno de ellos.
3
Duplicado entre sitios: Mathematica.SE: ¿Por qué redondear a enteros pares?
apsillers
1
"aunque exacto es una cuestión de discusión con números de coma flotante" No es una cuestión de discusión, se especifica con mucha precisión. Por ejemplo, los números que son relevantes aquí (como 42.5) se pueden representar exactamente, porque son fracciones binarias. Lo que no se puede representar exactamente son fracciones que no sean binarias, incluidas las fracciones decimales.
svick

Respuestas:

39

Hace un tiempo construí un programa de prueba para redondeos sucesivos, porque es básicamente una prueba de esfuerzo en el peor de los casos para un algoritmo de redondeo.

Para cada número del 0 al 9,999, primero se redondea al 10 más cercano, luego al 100 más cercano, luego al 1000 más cercano. (También podría pensar en esto como 10,000 puntos en [0,1) redondeados a 3 lugares, luego a 2, luego a 1.) Este conjunto de números tiene un valor medio de 4999.5.

Si los tres redondeos se realizan utilizando el método de "media vuelta arriba", a continuación, los resultados son como sigue (primera columna es el resultado de redondeo, segunda columna es cómo muchos números redondeados a ese resultado - es decir, es un histograma).

0     445
1000  1000
2000  1000
3000  1000
4000  1000
5000  1000
6000  1000
7000  1000
8000  1000
9000  1000
10000 555

El resultado difiere de un solo "redondeo a la mitad" al millar más cercano 550 veces de 10,000 y el valor redondeado promedio es 5055 (más alto que el promedio original en 55.5).

Si los tres redondeos se realizan "redondeando a la mitad", los resultados son:

0     556
1000  1000
2000  1000
3000  1000
4000  1000
5000  1000
6000  1000
7000  1000
8000  1000
9000  1000
10000 444

El resultado difiere de una sola "mitad hacia abajo" al mil 550 más cercano de 10,000 y el valor redondeado promedio es 4944 (demasiado bajo en 55.5).

Si los tres redondeos se realizan utilizando "redondear medio impar", el resultado es:

0     445
1000  1111
2000  889
3000  1111
4000  889
5000  1111
6000  889
7000  1111
8000  889
9000  1111
10000 444

El resultado difiere de una sola "mitad redonda impar" a las mil 550 más cercanas de 10,000 y el valor redondeado promedio es 4999.5 (correcto).

Finalmente, si los tres redondeos se realizan utilizando "redondear la mitad par", los resultados son:

0     546
1000  909
2000  1091
3000  909
4000  1091
5000  909
6000  1091
7000  909
8000  1091
9000  909
10000 1091

El resultado difiere de una sola "mitad redonda pareja" al millar más cercano 450 veces de 10,000 y el valor redondeado promedio es 4999.5 (correcto).

Creo que es obvio que la mitad hacia arriba y la mitad hacia abajo sesgan los valores redondeados, de modo que el promedio de valores redondeados ya no tiene la misma expectativa que el promedio de los valores originales, y que "mitad redondeada par" y "mitad redondeada impar "eliminar el sesgo tratando 5 de una manera la mitad del tiempo y de otra manera la otra mitad. El redondeo sucesivo multiplica el sesgo.

La mitad redonda par y la mitad redonda impar introducen su propio tipo de sesgo en la distribución: un sesgo hacia los dígitos pares e impares, respectivamente. En ambos casos, nuevamente, este sesgo se multiplica por redondeos sucesivos, pero es peor para la mitad de la ronda impar. Creo que la explicación en este caso es simple: 5 es un número impar, por lo que la mitad redonda impar tiene más resultados que terminan en 5 que la mitad redonda, y por lo tanto, más resultados tendrán que ser manejados especialmente en el próximo redondeo.

De todos modos, de las cuatro opciones, solo dos son imparciales, y de las dos elecciones imparciales, la mitad de la ronda incluso proporciona la distribución de mejor comportamiento cuando está sujeta a redondeos repetidos.

hobbs
fuente
55

Se llama redondeo bancario. La idea es minimizar el error acumulativo de muchas operaciones de redondeo.

Digamos que siempre redondeaste .5 hacia abajo. Piense en todos esos pequeños pagos de intereses, el banco se embolsó medio centavo cada vez ...

Digamos que siempre redondeó .5 hacia arriba. La contabilidad va a gritar porque estás pagando más intereses de los que deberías.

Loren Pechtel
fuente
66
pero ¿por qué par y no extraño?
Ratchet Freak
17
@ratchetfreak - tan pequeños números redondean a, no lejos de cero. Aparte de eso, es arbitrario, tiene que ser algo.
Jonathan Dursi
15
@ratchetfreak: ¿Qué pasaría si comienzas con el número 1, divides por 2 y redondeas a impar? Obtienes 0.5 redondeado a 1. ¿Qué pasa si divides por 2 nuevamente? Obtienes 0.5 redondeado a 1. Y así sucesivamente. Nunca se vuelve cero.
gnasher729
13
Creo que los números pares también son preferibles a los impares porque reducen la probabilidad de la necesidad de dilemas de redondeo posteriores . La división por (exactamente) dos es una operación bastante frecuente en la práctica.
Marc van Leeuwen
44
También es importante en estadística. Si cada miembro fraccionario de un conjunto de datos se redondea hacia arriba, las estadísticas descriptivas como la media serán (ligeramente) más altas que si se redondea hacia abajo. La Introducción a la Epidemiología de Kenneth Rothman menciona específicamente que siempre se redondea el terminal .5 (o .005, o lo que sea) como sesgo gradual de una base de datos hacia números más altos, pero siempre el redondeo a un número par o impar no sesga el promedio.
Will Murphy