== entre des flottants ?NaN ?printf(), le nombre à
imprimer est converti en base 2 puis reconverti en base 10, ce qui
augmente encore les imprécisions.
Il est préférable d'utiliser les double, qui ont une
précision supérieure aux float, sauf si l'économie de
mémoire est vraiment critique.
math.h, d'avoir correctement
déclaré les autres fonctions renvoyant des double. Une
autre fonction de la bibliothèque standard avec laquelle il faut
faire attention est atof(), dans stdlib.h.
-lm à la fin de la ligne de
commande.
Rappelez-vous qu'aucun calcul sur des flottants n'a de chance
d'être exact, en particulier, n'utilisez jamais == entre
deux flottants.
Ces problèmes ne sont pas spécifiques au C.
Dans certains problèmes, une solution peut être d'introduire un
petit paramètre de relaxation, par exemple #define EPS
1e-10, puis de multiplier l'un des termes (judicieusement
choisi) de vos calculs par (1 + EPS).
Pour plus de renseignements, on se reportera par exemple aux Numerical Recipes ou à Numerical Algorithms with C (cf. 3.9).
== entre des flottants ?
double a, b;
/* ... */
if (a == b) /* HORREUR ! */
/* ... */
on écrira :
#include <math.h>
/* ... */
double a, b;
/* ... */
if (fabs (a - b) <= epsilon * fabs (a) )
/* ... */
où l'on aura judicieusement choisi epsilon
(non-nul !).
(int)(x +
0.5). Cette technique ne fonctionne pas correctement pour
les nombres négatifs aussi vaut-il mieux utiliser
(int)(x < 0 ? x - 0.5 : x + 0.5)
pow() déclarée dans
math.h bien que la multiplication soit préférable pour de
petits exposants.
M_PI est déclarée dans
math.h mais ce n'est pas standard aussi vaut-il mieux
calculer pi soi-même via 4 * atan
(1.0).
NaN ?« NaN is Not a Number », ce qui signifie
« Ce n'est pas un nombre ».
Un NaN est un nombre flottant qui est le résultat d'une
opération non conforme, par exemple 0/0.
Lorsqu'un NaN est produit, la plupart des architectures
produisent une interruption (ou un signal) qui termine le
programme, au moment de l'utilisation de celui-ci.
Il est parfois possible de vérifier si un nombre est
NaN. Un bon test est celui-ci :
#define isNaN(x) ((x) != (x))
Certains compilateurs fournissent des facilités quant à la gestion
des NaN. GCC fournit dans la bibliothèque
mathématique (math.h) les fonctions isnan(),
isinf() et finite().
faq-fclc 5/3/2002 (8h 59:05)