que punto precisión online numericos normalizado normalizada metodos mantisa informatica flotante ejemplos doble coma c gcc floating-point literals

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 .