precisión - punto flotante normalizado
Hacer que los literales de coma flotante C sean flotantes(en lugar de dobles) (4)
El
-Wunsuffixed-float-constants
podría usarse, tal vez combinado con algunas de las otras opciones en la respuesta aceptada anteriormente.
Sin embargo, esto probablemente no captará constantes sin corregir en los encabezados del sistema.
Necesitaría usar
-Wsystem-headers
para capturarlos también.
Podría generar muchas advertencias ...
Es bien sabido que en C, los literales de coma flotante (por ejemplo,
1.23
) tienen el tipo
double
.
Como consecuencia, cualquier cálculo que los involucre se promueve al doble.
Estoy trabajando en un sistema embebido en tiempo real que tiene una unidad de punto flotante que solo admite números de precisión (
float
).
Todas mis variables son
float
, y esta precisión es suficiente.
No necesito (ni puedo pagar) el
double
en absoluto.
Pero cada vez algo como
if (x < 2.5) ...
está escrito, ocurre un desastre: la desaceleración puede ser de hasta dos órdenes de magnitud. Por supuesto, la respuesta directa es escribir
if (x < 2.5f) ...
pero es muy fácil pasarlo por alto (y difícil de detectar hasta 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 (coma 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.
Puede convertir las constantes definidas en
(float)
donde sea que se utilicen, el optimizador debe hacer su trabajo.
Esta es una solución portátil.
#define LIMIT 2.5
if (x < (float)LIMIT) ...
Se puede usar el indicador
-fsingle-precision-constant
.
Hace que las constantes de punto 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 en variables de precisión doble.
Utilice las advertencias en su lugar:
-Wdouble-promotion
advierte sobre flotación
implícita
para duplicar la promoción, como en su ejemplo.
-Wfloat-conversion
advierte sobre casos en los que aún puede asignar dobles a flotadores.
Esta es una mejor solución que simplemente forzar valores dobles al valor flotante más cercano.
Su código de coma flotante sigue siendo compatible, y no recibirá sorpresas desagradables si un valor doble tiene un valor positivo, digamos, menor que
FLT_DENORM_MIN
(suponiendo IEEE-754) o mayor que
FLT_MAX
.