¿Existe alguna definición de cómo los valores de punto flotante evaluados en tiempo de compilación se redondean en C o C++? Fe cuando tengo double d = 1.0 / 3.0; ? Es decir, qué tipo de redondeo se realiza en tiempo de compilación.
¿Y hay una definición de cuál es el modo de redondeo predeterminado para un subproceso en tiempo de ejecución (C99's/C++11's fegetround() / fesetround() )?
¿Y el redondeo a valores enteros también está incluido en los últimos parámetros de configuración? Soy consciente de nearbyint() , pero esto se especifica para vincularse a los parámetros de redondeo que se pueden establecer mediante fesetround() . Lo que me preocupa es la conversión directa a un número entero.
En ambas especificaciones (C17 y C++20), el redondeo del tiempo de compilación está definido por la implementación.
En la especificación de C++, esto se especifica en lex.fcon , que dice
Si el valor escalado no está en el rango de valores representables para su tipo, el programa está mal formado. De lo contrario, el valor de un literal de punto flotante es el valor escalado si es representable, de lo contrario, el valor representable más grande o más pequeño más cercano al valor escalado, elegido de una manera definida por la implementación.
La especificación C tiene un lenguaje similar (cita tomada de N2176, borrador final C17):
el resultado es el valor representable más cercano, o el valor representable más grande o más pequeño inmediatamente adyacente al valor representable más cercano, elegido de una manera definida por la implementación.
También recomienda que la conversión del tiempo de traducción coincida con la conversión del tiempo de ejecución de las funciones de la biblioteca (como strtod ), pero no es obligatorio. Ver la descripción de los valores representables .
Las conversiones de valores de coma flotante a enteros se especifican en ambos para truncar (redondear hacia 0 descartando la parte fraccionaria).