2010-01-18 6 views
4

J'utilise asin pour calculer l'angle. Le code se présente comme suit:Comment se débarrasser du signe moins du zéro signé

double FindAngle(const double theValue) 
{ 
    return asin(theValue); 
} 

FindAngle renvoie -0,0 (signé zéro), lorsque l'argument theValue = -0,0. Maintenant, comment puis-je me débarrasser du signe moins de la valeur de retour.

+0

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

Répondre

3

comprennent <cmath> et utilisez la fonction abs sur votre valeur de retour, si vous voulez que tous les résultats soient positifs ou vérifier si votre valeur de retour est égale à -0,0 et prennent la valeur abs de celui-ci, pour tout ce cas.

abs function (c++ reference)

+0

si vous appliquez abs() à votre valeur d'entrée, vous allez obtenir le mauvais résultat ... –

+0

Ouais, merci. J'ai réalisé mon erreur. Avoir mis à jour la réponse. –

6

Si vous voulez juste convertir à 0 et -0 laisser intacte autre, juste faire une comparaison.

double FindAngle(double value) { 
    double res = asin(value); 
    if (res == 0.0) res = 0.0; 
    return res; 
} 
+2

Je ne pense pas que comparer deux doubles en utilisant "==" fonctionnera toujours – ratnaveer

+1

les comparaisons sur des valeurs à virgule flottante doivent être faites avec une certaine précision, c'est-à-dire fabs (a - b) MadH

+14

Cela fonctionne pour ce cas. Je crois que le demandeur veut seulement convertir '-0.0' à' 0.0', pas une gamme de flottants dans '[-epsilon, 0]'. Il y a seulement un '-0.0', et les seules valeurs' == 0.0' sont '-0.0' et' 0.0', donc '==' peut être utilisé. – kennytm

1
double FindAngle(const double theValue) 
{ 
    return abs(asin(value)); 
} 
7

Vous pouvez effectuer les opérations suivantes:

double FindAngle(const double theValue) 
{ 
    return (asin(theValue) + 0.0); 
} 

J'ai eu le même problème et qui a fonctionné pour moi.

0

Vous pouvez utiliser la méthode suivante.

value = Float.compare(value, -0.0f) == 0 ? 0.0f : value ; 
0

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

Questions connexes