2011-06-04 3 views
2

Cette demande a probablement été probablement avant, mais je ne pouvais pas trouver quoi que ce soit pertinent.Implémentation décimal/arithmétique arbitraire en utilisant les types de données comme nombre entier

Serait-il possible/mettre en œuvre une performante sorte de arithmatic arbitraire/décimal par une classe spécialisée ou struct d'un montant arbitraire/fixe d'entiers?

Permettez-moi de préciser; flotte (comme je le comprends), utilise une mantisse, un exposant et peut-être un bit de signe. Ils sont capables de représenter 1/2, 1/4, 1/8, etc ... mais pas, disons 1/10. Ce que je propose est quelque chose comme ceci: que le nombre soit représenté par un int ou int64_t ou une série de ceux-ci, en gardant seulement les valeurs jusqu'à une puissance de dix complètement couvert par la gamme de l'entier (ainsi pour un entier de 32 bits, la limite serait de 10^8-1). Ceci seulement pour garder le calcul facile. Ajoutez à cela un exposant, qui dira quelle puissance de dix il devrait être multiplié pour obtenir le nombre réel.

Un exemple: 125,36 serait représenté par un int égal à 12536 et une puissance de dix égale à -2. Ce nombre prendrait en effet autant que int s, et un tas de fonctions spéciales.

Un autre exemple: 4294967297 (qui est égal à 2^32 + 1) prendrait deux int s, une égal à 4, l'autre égale à 294.967.297, et une puissance de dix égal à 0.

Est-ce un bonne idée, jetant toute cette mémoire pour une arithmétique plus simple/plus rapide? Je n'ai pas tout à fait pensé à la partie de débordement, peut-être calculer int32_t+int32_t=int64_t résoudrait cela magnifiquement?

Répondre

0

Vous vous posez sur les limites de précision de l'arithmétique binaire. Je pense que le trading de précision binaire pour la précision décimale ne vous mènera nulle part.

Vous avez raison, binaire peut représenter 1/2 et 1/4, mais pas 1/10, qui décimal. Mais les deux ne peuvent pas représenter 1/3. Donc, il y aura toujours une certaine limitation de la précision. (Il peut être caché pour les calculs décimaux, puisque nous obtenons la plupart des données dans la vie réelle au format décimal, ce qui signifie que la plupart des données réelles sont arrondies à n'importe quelle décimale.)

Cela dit, vous pouvez regarder (si python est votre langue), qui a mis en place le comportement, que vous semblez vouloir: calculer les mathématiques décimales de la façon dont nous avons appris à l'école avec une précision «au besoin».

+0

Oui, bon point, mais ne sera pas mon plan en mesure d'obtenir plus de précision que simple '' double' ou même à long double', avec des performances peut-être décent sans de frais généraux? Ou est-ce que je repense les solutions existantes qui sont beaucoup, beaucoup mieux? – rubenvb

+0

Eh bien, je ne suis certainement pas un expert dans ce domaine. Quel est ton but? Vitesse - puis effectuez les opérations habituelles en virgule flottante; cpu d'aujourd'hui sont hautement optimisés pour ce genre de chose. Précision - alors pourquoi doit-il être décimal? (Vraiment, juste mon 2c, rien sur quoi compter vraiment.) – jammon

Questions connexes