Wertübertragung durch Carry nicht möglich
Bei einem kürzlichen Versuch, eine MPFL-Klasse mit großer Präzision in C zu erstellen, stieß der Entwickler auf ein Problem, bei dem das Hinzufügen von 0xffffffff und 0x04 zu 0xffff0003 statt dem erwarteten Ergebnis führte 0x0100000003. Die für den Vorgang verantwortliche Additionsfunktion ist unten beschrieben:
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; }
Obwohl das Ziel dieser Funktion darin besteht, zwei große Präzisionswerte zu addieren, kann sie die Übertragsausbreitung nicht korrekt verarbeiten, was zu ungenauen Ergebnissen führt. Um dieses Problem zu beheben, ziehen Sie die folgenden Vorschläge in Betracht:
Zusätzlich finden Sie für Multiplikations- und Divisionsoperationen mit hoher Präzision ohne Assembler den folgenden Link für eine reine C/C-Implementierung :
[Erstellen einer Logarithmusfunktion in C ohne Verwendung von Float Typ](https://stackoverflow.com/questions/11762232/building-a-logarithm-function-in-c-without-using-float-type)
Das obige ist der detaillierte Inhalt vonWarum kann diese C-Additionsfunktion mit großer Präzision den Übertrag nicht korrekt weitergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!