J'utilise Asin pour calculer l'angle. Le code est comme ci-dessous:
double FindAngle(const double theValue) { return asin(theValue); }
6 Réponses :
Inclure
abs code> 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 code> abs code> de celui-ci, pour ce cas. P>
Oui merci. J'ai réalisé mon erreur. Ont mis à jour la réponse.
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; }
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
@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 i> faux avec la comparaison des valeurs de point flottant à l'aide de
-0.0 code> à
0.0 code>, pas une gamme de flotteurs dans
[- epsilon, 0] code>. Il n'y a qu'un seul
-0,0 code>, et les seules valeurs
== 0.0 code> sont
-0.0 code> et
0.0 code>, donc le
== code> peut être utilisé.
== code> ou
! = code> 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 code> à
0 code>).
double FindAngle(const double theValue) { return abs(asin(value)); }
Cela rendra tous les résultats positifs, pas seulement le zéro négatif.
Vous pouvez faire ce qui suit:
double FindAngle(const double theValue) { return (asin(theValue) + 0.0); }
Vous pouvez utiliser la méthode suivante.
value = Float.compare(value, -0.0f) == 0 ? 0.0f : value ;
Ê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 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: p> comme une sorte de remplacement pour Ceci produit " printf ("% f", x) code> produit
-0.000000 code> (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. p>
sprintf () code>: p>
+0000.0000 code>" comme désiré (mais bien sûr "
-0000.0001 code>" pour
x = -0.50001e-4 code>). p> p>
Pour être honnête, je ne vois pas une raison de faire cela. Asin va quand même retourner l'angle dans -PI ... PI.