2010-11-20 5 views
0

Les flottants ne calculent pas comme prévu dans mon programme Java/JOGL (OpenGL pour Java). Dans une méthode de dessin lorsque chaque image (à 60 images par seconde) est appelée, j'essaie de modifier la position d'un objet. Toutes les valeurs sont des valeurs flottantes.Le flottement Java échoue multiplication, ajout lors de la modification de la position de l'objet

float timeElapsed=((float)(System.currentTimeMillis()-lastdrawn))/1000; 
float moveZ=(timeElapsed*momentumZ); 
System.out.println(moveZ); 
this.transformation.z+=moveZ; 
System.out.println(this.transformation.z); 

Depuis momentumZ est initialisé avec 0.2f et this.transformation.z est initialisé avec 0.0f, l'objet doit se déplacer sur l'axe z. Mais ma sortie est:

... 
0.0024 
2.58058064E8 
0.0052 
2.58058064E8 
8.0000004E-4 
2.58058064E8 
0.001 
2.58058064E8 

Ainsi, moveZ a la bonne valeur mais l'addition la salit. si j'essaie d'ajouter une valeur constante telle que 0.05f à chaque image, l'objet se déplace.

Où cette erreur peut-elle être? Y a-t-il quelque chose à propos des flotteurs que je ne connais pas?

+0

L'addition de flotteur fonctionne sûrement; l'erreur doit être ailleurs. Peut-être que quelque chose se passe dans un autre fil? – Seth

Répondre

3

Notez que:

2.58058064E8 

est ~ 258 millions. Vous ajoutez

0.0024 

à cela, va pas changer quoi que ce soit ...

Si vous n'êtes pas familier avec cette représentation d'un nombre à virgule flottante, consultez l'article ici:

+0

oui, mais la question est, si j'init une valeur à 0 et que je la modifie en ajoutant des valeurs comme 0.0024, comment s'élève-t-elle à une valeur de 258 millions? – Cookie

+0

Il y a beaucoup de facteurs (qui dépendent de votre autre code) changez cela: d'abord, qu'est-ce que lastdrawn au début, alors qu'est-ce que this.transformation - si c'est une classe, alors est-il possible qu'il y ait une autre méthode qui change 'this.transformation.z'? Je vous suggère de déterminer quand est la première fois qu'il saute de 0 à 2.5E8 et voir ce qui l'a causé. –

+0

Donc, en d'autres termes, pourquoi this.transformation.z + = moveZ l'incrémente à 258 millions mais this.transformation.z + = 0.0024f non? Je viens de changer cette ligne, le reste du code est complètement identique. – Cookie

1

Mon conjecture est que vous commencez avec lastDrawn == 0 qui sera m Faites un grand nombre supplémentaire pour moveZ en premier lieu.

Éditer: Vous devez vider timeElapsed sur la console, il devrait apporter de la lumière dans l'obscurité.

+0

fu * + # § $ ... acclamations mate – Cookie

Questions connexes