6
votes

Comment se débarrasser du signe moins de zéro signé

J'utilise Asin pour calculer l'angle. Le code est comme ci-dessous:

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


1 commentaires

Pour être honnête, je ne vois pas une raison de faire cela. Asin va quand même retourner l'angle dans -PI ... PI.


6 Réponses :


3
votes

Inclure et utilisez la fonction abs de votre valeur de retour, si vous voulez que tous les résultats soient positifs ou vérifiez si votre valeur de retour est égale à - 0.0 et prendre la valeur abs de celui-ci, pour ce cas.

Fonction ABS (référence C ++)


1 commentaires

Oui merci. J'ai réalisé mon erreur. Ont mis à jour la réponse.



6
votes

Si vous voulez simplement convertir -0 à 0 et laisser d'autres intacts, faites simplement une comparaison.

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


6 commentaires

Je ne pense pas à comparer deux doubles en utilisant "==" fonctionnera toujours


Les comparaisons sur les valeurs de points flottants doivent être effectuées avec une certaine précision, c'est-à-dire fabs (A - B)


Cela fonctionne pour ce cas. Je crois que l'astucieux ne veut que convertir -0.0 à 0.0 , pas une gamme de flotteurs dans [- epsilon, 0] . Il n'y a qu'un seul -0,0 , et les seules valeurs == 0.0 sont -0.0 et 0.0 , donc le == peut être utilisé.


@Madh: Ce n'est absolument pas "malade". Dans ce cas, toute comparaison utilisant un seuil serait incorrecte.


@yes, dans ce cas, seuil ne vous aide pas; Afin de résoudre un problème en place, on pourrait diviser à zéro, puis vérifier quelle infinité il donne: + INF ou -INF et retourne FABS () en cas de -inf


@RATNAVERER, @MADH: Il y a absolument rien faux avec la comparaison des valeurs de point flottant à l'aide de == ou ! = supposant que c'est ce qui est nécessaire. Dans ce cas particulier, il est parfaitement approprié, dans l'interprétation formelle du problème (c'est-à-dire lorsque nous devons convertir -0 à 0 ).



0
votes
double FindAngle(const double theValue)
{
    return abs(asin(value));
}

1 commentaires

Cela rendra tous les résultats positifs, pas seulement le zéro négatif.



8
votes

Vous pouvez faire ce qui suit:

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


0 commentaires

0
votes

Vous pouvez utiliser la méthode suivante.

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


0 commentaires

0
votes

Êtes-vous sûr que cela a signé zéro est votre problème? (Dans ce cas, ajout de 0,0 à celui-là-tel que proposé par Facundoj ci-dessus etvriez en fait la résoudre. Fourni que votre arithmétique est conforme. à IEEE 754, c'est-à-dire.)

Si, d'autre part, votre problème est que printf ("% f", x) produit -0.000000 (ou Similaire pour un spécificateur de format similaire), il suffit d'ajouter 0,0 0.0 n'est pas suffisant: vous obtiendrez la même sortie pour tout petit, mais négatif, valeur.

Dans ce cas, une programmation réelle est nécessaire (au moins i connaître aucune meilleure solution). J'ai utilisé quelque chose comme ça l'autre jour: xxx

comme une sorte de remplacement pour sprintf () : xxx

Ceci produit " +0000.0000 " comme désiré (mais bien sûr " -0000.0001 " pour x = -0.50001e-4 ).


0 commentaires