2011-04-23 2 views
0

J'essaie de faire une division avec le point flottant. Mais le problème est que je représente le nombre à virgule flottante dans deux variables. Qty_int et Qty_deci. Ie, 2,5 est représenté par Qty_int = 2, Qty_deci = 5.Division Float spécial sans beaucoup de frais généraux

Ma question est comment vais-je diviser ce type de nombres avec deux? soit 2,5/2, où deux et cinq sont dans des variables différentes. La division ne doit pas être coûteuse et le type de données float ne doit pas être utilisé. Est-ce qu'il y a un moyen de faire ça??

+0

Cela ressemble beaucoup à une tâche de devoirs, alors j'ai ajouté le "devoirs" -tag. N'hésitez pas à l'enlever si je me trompe. – kusma

+0

Désolé ce n'est pas un devoir.J'ai une implémentation mais j'ai besoin d'une implémentation plus 'optimisée' – Harikrishnan

+0

Alors, essayez-vous d'implémenter un point flottant sur un CPU sans support à virgule flottante ou quelque chose du genre? Est-ce que cela doit être conforme à la norme IEEE-754? – kusma

Répondre

2

Si Qty_deci est un nombre entier, vous ne pouvez pas différencier entre 2,5 et 2,05. Vous auriez besoin de trois variables.

2.5 = (2) + (5) * 10^(-1) 
2.05 = (2) + (5) * 10^(-2) 
     ^ ^  ^
     |  |   | 

Ou deux variables différentes avec des valeurs différentes de vos valeurs actuelles.

2.5 = (25) * 10^(-1) 
2.05 = (205) * 10^(-2) 
     ^  ^
      |   | 

Mais cela ne suffit rien à moins que vous passez à l'aide de base 2 au lieu de 10.

2.5 = (0x5000)/2*(15-2) 
2.05 = (0x4199)/2*(15-2) 
      ^  ^
      |   | 

Ensuite, la division parce que possible.

2.5/2.0 

= ((0x5000)/2*(15-2))/((0x4000)/2*(15-2)) 

= (0x5000) * 2*(15-2)/(0x4000)/2*(15-2) 

= (0x5000) << (15-2)/(0x4000)/2*(15-2) 

= (0x2800)/2^(15-2) 

= 1.25 

Notez que la division ci-dessus est une division entière.

Vous n'avez même pas besoin de stocker le deuxième numéro. Nous avions une machine sans support arithmétique à virgule flottante. Nous avons utilisé fixed point arithmentic. C'est fondamentalement le même que ci-dessus, sauf que vous ne stockez jamais le second numéro ailleurs que dans les commentaires.

Par exemple, si nous avions 16 variables de bits et nous avons réservé un pour le signe et 2 bits pour la partie entière (« B2 »),

L'équivalent de cela serait fait par la fonction d'entrée:

int16 qty_B2 = 2.5 * 2**(15-2); // 2.5 B2 = 0x5000 

l'équivalent de cela serait fait par votre compilateur ou manuellement:

int16 div_B2 = 2.0 * 2**(15-2); // 2.0 B2 = 0x4000 

et voici comment vous faites la division:

int32 qty_32_B2 = qty_B2 << 16; // 2.50 B2 
int32 qty_32_B4 = qty_32_B2 >> 2; // 2.50 B4 
int16 res_B2 = qty_32_B4/div_B2; // 1.25 B4-B2=B2 

L'équivalent de cela serait fait par la fonction de sortie:

printf("%f", res/2**(15-2)); 

Notez que la division ci-dessus est une division entière.

+0

Merci pour vos suggestions – Harikrishnan

1

Est-ce que Qty_deci est une chaîne? Si non, comment allez-vous représenter 2.01?

Je vous déconseille vivement d'implémenter votre propre format de virgule flottante personnalisé. Reconsidérez en utilisant un format natif à virgule flottante (quelles sont vos raisons de ne pas l'utiliser?) Ou utilisez une bibliothèque qui implémente des maths décimales de précision arbitraire.

Questions connexes