Calculer entièrement en héxadécimal

(Cliquez-ici pour accéder à la version originale de cette discussion avec couleurs et images)







Posted by: frost

Bonjour à tous,

Je ne suis pas vraiment un pationné des mathématiques, j'utilise simplement les maths en programmation pour diverses taches et aujourd'hui je suis tombé sur un problème.

J'essaie de coder des valeurs entièrement en héxa décimal et je vais vous montré ce que j'arrive à faire et ce qui me dérange.

Le nombre 95 peut s'écrire en décimal comme ceci :
95
950 x 10^-1
9500 x 10^-2
etc...

En partant du fait que :
950x10^-1 est en fait ab x b^-1 avec b qui représente la base de calcul

On peut écrire :
95 = 1520x16^-1 avec b=16 pour l'héxadécimal
Ce qui se traduit par :
95 = $5F = $5F0 x F^-1

Jusque là pas de souci, tout ce passe aussi facilement qu'en décimal
95
950 x 10^-1
9500 x 10^-2

$5F
$5F0 x F^-1
$5F00 x F^-2

La simplification se fait même à l'oeil nu, tellement c'est facile.

Mais voilà mon problème : bien que ça permette d'afficher quelque chose de rapidement compréhensible par un programme drone, je ne vois pas comment traduire certaines valeurs sans ajouter un facteur d'erreur.

En fait, je n'arrive pas à trouver un calcul qui permette de transformer systématiquement un variable en donnée héxadécimale.

Par exemple, prenons la valeur 3,14.

Je pourrais la multiplier autant de fois que je voudrais par 16, je n'arriverai jamais à obtenir une écriture aussi simple que 314x10^-2.

Quelqu'un a-t-il une idée de transformation qui me permette de transformer rapidement un tel nombre en valeur héxa (la plus juste possible évidament).



Posted by: leon1789

Ton problème d'approximation est classique sur les nombres flottants que l'on change de base.

3.14 (en base 10) = 3,2 3D70A 3D70A ... (en hexa)

Du coté gauche, il y a deux chiffres après la virgule, à droite il y en a une infinité périodique : c'est comme ça et on ne peut rien y changer.

Si tu prends 3,23 (en hexa) alors le nombre décimal correspondant est 3.1367....
Si tu prends 3,24 (en hexa) alors le nombre décimal correspondant est 3.1406....
Et oui, il y a un saut, mais on n'y peut rien.

Ta question est la même que celle-ci :
<<
Je pourrais multiplier Pi (= 3.1415926....) autant de fois que je voudrais par 10, je n'arriverai jamais à obtenir une écriture aussi simple que Pi .

Quelqu'un a-t-il une idée de transformation qui me permette de transformer rapidement un tel nombre en base 10 (la plus juste possible évidament).
>>

A la rigueur, tu peux essayer la mise en fraction : 3.14 = 314 / 100 = 157/50 (en base 10) = 9D / 32 (en hexa)

Voir aussi les fractions continues : Pi = 3.1415626... ~~ 355/113 (en décimal) = 163 / 71 (en hexa)



Posted by: frost

Effectivement... Merci pour ta réponse, je crois que mon programme aurait besoin simplement lui permettant de faire des calculs sur des fractions.
Et c'est vrai que d'une base à l'autre, certains nombre ne sont qu'approximation.

Merci encore pour ta réponse.











-