Ésta es una pregunta de la entrevista malo, porque la tarea es generalmente imposible, dadas las herramientas esperadas, porque la mayoría de los resultados correctos no se puede representar. Es decir, el tipo de coma flotante común no puede representar el resultado matemático correcto, 3.0098, exactamente. Por lo tanto, es imposible calcular y devolver la respuesta correcta. Debería usar algún mecanismo alternativo, como devolver el valor en un tipo diferente (escalado a un entero, en una cadena, en formato decimal de coma flotante, etcétera).
Sospecho que la respuesta que el entrevistador puede haber esperado es evaluar (int) (x * 10000 + .5) *. 0001. Esto escala el valor para que los resultados deseados sean enteros (el quantum de redondeo, .0001, se escala a 1), agrega .5, trunca a un entero y revierte la escala. La combinación de agregar .5 y truncar es casi equivalente al redondeo, excepto que requiere que x sea positivo, redondea las relaciones desde cero y tiene problemas de rango/dominio. Se pueden hacer ajustes según la situación y el comportamiento deseado. Y, por supuesto, las respuestas son generalmente incorrectas, debido a la imposibilidad de representar resultados exactos.
Una respuesta más interesante es evaluar (x * 10000 + 0x1p52-0x1p52) *. 0001. Esto escala el valor, lo redondea a un número entero, utilizando el modo de redondeo de coma flotante actual, y deshace la escala. El redondeo se efectúa porque el tipo doble común tiene 53 bits en su significado, entonces, cuando el bit alto tiene valor 0x1p52 (2), el valor del bit bajo es 0x1p0 (2 , también conocido como 1). Para producir el resultado de agregar 0x1p52, el significado debe redondearse, lo que se hace automáticamente en el hardware de coma flotante. Luego restar 0x1p52 quita el número agregado, dejando el valor redondeado. Como antes, hay advertencias con rango/dominio y aseguran que el compilador hace aritmética de precisión doble y no algo más, y se pueden hacer ajustes. Sin embargo, es más rápido en algún hardware que la conversión a entero y viceversa.
El uso de conversiones fmod o de cadena tiene un peor rendimiento porque requieren división, que es lenta en la mayoría de los procesadores comunes.
Sin mod, pero podría formatearlo como una cadena con 4 decimales que se muestran y analizar de nuevo a un doble (¡nada eficiente!). – assylias
¿Qué tipo de redondeo? –
Sí, les mencioné eso pero tampoco estaba permitido. – MattW