2010-11-17 6 views
2

Je suis une programmation amateur pour une application embarquée. L'application nécessite de la vitesse. Je voudrais déterminer si une certaine variable (appelez-le "X") a passé un certain pourcentage (appelez-le "Y") d'une autre variable (appelez-le "Z").Vous cherchez un bon substitut pour calculer le pourcentage en utilisant des maths entiers

X, Y et Z peuvent tous changer lors de l'exécution. Puisque j'ai besoin de vitesse, je voudrais le faire en utilisant des maths entiers par opposition à float, ce qui entraîne une pénalité de vitesse.

Y a-t-il des astuces pour cela? Je suis un programmeur auto-formé alors s'il vous plaît excusez-moi si c'est un problème bien connu avec une solution bien connue.

Merci!

Répondre

2

donc ce que vous voulez est de tester 1*X > Z*Y il n'y a rien qui vous empêche de faire exactement cela, définir simplement 1 (et donc 100%) pour être 10^decPlacesdecPlaces>=2 (sinon vous n'aurez pas assez de précision pour faire des pourcentages en int s

si vous avez besoin de calculs exacts dans 4 dp si X = 10 puis X_fixed_precision = 100000 si Y est de 30% (0,3) puis Y_fixed_precision=3000 et si Z=10000 alors z_fixed_precision=100000000 cette astuce est appelée arithmétique fixe de précision ...

Si tu veux encore mieux p erformace utilise des puissances de 2 au lieu de 10 (il est plus difficile de traduire exactement combien de décimales cela vous apporte mais devrait être un peu plus rapide)

par exemple. votre code chercherais probablement comme

if (ONE_FIXED_PRECISION * X_fixed_precision > Z_fixed_precision * Y_fixed_precision) 
    // Do something 

FOO_fixed_precision = FOO * ONE_FIXED_PRECISION

Veillez à ce que vous n'allez y arriver débordement d'entier bien - la valeur maximale de X * ONE_FIXED_POINT * ONE_FIXED_POINT doit être inférieure à la valeur maximale que vous pouvez stocker dans un mot (ou double mot si vous utilisez des types entiers plus longs)

+0

Pardonner la question de débutant, désolé, mais pourquoi (par exemple) 100 * x/y> z au lieu de 100 * x> z * y? –

+0

parce que c'était la façon dont j'ai travaillé à travers les maths dans ma tête ... (ça fait un moment que ive a dû utiliser cette technique) je vais éditer, la manière de multiplication pure est plus précise – tobyodavies

+0

Bingo! Merci d'avoir aidé un vrai newb. Si vous vous demandez ce que vous m'avez aidé à faire, j'essaie de faire une horloge à hélice semblable aux horloges à disque dur que vous pouvez voir sur youtube. Apprécier ton aide! – Shaun

Questions connexes