Fixed-point-unsigned-division C
Brauche ich einen Algorithmus, um zu tun, unsigned fixed point division in C kann ich verwenden bei den meisten 32-bit-Worten.
Möchte ich minimieren die Anzahl der bits, die benötigt werden, um stellen den ganzzahligen Teil, während in der Lage, verwenden zahlen im Bereich [0..15]. Also anscheinend ist die minimale Anzahl von bits ist 4. Problem ist der Algorithmus, der mir kam, funktioniert nur mit 5 bits. Da vergleicht er den Rest durch den divisor und verschiebt sich dann der Rest, bis es größer als der divisor, wenn der divisor hat das höchstwertige bit 1 ist, dann wird der Algorithmus nichts zu tun, sondern verlagern den Rest (es wird nie größer sein). Hier ist der code:
int divu(int a, int b){
int pt_int, r, pt_frac=0;
int i;
pt_int = ((unsigned) a/b) << BITS_FRAC;
r = (unsigned) a%b;
for (i=BITS_FRAC; i>=0; i--){
if ((unsigned) r < b)
r <<= 1;
else{
r -= b;
pt_frac += 01 << i;
r <<= 1;
}
}
return pt_int + pt_frac;
}
Wenn Sie eine Lösung haben, aber nicht wollen, um den code zu verstehen, bitte einfach posten. 🙂
Beispiel:
Wollen wir teilen 1,5-2, die Ergebnisse von 0,75. Nehmen wir an, wir sind mit 4 bits für den ganzzahligen Teil und 28 bits für die Fraktion. Also unsere zahlen im hex sind:
1.5: 0x18000000
2: 0x20000000
result: 0x0c000000
- Das riecht nach Hausaufgaben
- Ich verstehe nicht die Frage. Können Sie ein Beispiel geben, Eingang, zusammen mit dem erwarteten und dem tatsächlichen Ergebnis.
- Wenn Sie versuchen, sich zu teilen vorzeichenlose Werte, die am wenigsten Sie tun können, ist so zu sagen in Ihrer Funktion Erklärung.
- Es sieht nicht wie dein code verarbeitet entweder Division durch null oder überlauf. Wenn Sie zum Beispiel divide 4 0,25, haben Sie ein problem.
- Hefferman Ja. Es ist Hausaufgaben zu machen. Aber zumindest bin ich versucht, es zu tun.
- Tut mir Leid, dass. In der Anwendung werde ich diese zu verwenden, muss es so sein, habe ich nur eingefügt, der code, den ich schrieb. Ich werde es Bearbeiten.
- Leffler In der Tat, es gibt mehrere Probleme mit dem code, aber Sie nicht brauchen Behandlung. Sie einfach nicht passieren in der Anwendung.
- Wenn dein compiler nicht warnt, vom impliziten Typ-Umwandlungen von float zu int, Division durch null ist die am wenigsten Ihrer Probleme...
- Keine Kritik. Ich wollte nur wissen, so dass wir tag und der Frage entsprechend. Nun wir nun, wie Sie helfen können.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als darauf hingewiesen, hier (Beispiel: Multiplikation eine ganze Zahl, indem der Kehrwert der Konstanten), Sie konnte re-implementieren Sie Ihre division durch Multiplikation mit dem Kehrwert. Danach sollten Sie in der Lage sein zu vertreten, der ganzzahlige Teil mit 4 Bit.
Haben Sie einen 4.28 Feste Nummer, und die Sie teilen möchten, von einem 4.28 Anzahl. Finden Sie die Präzision nach division durch Subtraktion der Präzision, mit der der Zähler vom Nenner, so eine gerade Spaltung geben würde, 4.28 - 4.28 = 0 -- keine signifikanten bits. Offensichtlich ist dies nicht funktioniert.
Der ideale Weg, es zu tun wäre, um die Förderung der Zähler um 8.56 (durch Multiplikation mit 2^28), und dann tut ein 64-bit-teilen:
Wenn Sie können nicht wirklich mit 64 bit-zahlen dann nur die option zum reduzieren der Nenner.
Zum Beispiel können Sie die Hälfte die Genauigkeit, mit der Division durch 2^14
Können Sie dann multiplizieren Sie das Ergebnis mit dem gleichen Faktor, um wieder zu einem 4.28 Nummer:
0x3000 *(1<<14) = 0x0c000000
Verzichten Sie auf einige Genauigkeit auf diese Weise, aber es ist unvermeidlich, ohne größere Zähler. Zum Beispiel
5.0/3.0 = 1.66667 = 0x1AAAAAA [4.28]
, aber((5.0<<28)/(3<<14))<<14 = 0x1AAA8000 [4.28] = 1.66662