Gibt es einen besseren Weg zu berechnen (n * 8 + 3) / 5?

8

Ich muss ein size_t volume nehmen und dieses Ergebnis in size_t :

berechnen %Vor%

Wenn dieses Ergebnis überläuft, sollte size_t und next gleich null sein. Das Problem ist natürlich, dass volume * 8 + 3 überlaufen kann, während das gesamte Ergebnis in ein size_t passt.

Im Moment spalte ich die letzten 4 Bits von volume und führe die Multiplikation, Addition und Division getrennt durch. Meine Frage ist: Kann ich besser als das, was ich bisher gemacht habe, wenn es keinen Typ gibt, der größer ist als size_t ?

%Vor%

Es könnte einige Fehler in diesem Code geben. Ich habe es noch nicht umfassend getestet, aber ich glaube, dass alle wichtigen Ideen da sind.

    
Kaiting Chen 26.06.2015, 15:52
quelle

1 Antwort

6

Lassen Sie vol1 = volume % 5 , vol2 = volume - vol1 . vol2 ist durch 5 teilbar, also mathematisch (vol2 * 8) / 5 = (vol2 / 5) * 8, so erhalten Sie das korrekte Ergebnis als

%Vor%

Offensichtlich erhalten Sie einen Überlauf, wenn das Ergebnis nicht in size_t passt, aber nicht, wenn irgendwo in der Berechnung ein Überlauf auftritt. Da Sie mit 8/5 multiplizieren, wird das Ergebnis im Falle eines Überlaufs etwa 0,6 * Volumen & lt; Volumen, so können Sie

zurückgeben %Vor%

was sicherlich besser ist als 0 zurück zu geben.

    
gnasher729 26.06.2015, 16:01
quelle

Tags und Links