www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Division durch 100


Autor: Pat Rik (patrik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich muss einen Prozentwert einer etwas grösseren Zahl(19Bit) berechnen.
Wenn ich versuchen meineZahl*Prozentsatz/100 zu berechnen, dann habe ich 
eine Division durch 100. Division ist (fast) immer übel, aber gibt es 
vielleicht ein schnelle/einfache Division durch 10 oder 100?
Oder hat jemand ne ander Idee?
danke
patrik

Autor: SeriousSam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für ein Zahlenformat benutzt du denn? Wäre eventuell ein Q-Format 
http://en.wikipedia.org/wiki/Q_(number_format) denkbar? Dann könntest du 
mit 0.01 multiplizieren. Ansonsten könntest du vielleicht eine 
Binär-Dezimal-Umwandlung mit Schieberegistern umfunktionieren. Wie 
schnell muss es denn sein? Durchsatz? Latenz?

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schnell: multiplizier die Zahl mit dem Kehrwert (vorher entsprechend 
viele Nachkomma-Bits dranhängen).
Einfach: zähle wie oft du 100 abziehen kannst bevor das Vorzeichen 
wechselt.

Dazwischen gibt es natürlich noch diverse Mittelwege.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>meineZahl*Prozentsatz/100
Angenommen, "meineZahl" ist variabel, aber Prozentsatz ist konstant.
Dann ist das ist eine Multiplikation, denn wenn Prozentsatz konstant 
ist, dann ist "Prozentsatz/100" auch konstant.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfach die Zahl mit 2^16/100=655 multiplizieren und die unteren 16 Bit 
wegwerfen. Fertig ist die Division durch Hundert.

Siehe Festkommaarithmetuk

Autor: Ekschperde (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guggst Du bei TI nach:
SLAA329

Autor: HildeK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:
>Siehe Festkommaarithmetuk

Da ist aber nicht wirklich viel vorhanden ...

Nimm lieber Festkommaarithmetik

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>SLAA329
Das in der Appnote ist ja nun auch wieder
Festpunkt(oder -komma)arithmetik:
M = 1/41.8375 = 0.0239020018 = 0.0000011000011110b
Nur steht das nicht so ausdrücklich da.

Autor: Ekschperde (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> >>SLAA329
> Das in der Appnote ist ja nun auch wieder
> Festpunkt(oder -komma)arithmetik:
>
> M = 1/41.8375 = 0.0239020018 = 0.0000011000011110b
>
> Nur steht das nicht so ausdrücklich da.

Das ternäre Hornerschema ist natürlich Festkommaarithmetik.
Hast Du Wunder erwartet?

Die Anzahl der benötigten Operationen ist allerdings recht gut.

Der OP hat es ja mal wieder unterlassen, einen Hinweis auf die
Zielarchitektur herauszurücken.

> Prozentwert einer etwas grösseren Zahl(19Bit)
Da wird ja wohl keiner extra deswegem die Float-Library dazulinken
wollen :-)

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Einfach die Zahl mit 2^16/100=655 multiplizieren und die unteren 16 Bit
> wegwerfen. Fertig ist die Division durch Hundert.

Naja, zumindest wenn es nicht so ganz genau sein soll (z.B. wird es für 
einen Progress-Bar locker reichen).

Beispiel:
x = 100
x / 100 = 1
(x * 655) >> 16 = 65500 >> 16 = (int)0.99945068359 = 0

Autor: Gastinformatiker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Naja, zumindest wenn es nicht so ganz genau sein soll (z.B. wird es für
>einen Progress-Bar locker reichen).

Den macht man aber in Integerarithmetik mit X * 1,28 / 128 !

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.. dann bekommt man ein neues Problem: Multiplikation mit 1.28, also
dann doch lieber mit 655 multiplizieren ..

Autor: Gastinformatiker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso ? Multiplikation mit 1,28 ist genau, 655 nicht.

Autor: Da Micha (damicha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gastinformatiker wrote:
> Wieso ? Multiplikation mit 1,28 ist genau, 655 nicht.

Wieso? 1.28 ist genauso ungenau wie das Benutzen von 655, wenn man bei 
1.28 (=1.0100011110101110000101000111101b) auch nur 10 bit Genauigkeit 
benutzt.

Autor: Joko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Allerseits,

Um auf Falk's ursprünglichen Vorschlag zurückzukommen - der ist nämlich 
m.E. nach bisher der beste Vorschlag - aber ich würd' mehr Bits 
spendieren:
mit einem 18-Bit Multiplizier (17 Bit unsigned !) - die in den 'modernen 
devices vorhanden sind - ergibt sich mit SEHR hoher Genauigkeit:

1/100 ~ 41943/2^22 = 0.00999999

41943 = 0xA3D7 (16 Bit)

Also: mit 41943 multiplizieren und die unteren 22 Bits wegschmeißen

Gruß
Jochen

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Prozentwert einer etwas grösseren Zahl(19Bit)
passt nicht in einen
>18-Bit Multiplizier (17 Bit unsigned !)

Wieso brauche ich für einen Prozentwert eigentlich 17 oder 18 Bit?
Na gut, der Funktionsblock ist eben so groß...

>die unteren 22 Bits wegschmeißen...
Wir leben in einer Wegwerfgesellschaft.
Für 100% reichen aber doch 7 Bits, da könnte ich noch viel genauer 
rechnen und wesentlich mehr wegschmeissen
(34 Bits - 7 Bits = 27 Bits  ;-)

Finde ich übrigens interessant,
dass Patrick (OP) sich gar nicht mehr meldet  :(

Autor: bayerischer Ingenieur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
8 Bits sollten es schon sein, da die Genauigkeit vor der Rundung eine 
Dezimalstelle besser sein muss (im Binärsystem Faktor 2).

100% erfordern 0,5% -> Auflösung = 200! -> 8 Bit.

Man kann es aber bedenkenlos größer formulieren - die Synthese wirft das 
unbenutzte weg.

Wenn aber die 100% auf 0,1 angegeben werden müssen, braucht s 
logischerweise 3 Bit mehr.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wär's, wenn die gesamte Rechnung mit unpacked BCDs gemacht wird?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.