Il existe de nombreuses façons de stocker des nombres fractionnaires, et chacun d'eux présente des avantages et des inconvénients.
La virgule flottante est, de loin, le format le plus populaire. Il fonctionne en codant un signe, une mantisse et un exposant de base 2 signé en entiers, et en les regroupant en un tas de bits. Par exemple, vous pourriez avoir une mantisse 32 bits de 0.5
(codé comme 0x88888888
) et un exposant signé 32 bits de +3
( 0x00000003
), qui décoderait en 4.0
(0.5 * 2 ^ 3
). Les nombres à virgule flottante sont rapides, car ils sont implémentés dans le matériel et leurs échelles de précision avec une taille absolue, c'est-à-dire que plus le nombre est petit, meilleure est votre précision absolue, de sorte que l'erreur d'arrondi relative reste constante avec la taille absolue. Les flotteurs sont excellents pour les valeurs échantillonnées à partir d'un domaine continu, telles que les longueurs, les niveaux de pression acoustique, les niveaux de lumière, etc., et pour cette raison, ils sont couramment utilisés dans le traitement audio et d'image, ainsi que dans l'analyse statistique et les simulations physiques. Leur plus gros inconvénient est qu'ils ne sont pas exacts, c'est-à-dire qu'ils sont sujets à des erreurs d'arrondi et qu'ils ne peuvent pas représenter avec précision toutes les fractions décimales. Tous les langages de programmation traditionnels ont une sorte de flotteur.
Un point fixefonctionne en utilisant des entiers suffisamment grands et en réservant implicitement une partie de leurs bits pour la partie fractionnaire. Par exemple, un nombre à virgule fixe de 24,8 bits réserve 24 bits pour la partie entière (signe compris) et 8 bits pour la partie fractionnaire. Décaler ce nombre de 8 bits vers la droite nous donne la partie entière. Les nombres à virgule fixe étaient populaires lorsque les unités matérielles à virgule flottante étaient rares ou au moins beaucoup plus lentes que leurs homologues entiers. Bien que les nombres à virgule fixe soient un peu plus faciles à gérer en termes d'exactitude (ne serait-ce que parce qu'ils sont plus faciles à raisonner), ils sont inférieurs aux flottants à presque tous les autres égards - ils ont moins de précision, une plage plus petite et parce que plus des opérations sont nécessaires pour corriger les calculs du décalage implicite, les mathématiques à virgule fixe sont aujourd'hui souvent plus lentes que les mathématiques à virgule flottante.
Les types décimaux fonctionnent un peu comme des flottants ou des nombres à virgule fixe, mais ils supposent un système décimal, c'est-à-dire que leur exposant (implicite ou explicite) code la puissance de 10, pas la puissance de 2. Un nombre décimal pourrait, par exemple, coder une mantisse de 23456
et un exposant de -2
, et cela s'élargirait à234.56
. Les décimales, parce que l'arithmétique n'est pas câblée dans le CPU, sont plus lentes que les flottants, mais elles sont idéales pour tout ce qui implique des nombres décimaux et a besoin que ces nombres soient exacts, avec l'arrondi se produisant à des endroits bien définis - calculs financiers, tableaux de bord, etc. Certains langages de programmation ont des types décimaux intégrés (par exemple C #), d'autres nécessitent des bibliothèques pour les implémenter. Notez que si les décimales peuvent représenter avec précision des fractions décimales non répétitives, leur précision n'est pas meilleure que celle des nombres à virgule flottante; choisir des décimales signifie simplement que vous obtenez des représentations exactes de nombres qui peuvent être représentés exactement dans un système décimal (tout comme les flottants peuvent représenter exactement des fractions binaires).
Les nombres rationnels stockent un numérateur et un dénumérateur, en utilisant généralement une sorte de type entier bignum (un type numérique qui peut augmenter aussi grand que le permettent les contraintes de mémoire de l'ordinateur). C'est le seul type de données du groupe qui peut modéliser avec précision des nombres comme 1/3
ou 3/17
, ainsi que des opérations sur eux - les rationnels, contrairement aux autres types de données, produiront des résultats corrects pour des choses comme3 * 1/3
. Les calculs sont assez simples, bien que trouver un algorithme de factorisation efficace soit plutôt difficile. Certains langages de programmation ont des types rationnels intégrés (par exemple Common Lisp). Les inconvénients des rationnels incluent qu'ils sont lents (de nombreuses opérations nécessitent de réduire les fractions et de factoriser leurs composants), et que de nombreuses opérations courantes sont difficiles ou impossibles à implémenter, et la plupart des implémentations dégraderont le rationnel en flottant lorsque cela se produira (par exemple lorsque vous appelez sin()
sur un rationnel).
BCD (Binary Coded Decimal) utilise des "quartets" (groupes de 4 bits) pour coder des chiffres individuels; comme un quartet peut contenir 16 valeurs différentes, mais que les nombres décimaux ne nécessitent que 10, il y a 6 valeurs "illégales" par quartet. Comme les décimales, les nombres BCD sont exacts en décimales, c'est-à-dire que les calculs effectués sur les nombres décimaux fonctionnent comme s'ils le faisaient avec un stylo et du papier. Les règles arithmétiques pour BCD sont quelque peu maladroites, mais l'avantage est que les convertir en chaînes est plus facile qu'avec certains autres formats, ce qui est particulièrement intéressant pour les environnements à faibles ressources comme les systèmes embarqués.
Les chaînes , oui, les vieilles chaînes simples, peuvent également être utilisées pour représenter des nombres fractionnaires. Techniquement, c'est très similaire à BCD, seulement qu'il y a un point décimal explicite et que vous utilisez un octet complet par chiffre décimal. En tant que tel, le format est inutile (seulement 11 des 256 valeurs possibles sont utilisées), mais il est plus facile à analyser et à générer que BCD. De plus, comme toutes les valeurs utilisées sont "peu suspectes", inoffensives et neutres sur la plate-forme, les nombres codés en chaîne peuvent voyager sans problème sur les réseaux. Il est rare de trouver des calculs arithmétiques directement sur les chaînes, mais c'est possible, et lorsque vous le faites, ils sont tout aussi décimaux que les autres formats décimaux (décimaux et BCD).