Etes-vous sûr signé zéro est votre problème? (Dans ce cas, l'ajout de 0,0 à elle — proposée par FacundoJ above — serait en fait le résoudre. A condition votre arithmétique est conforme à la norme IEEE 754, ce qui est.)
Si, d'autre part, votre problème est que printf("%f", x)
produit -0.000000
(ou similaire pour un spécificateur de format similaire), alors ajouter 0.0 n'est pas suffisant: vous obtiendrez la même sortie pour toute petite valeur, mais négative.
Dans ce cas, une programmation réelle est nécessaire (au moins je ne connais pas de meilleure solution). J'ai utilisé quelque chose comme ça l'autre jour:
int snrfmt(char *s, const char *format, double x)
{
int n, m;
char z[32];
n = sprintf(s, format, x);
m = sprintf(z, format, -DBL_MIN);
if (n == m && strcmp(s, z) == 0)
n = sprintf(s, format, 0.0);
return n;
}
comme une sorte-de remplacement pour sprintf()
:
double x = -1.23E-45;
char nr[80];
(void)snrfmt(buf, "%#+010.4f", x);
puts(nr);
Ce produit "+0000.0000
" comme on le souhaite (mais bien sûr "-0000.0001
" pour x = -0.50001E-4
).
Pour être honnête, je ne vois pas de raison de le faire. Asin va quand même retourner l'angle en -pi ... pi. – MaR