Problème de propagation de report dans l'addition mpfl
Votre fonction d'addition mpfl rencontre un problème de propagation correcte de la valeur de report, ce qui entraîne une somme incorrecte. Plus précisément, après l'ajout de deux valeurs de 32 bits, si le résultat dépasse la plage d'une seule valeur de 32 bits, le bit de retenue ne se propage pas correctement, ce qui entraîne une somme incorrecte.
Approche architecturale
Pour résoudre ce problème, il est avantageux d'envisager une architecture ALU (Arithmetic Logic Unit) similaire à celles utilisées dans les implémentations matérielles. En modélisant votre code après le fonctionnement d'une ALU, vous pouvez simplifier et améliorer la précision de vos calculs.
Correction du code
Le code suivant fournit une version révisée de votre fonction d'ajout qui résout le problème de propagation du report :
mpfl operator+(const mpfl &lhs, const mpfl &rhs) { unsigned long i; mpfl ret(0); mpfl trhs(rhs); ALU32 alu; for (i = lhs.nbytes; i >= 0; i--) { alu.adc(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); } } return ret; }
Clé Modifications
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!