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.

InformationsquelleAutor Kei Nivky | 2011-12-14
Schreibe einen Kommentar