2010-01-15 3 views
2

J'ai une classe de vecteurs en C# (un fragment ci-dessous). Mon problème est que quand j'appelle GetMagnitude(), il renvoie toujours 0.0f - même avec le débogueur en cours d'exécution et je vérifie que Sq a une valeur valide, dès qu'il est passé dans une autre fonction (par exemple: Normalize()), il a retourné 0.0f. Quelqu'un peut-il expliquer cela et m'aider à le résoudre? Je suppose que cela a quelque chose à voir avec la conversion double-> float mais je ne peux pas le comprendre.Pourquoi la valeur de retour est-elle incorrecte?

public class float3 
{ 
    public float x; 
    public float y; 
    public float z; 


    public float GetMagnitude() 
    { 
     float SumSquares = (float)(Math.Pow(x, 2) + Math.Pow(y, 2) + Math.Pow(z, 2)); 
     float Sq = (float)Math.Sqrt(SumSquares); 
     return Sq; 
    } 

    public void Normalize() 
    { 
     float inverse = 1.0f/GetMagnitude(); 

     x *= inverse; 
     y *= inverse; 
     z *= inverse; 
    } 
} 
+0

Avez-vous déjà initialisé x, y et z? Dans votre exemple, il serait évidemment retourner 0. – Leif

+0

vous pourriez envisager d'écrire x * x + y * y + z * z plutôt que d'utiliser Math.Pow ... il est à la fois plus court et plus rapide ... – Spudd86

Répondre

5

Je viens de tester votre code avec cette configuration et il a parfaitement fonctionné:

void Main() 
{ 
    var myData = new float3 
    { 
     x = 1, 
     y = 1, 
     z = 1 
    }; 
    float result = myData.GetMagnitude(); 
} 

-je obtenir le résultat 1,73 ...

Est-il possible que le problème est ailleurs? Pourriez-vous créer une petite application de console et insérer ce code simplement pour l'isoler?

+0

J'ai également testé et ça a bien fonctionné. – AaronLS

+1

Comment très embarrassant. On dirait que tu as raison et que mes tests ne l'étaient pas. Leçon apprise. Enlève * tout * d'autre avant de prétendre que le code est faux. Mes excuses et merci. – User2400

Questions connexes