Maison >développement back-end >C++ >Pourquoi mon addition C Large Precision ne propage-t-elle pas correctement les bits de transport ?

Pourquoi mon addition C Large Precision ne propage-t-elle pas correctement les bits de transport ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-11 11:50:11711parcourir

Why Doesn't My C   Large Precision Addition Propagate Carry Bits Correctly?

Impossible de propager la valeur via carry

Votre objectif est d'implémenter une grande classe de précision en C et vous avez rencontré un problème lors de l'addition de nombres. Lorsque vous ajoutez 0xffffffff et 0x04, vous obtenez 0xffff0003 au lieu du 0x0100000003 attendu.

Source du problème

La section en surbrillance de votre code est :

if (i < lhs.nbytes)
{
    if (ret.data[i].data == 255 && ret.data[i + 1].carry == 1) increment(&trhs, i + 1);
    ret.data[i].data += ret.data[i + 1].carry;
}

Voici pourquoi cela provoque le mauvais résultat :

Carry Propagation : À chaque itération de la boucle, le report de l'ajout précédent doit être ajouté au résultat actuel. Cependant, ce code n'applique le report que si ret.data[i].data vaut 255 et ret.data[i 1].carry vaut 1. Cela signifie que les reportages ne sont pas toujours propagés, ce qui entraîne une réponse incorrecte.

Ordre de stockage incorrect : La classe mpfl semble stocker les nombres au format petit-boutiste, où l'octet le moins significatif est stocké dans l'index le plus élevé. Ce n'est pas la méthode privilégiée pour stocker des nombres à ajouter, car elle rend plus difficile le traitement des transferts à partir d'octets d'ordre supérieur.

Recommandations

Pour résoudre ces problèmes, tenez compte des recommandations suivantes :

  1. Stocker les numéros au format big-endian : placez l'octet de poids fort dans l'index le plus bas. Cela rend la propagation du report simple.
  2. Propager les reportages de manière cohérente : Dans la fonction opérateur, assurez-vous que le report de chaque ajout est propagé à l'itération suivante, quelles que soient les valeurs de ret.data[ i].data et ret.data[i 1].carry.
  3. Utilisez une ALU personnalisée (Arithmetic Logic Unit) : implémentez une classe ALU légère qui fournit des opérations arithmétiques de base, y compris l'addition et la propagation du report. Cette approche peut simplifier votre code et améliorer les performances.
  4. Examinez la base de code complète : l'extrait de code fourni n'est qu'une petite partie de la classe mpfl plus grande. Il est essentiel de revoir l'ensemble de la mise en œuvre, en particulier les sections responsables de la gestion du transport et de la manipulation des chiffres.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn