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.
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
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
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