
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!
Was ist eine ESD-Datei?
Was wird mit dem Artikel-Tag definiert?
So beheben Sie den Parsererror-Fehler
So lösen Sie das Problem, wenn der Computer eingeschaltet wird, der Bildschirm schwarz wird und der Desktop nicht aufgerufen werden kann
So konfigurieren Sie den virtuellen JSP-Speicherplatz
Vollständige Sammlung von SQL-Abfrageanweisungen
Was ist CSS?
Was ist Adobe Flash Player?