![]() |
Re: Spezielle Festkommazahl?
Hallo Khabarakh,
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Wo ist der Überlauf?
int1 := 8;
int2 := 8; Shift := 0; erg := int1 * int2; // am Shift-Faktor ändert sich nix, da 0+0=0 ist... Zitat:
Zitat:
Zum Verwendungszweck: - Float: Immer, wenns geht - Festkomma ohne variablen Shift-Faktor: Mir fällt kein sinnvolles Einsatzgebiet ein - Festkomma mit variablem Schiebefaktor: wenn keine FPU da is Letzterer Punkt impliziert zwar schon, dass es unter Delphi, was ja nur unter Win läuft und Win nur mit FPU funktioniert, wenig Sinn macht auf Floats zu verzichten, aber das war ja auch schon gesagt... mfg Christian |
Re: Spezielle Festkommazahl?
Zitat:
Zitat:
Zitat:
Ganz egal, welchen Shiftfaktor ich wähle, spätestens nach achtfacher Multiplikation mit 1 (!) ist bei 8-Bit Schicht im Schacht. Zitat:
Es gibt sicher ein paar Anwendungsgebiete für "Shifted Fixed Points", aber da dabei wohl zu jeder Zeit die Anzahl der Operationen, die Wertebereiche aller Argumente bekannt sein müssen, sind die Gebiete imho schon ziemlich eingeschränkt. Warum sonst sollte ein dem Dreidimensionalem durchaus mächtiger Handheld wie z.B. der Nintendo DS ausschließlich Fixed Point benutzen, wenn sich Grafikprogrammierer am PC eine Welt ohne Floatpoint gar nicht mehr vorstellen können (und ja, die Theorie der Fließkommazahlen steckt tief im Design heutiger PC-Engines)? |
Re: Spezielle Festkommazahl?
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Hier nochmal n Beispiel, warum es sinnvoll ist den Shilftfaktor zu benutzen:
Delphi-Quellcode:
Wir können also damit rechnen. Hätten wir die - impliziten - Shiftfaktoren nicht, gäb es keine Möglichkeit damit zu rechnen, da entweder der große ider der Kleine Wert nicht in die 16Bit passt...
// Voraussetzungen:
// - keine FPU da // - es ist genau bekannt in welchen Wertebereichen die gemessenen Größen sich befinden // - es stehen nur 16-Bit-Datentypen zur Verfügung var // zur Verdeutlichung SmallInt; man kann also mit 16 Bit rechnen: Wert1: SmallInt; // sehr große Zahl; 2^10 bis 2^14; Wert2: SmallInt; // sehr kleine Zahl; 2^-9 bis 2^-6 Erg: SmallInt; Shift: SmallInt; begin // Wir wollen beide Werte multiplizieren; Mit Float kein Problem, aber das steht nicht zur Verfügung... Wert1 := GetWert1(Sonstwoher); // Wertebereich bekannt. Impliziter Shiftfaktor -10; unser Beispielwert sei 128 * 2^12 = 512 * 2^10(das 10^10 wird implizit gespeichert durch den impliziten Shiftfaktor) Wert2 := GetWert2(Sonstwoher); // Wertebereich bekannt. Impliziter Shiftfaktor +10; unser Beispielwert sei 4 * 2^-7 = 8 * 2^-6 Erg := Wert1 * Wert2; // 128 * 4 = 512 Shiftfaktor := 4; // 10 - 6 // muss nicht extra gespeichert werden, da er implizit bekannt ist. Wichtig is aber ne gute Dokumentierung end; Ich weiß, das is alles ganz anders, als unter Delphi. Und das is nur ein Beispiel. Bei der programmierung für n 16-Bit-DSP gilt nämlich u.a.: - es gibt nur 16 Bit. fertig - jede Mikrosekunde zählt - Division is verboten - Wer durch Konstanten teilt, wird geteert und gefedert - Wer durch 2er-Potenzen teilt, wird gevierteilt - Die bedingten Sprünge(u.a. die berühmt-berüchtigten ifs) werden in den Tartaros verbannt, wo sie tagein tagaus versuchen einen Stein auf einen Hügel... ähm... ne das macht schon Sisyphos... müssen uns also noch ne geeignete Strafe einfallen lassen :gruebel: So isses also auf m DSP zumindest so ungefär. Die Strafen könnten auch noch härter sein. Bin mir da nicht sicher... Zitat:
Zitat:
mfg Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz