
Zeus
Es bien sabido que en C, los literales de punto flotante (p. ej. 1.23
) tiene tipo double
. Como consecuencia, cualquier cálculo que los involucre se promueve al doble.
Estoy trabajando en un sistema integrado en tiempo real que tiene una unidad de punto flotante que solo admite precisión simple (float
) números. Todas mis variables son float
, y esta precisión es suficiente. No necesito (ni puedo permitirme) double
en absoluto. Pero cada vez que algo como
if (x < 2.5) ...
está escrito, ocurre el desastre: la desaceleración puede ser de hasta dos órdenes de magnitud. Por supuesto, la respuesta directa es escribir
if (x < 2.5f) ...
pero esto es tan fácil de pasar por alto (y difícil de detectar hasta que es demasiado tarde), especialmente cuando un valor de ‘configuración’ es #define
‘d en un archivo separado por un desarrollador menos disciplinado (o simplemente nuevo).
Entonces, ¿hay alguna manera de obligar al compilador a tratar todos los literales (punto flotante) como flotantes, como si tuvieran el sufijo f
? Incluso si va en contra de las especificaciones, no me importa. ¿O alguna otra solución? El compilador es gcc, por cierto.
-fsingle-precision-constant
Se puede usar la bandera. Hace que las constantes de coma flotante se carguen con precisión simple incluso cuando esto no es exacto.
Nota: esto también utilizará constantes de precisión simple en operaciones con variables de doble precisión.

Brett Hale
Utilice advertencias en su lugar: -Wdouble-promotion
advierte sobre implícito flotar para duplicar la promoción, como en su ejemplo. -Wfloat-conversion
advertirá sobre casos en los que aún puede estar asignando dobles a flotantes.
Esta es una mejor solución que simplemente forzar valores dobles al valor flotante más cercano. Su código de punto flotante sigue siendo compatible y no recibirá sorpresas desagradables si un valor doble tiene un valor positivo, digamos, menos de FLT_DENORM_MIN
(suponiendo IEEE-754) o superior a FLT_MAX
.
Puede convertir las constantes definidas en (float)
dondequiera que se utilicen, el optimizador debería hacer su trabajo. Esta es una solución portátil.
#define LIMIT 2.5
if (x < (float)LIMIT) ...
los -Wunsuffixed-float-constants
flag también podría usarse, tal vez combinado con algunas de las otras opciones en la respuesta aceptada anterior. Sin embargo, esto probablemente no detectará constantes sin sufijo en los encabezados del sistema. necesitaría usar -Wsystem-headers
para atraparlos también. Podría generar muchas advertencias…
hay
-Wdouble-promotion
, que al menos te dará advertencias. Combinado con-Wfloat-conversion
debe dar bastante buena cobertura.– Brett Hale
28 de agosto de 2015 a las 8:47
Esto no responde directamente a su pregunta, pero no sería tan difícil escribir un script para simplemente insertar cualquier faltante.
f
s de literales FP.– Xophmeister
28 de agosto de 2015 a las 8:47
¿Ayuda esto: stackoverflow.com/questions/24688911/… ?
– Raúl Tripathi
28 de agosto de 2015 a las 8:49
Algunos compiladores para sistemas integrados asignan doble a flotante y solo habilitan doble precisión con una opción. No se si hay algo similar en GCC
– phuclv
28 de agosto de 2015 a las 8:56
@BrettHale Ese comentario es digno de ser una respuesta adecuada. Creo que recibir advertencias en este caso sería más productivo que alguna otra opción del compilador que permite al programador escribir código que no es compatible con el estándar.
– usuario694733
28 de agosto de 2015 a las 11:36