Kombinierter Multiplizier-Divisions-Vorgang bei einer 64-Bit-Ganzzahl mit Vorzeichen ohne Überlauf

8

Ich muss berechnen

%Vor%

wo

%Vor%

Ich muss dies in reinem C / C ++ ohne Bibliotheken auf einem Mikrocontroller tun. Der Compiler unterstützt die Typen int64_t und uint64_t; wahrscheinlich keine Hardware-Implementierung für Multiplikation oder Division. Zur Zeit habe ich einen Workaround für den uint32_t-Faktor, aber ich brauche eine Lösung für Faktor 2 ^ 32.

    
p.g. 28.12.2015, 18:35
quelle

1 Antwort

1
  

OP: "Momentan habe ich eine Umgehung für den uint32_t-Faktor"

Die factor == 2^32 ist ein Eckfall und es ist alles, was hier zu lösen ist, da die "Workaround" von OP die Faktoren [0 ... 2^32-1] behandeln kann.

Wenn dividend ohne Überlauf verdoppelt werden kann, verwenden Sie einfach factor == 2^31 mit einer doppelten dividend .

Wenn die divisor gerade ist, verwenden Sie factor == 2^31 mit einer halbierten divisor . @Weather Vane

Sonst ist dividend groß. Erinnern Sie sich daran, dass der Quotient in [-2^31 ... 2^31-1] range liegt. Im Allgemeinen wird das Produkt der großen dividend und factor == 2^32 Dividende durch die divisor außerhalb des Bereichs int32_t liegen, so dass diese Kombinationen außerhalb des Bereichs keine Rolle spielen, da "Ergebnis: passt garantiert in int32_t ".

Die akzeptablen Randbedingungen treten mit einem Endquotienten nahe der Kante des Bereichs int32_t auf.

%Vor%

Nach dem Test ist dividend und divisor die einzige darstellbare Antwort in INT32_MIN .

Beispielcode:

%Vor%

Das ursprüngliche Problem besteht darin, diese Randbedingung zu erkennen und wie sie behandelt wird. Die workaround_for_the_uint32_t_factor() wurde möglicherweise noch nicht codiert, daher wurde sie nicht gepostet.

    
chux 28.12.2015 22:25
quelle