Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi 32bit FixedPoint Math und multiplikation mit Kehrwert (https://www.delphipraxis.net/168490-32bit-fixedpoint-math-und-multiplikation-mit-kehrwert.html)

Memnarch 24. Mai 2012 11:32


32bit FixedPoint Math und multiplikation mit Kehrwert
 
Hallo
Wenn man bei einer berechnung mehrere Werte durch die Selbe Zahl teilen muss

Code:
A/U
B/U
C/U
Lässt sich das ganze ja durch multiplizieren mit dem Kehrwert beschleunigen

Code:
U = 1/U
A*U
B*U
C*U
Ok, bei Floatingpoint berechnungen kein Thema. Aber kann man soetwas auch bei FixedPointMath anwenden?

Wenn ich z.B eh nur im bereich +/- 30000 bin, kann ich die unteren 2 bytes für die "nachkomma" stellen nutzen.

Ja ich weiß, dass sich heutzutage zwischen Fixed und Floatingpoint Math keine so große Lücke mehr auftut wie früher. Aber etwas das noch immer stresst ist Float->Int.

Werde auch mal bei SSE gucken, da gibts ne möglichkeit mehrere werte aufeinmal zu Truncated/Rounden

Trotzdem interressiert mich erstmal obige Fragestellung.


MFG
Memnarch

gammatester 24. Mai 2012 11:57

AW: 32bit FixedPoint Math und multiplikation mit Kehrwert
 
Siehe zB http://www.hackersdelight.org/ und das separate http://www.hackersdelight.org/divcMore.pdf.

jfheins 24. Mai 2012 11:59

AW: 32bit FixedPoint Math und multiplikation mit Kehrwert
 
Ähhmm ... ich verstehe grad nicht wo genau dein Problem ist.
Wenn du in einem 32bit integer eigentlich eine 16/16 bit Festkommazahl gespeichert hast und dann dividierst oder multipliziert, dann bekommst du doch das korrekte Ergebnis !?

shmia 24. Mai 2012 12:12

AW: 32bit FixedPoint Math und multiplikation mit Kehrwert
 
Wenn du zwei 32-bit Zahlen multiplizierst dann erhältst du ein 64-Bit Ergebnis.

Der gedachte Dezimalpunkt befindet sich genau in der Mitte;
also muss man die oberen und unteren 16-Bit wegwerfen um dann wieder einen 32-Bit Festkommawert zu erhalten.

Ich würde die Multiplikation mit nur positiven Zahlen durchführen
und dann nachträglich das Vorzeichen korrigieren (Falls die Vorzeichen der Faktoren unterschiedlich war).

Memnarch 24. Mai 2012 12:18

AW: 32bit FixedPoint Math und multiplikation mit Kehrwert
 
@jfheins: ja für multiplikationen > 0.

aber mach mal

FixedPointU = (1 shl 16) div FixpointU

FixedPointA * FixedPointU

das wird nicht funktionieren. Die zahl wird größer, nie kleiner.

@shmia wie? einfach die mittigen 32bit rausschnibbeln und als ergebnis nutzen?

gammatester 24. Mai 2012 12:29

AW: 32bit FixedPoint Math und multiplikation mit Kehrwert
 
Für 32-Bit-Arithmetik mit Maximalwerten <= 30000 wird
Delphi-Quellcode:
x div u
wird ersetzt durch
Delphi-Quellcode:
x * invu shr 16
mit
Delphi-Quellcode:
invu := $10000 div u
.

jfheins 24. Mai 2012 12:41

AW: 32bit FixedPoint Math und multiplikation mit Kehrwert
 
Zitat:

Zitat von Memnarch (Beitrag 1167909)
@jfheins: ja für multiplikationen > 0.
das wird nicht funktionieren. Die zahl wird größer, nie kleiner.

Ach so, ja wenn beide Operanden Fixkommazahlen sind klappt das natürlich nicht so einfach... mein Fehler :angel2:

In dem Fall brauchst du ein 64bit Zwischenergebnis, aber dann klappt das auch ohne Probleme.

Memnarch 24. Mai 2012 13:58

AW: 32bit FixedPoint Math und multiplikation mit Kehrwert
 
@gammatester: ah danke, klappt :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz