72 votes

Faire des littéraux à virgule flottante en C des flottants (plutôt que des doubles)

Il est bien connu qu'en C, les littéraux en virgule flottante (par ex. 1.23 ) ont le type double . En conséquence, tout calcul qui les implique est promu au double.

Je travaille sur un système temps réel embarqué qui possède une unité à virgule flottante qui ne supporte qu'une seule précision ( float ). Toutes mes variables sont float et cette précision est suffisante. Je n'ai pas besoin (ni ne peux me permettre) double du tout. Mais à chaque fois que quelque chose comme

if (x < 2.5) ...

est écrit, un désastre se produit : le ralentissement peut atteindre deux ordres de grandeur. Bien sûr, la réponse directe est d'écrire

if (x < 2.5f) ...

mais c'est tellement facile à manquer (et difficile à détecter jusqu'à ce qu'il soit trop tard), surtout lorsqu'une valeur de "configuration" est #define dans un fichier séparé par un développeur moins discipliné (ou juste nouveau).

Existe-t-il un moyen de forcer le compilateur à traiter tous les littéraux (à virgule flottante) comme des flottants, comme s'ils avaient le suffixe f ? Même si c'est contre les spécifications, je m'en fiche. Ou d'autres solutions ? Le compilateur est gcc, d'ailleurs.

80voto

ameyCU Points 2095

-fsingle-precision-constant peut être utilisé. Il fait en sorte que les constantes à virgule flottante soient chargées en simple précision même si ce n'est pas exact.

Note- Ceci utilisera également les constantes de simple précision dans les opérations sur les variables de double précision.

50voto

Brett Hale Points 9724

Utilisez plutôt des avertissements : -Wdouble-promotion met en garde contre implicite float à la promotion double, comme dans votre exemple. -Wfloat-conversion vous avertira des cas où vous pouvez encore assigner des doubles à des flottants.

C'est une meilleure solution que de simplement forcer les valeurs doubles à la valeur flottante la plus proche. Votre code en virgule flottante est toujours conforme, et vous n'aurez pas de mauvaises surprises si une valeur double contient une valeur positive, disons inférieure à FLT_DENORM_MIN (en supposant que IEEE-754) ou supérieur à FLT_MAX .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X