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; }
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 :
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!