==
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)