No hay ninguna razón histórica. Este tipo de desviación ha existido desde el año punto. La gente hace esto cuando se siente muy, muy traviesa. Es un abuso de la aritmética de coma flotante, y muchos programadores profesionales experimentados caen en la trampa. Incluso los cuerpos de Java lo hicieron hasta la versión 1.7. Chicos divertidos.
Mi conjetura es que una función de redondeo alemana decente y lista para usar no estuvo disponible formalmente hasta C ++ 11 (a pesar de que C obtuvo la suya en C99), pero eso realmente no es excusa para adoptar la supuesta alternativa.
Aquí está la cuestión: floor(0.5 + input)
no siempre recupera el mismo resultado que el correspondientestd::round
llamada !
La razón es bastante sutil: el punto de corte para un redondeo alemán, a.5
para un entero a
, es, por una propiedad coincidente del universo, un racional diádico . Como esto se puede representar exactamente en un punto flotante IEEE754 hasta la potencia 52 de 2, y a partir de entonces el redondeo es una operación no válida de todos modos,std::round
siempre funciona correctamente. Para otros esquemas de coma flotante, consulte la documentación.
Pero agregar 0.5
a una double
lata introduce imprecisión, lo que provoca un ligero sobrepaso o subestimado de algunos valores. Si lo piensa, sumar dos double
valores juntos, que son el comienzo de conversiones denarias involuntarias, y aplicar una función que es una función muy fuerte de la entrada (como una función de redondeo), seguramente terminará en lágrimas.
No lo hagas .
Referencia: ¿Por qué Math.round (0.49999999999999994) devuelve 1?