2016-11-24 1 views
0

Je cherche un conseil pour un programme Qt sur lequel je travaille, qui utilise Qwt pour tracer un graphique linéaire. Fondamentalement, mon problème provient de l'axe x du graphique, qui est en 24:00 heure. J'ai un QPolygonF qui stocke une série de QPointF s qui détiennent les valeurs pour ma courbe de tracé, où chaque 1.0 dans l'axe x équivaut à 1 seconde. J'utilise ensuite timestamp unix pour définir chaque valeur pour l'axe x, donc j'ai double xAxis initialisé à 0.0 qui est ajouté au QPolygonF comme points.append(xAxis, yAxis) pour le début de la courbe et pour chaque point par la suite, j'utilise currentTime - prevTime pour trouver la différence entre les deux horodatages puis augmenter xAxis par ladite différence en utilisant +=. Si ça a du sens.Utilisation de QPointF avec Big Doubles

Quoi qu'il en soit, actuellement tout est affiché en secondes entières et il fonctionne parfaitement bien. Cependant, j'en ai besoin pour être précis à la milliseconde. Ce dont j'ai besoin de conseils est de travailler avec de grands doubles de haute précision.

Travailler avec les horodatages unix en secondes est facile car cela peut être fait avec un simple int, mais lorsque vous augmentez le nombre de chiffres pour inclure des millisecondes double s sont passés en notation scientifique.

Ma question est: comment puis-je stocker des nombres potentiellement importants, comme 22429.388 ou plus, s'ils retournent à la notation scientifique?

Merci et désolé si c'est une question très basique.

Répondre

0

Vous dites que l'axe graphique est 24:00 long. Ce sera 24*3600 secondes, donc 24*3600*1000 millisecondes: 86,400,000 qui est beaucoup plus petit que INT_MAX (=2,147,483,647).

Donc, il ne devrait pas y avoir de problème pour stocker vos valeurs x comme int. Vous avez juste besoin de faire en sorte que la valeur du premier axe soit 0 alors la valeur du dernier axe sera 86,400,000. Si vos heures ne commencent pas à 0, il vous suffit de définir la plus petite heure affichée comme "date de référence" et de stocker les valeurs basées sur cette "date de référence" (pour garantir qu'elles seront toutes comprises entre 00:00:00.0000 (ie: 0 en tant que int) et 24:00:00.0000 (c'est-à-dire: 86,400,000 en tant que int)).

+0

Merci d'avoir répondu! Je suis désolé, je voulais dire que le graphique est affiché dans 'hh: mm'. Cela pourrait durer plus de 24 heures. J'utilise 'int's actuellement, ce qui est parfaitement correct pour une précision allant jusqu'à' hh: mm: ss'. Je vais essayer d'être plus clair cette fois: le problème que je rencontre est d'utiliser de grands nombres avec 'doubles', dont j'ai besoin pour le' QPointF' qui contient les coordonnées de ma courbe de tracé. Comme les doubles ne contiennent que 6 chiffres avant de passer à la notation scientifique, le maximum que je peux avoir est de 999,999, soit environ 16 minutes. Si la différence entre 'currentTime - prevTime' est plus de 17 minutes je ne peux pas le calculer. – mrwolf

+0

double a une bien meilleure précision que ce que vous dites. Si vous obtenez seulement trois chiffres, c'est juste que vous ne l'imprimez pas correctement. Où avez-vous vu que 999,999 serait la plus grande valeur que vous pourriez obtenir? – jpo38