Maison > développement back-end > C++ > Pourquoi cette fonction d'addition de grande précision C ne parvient-elle pas à propager correctement le transport ?

Pourquoi cette fonction d'addition de grande précision C ne parvient-elle pas à propager correctement le transport ?

Susan Sarandon
Libérer: 2025-01-04 06:55:39
original
547 Les gens l'ont consulté

Why Does This C   Large Precision Addition Function Fail to Propagate Carry Correctly?

Impossible de propager la valeur via Carry

Lors d'une récente tentative de création d'une classe mpfl de grande précision en C, le développeur a rencontré un problème où l'ajout de 0xffffffff et 0x04 aboutissait à 0xffff0003 au lieu de celui attendu 0x0100000003. La fonction d'ajout responsable de l'opération est décrite ci-dessous :

mpfl operator+(const mpfl &lhs, const mpfl &rhs)
{
    unsigned long i;
    mpfl ret(0);
    mpfl trhs(rhs);
    for (i = lhs.nbytes; i >= 0; i--)
    {
        if (
            (unsigned short)lhs.data[i].data + (unsigned short)trhs.data[i].data
            > (unsigned short)255
        ) {
            if (i > 0)
            {
                ret.data[i].carry = 1;
                ret.data[0].carry = 0;
            }
            else
            {
                ret.data[0].carry = 1;
            }
        }
        else
            ret.data[i].carry = 0;
        ret.data[i].data = lhs.data[i].data + trhs.data[i].data;
        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;
        }
        if (i == 0) break;
    }
    return ret;
}
Copier après la connexion

Bien que l'objectif de cette fonction soit d'ajouter deux grandes valeurs de précision, elle ne parvient pas à gérer correctement la propagation du report, ce qui conduit à des résultats inexacts. Pour résoudre ce problème, tenez compte des suggestions suivantes :

  • Implémenter l'architecture ALU : optimisez le code à l'aide d'une architecture d'unité logique arithmétique (ALU) similaire au matériel réel. Cette approche peut simplifier et améliorer l'efficacité des calculs.
  • Toujours appliquer le report : dans la fonction d'ajout, assurez-vous que le report est appliqué de manière cohérente, sauf pour la première itération. Le report doit être pris en compte dans les ajouts ultérieurs pour donner les résultats corrects.
  • Vérifier l'ordre des chiffres : Confirmez que les chiffres des nombres sont stockés et traités dans le bon ordre. En règle générale, ils doivent être ajoutés du chiffre le moins significatif au chiffre le plus significatif.

De plus, pour les opérations de multiplication et de division de grande précision sans assemblage, reportez-vous au lien suivant pour une implémentation pure C/C :

[Créer une fonction logarithme en C sans utiliser Float Tapez](https://stackoverflow.com/questions/11762232/building-a-logarithm-function-in-c-without-using-float-type)

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal