Zitat von
SnuffMaster23:
@r2c2: Der Schiebefaktor wäre ja immer gleich also kann ich den hardcoden.
Nur wenn ich das hin und her-shifte, was passiert dann mit dem Nachkommateil? Der is dann weg wenn ich nicht drauf aufpasse^^.
Und wie muss ich dann mit dem rechnen, ich kann mir das nicht so ganz vorstellen.
Mal gucken ob ich das noch zusammenkrieg... Hab in den Sommerferien n Ferienjob gehabt und da haben die fast außschließlich mit Festkomma gerechnet(DSP). Hab das aber noch nie gamacht. Nur mal gesehen. Also alle Angaben ohne Pistole...äh... Gewähr...
Delphi-Quellcode:
var
int1: Integer; // 32 Bit; passt genau in ein Register
int2: Integer;
erg: Integer;
erg_float: Double;
shift: Integer;
begin
// ich definier jetzt einfach mal: positiver Schiebefaktor: shr; negativer: shl
shift := 0; // ganze Zahl
int1 := 1024;
int2 := 512;
erg := int1 + int2; // ändert nix am Schiebefaktor
erg := int1 - int2; // ändert nix
erg := int1 * int2; // 32 Bit * 32 Bit = 64 Bit; hier müsste ggf. geschoben werden um die 64 Bit in die 32 zu kriegen. Sollte aber bei "normalen" Zahlenbereichen überflüssig sein. Delphi meckert schon bei nem Overflow... ;-)
erg := int2 div int1; // erg is eigentlich 0,5. Passt aber nicht in den Integer rein. Also schieben:
int2 := int2 shl 1; // int2 anpassem
shift := +1; // Shiftfaktor speichern; +1, da nach rechts geschoben werden muss um das eigentliche Ergebnis zu erhalten
erg := int2 div int1; // rechnen; 1024 / 1024 = 1
// nur zur Verdeutlichung, dass auch das drin is, was soll:
// in Float umwandeln = zurückschieben:
if shift > 0 then
erg_float := erg / Power(2, shift) // "shr für Float"
else
erg_float := erg * Power(2, shift); // "shl für Float"
ShowMessage(FloatToStr(erg_float)); // 0,5
end;
Ich hoff ich habs noch richtig behalten aber so scheints zu stimmen.
Das is
IMHO richtiges Festkomma rechen. So wirds gemacht, wenn man keine FPU hat.
Das hat aber, wie du siehst natürlich mehrere Nachteile:
- ewig langwierige Rechnerei
- blöd, wenn man mehr als 32 Bit shiften muss...
- man muss immer wissen, in welchen Größenordnungen sich die Zahlen befinden uind demnach schieben, sonst gibts Ungenauigkeiten(Hätt ich oben nicht geschoben, wär das Ergebnis 0;
- wichtig is, dass alle Zahlen die selben Schiebefaktoren haben. Wenn nicht, darfst du das auch noch berücksichtigen...
Ob das das ist, was du willst, weiß ich nicht. Das Ganze nur in Festkomma zu speichern und mit Gleitkomma zu rechnen macht aber
IMHO keinen Sinn, da sich dadurch nicht die Vor- sondern nur die Nachteile addieren: hoher Aufwand(Festkomma) und langsam, ungenau(Gleitkomma).
Generell fragt sich, ob es Sinn macht auf Float zu verzichten. Wenn man nicht dazu gezwungen ist(keine FPU), sollte man
IMHO auch die Floats nutzen...
Wenn es wirklich auf die Geschwindigkeit ankommt, gibts bestimmt noch andere einfacherere Optimierungsmöglichkeiten...
Zitat:
Ich dachte halt Festkomma weils schneller zu behandeln ist (Integer) und es keinen 2-Byte-Gleitkommatyp gibt (Speicherbedarf).
Aber ich hab grad festgestellt dass sich selbst mit Single (4 Byte) der Speicherbedarf eigentlich in Grenzen hält.
Was hast du denn zu proggen, dass es dermaßen auf den Speicherplatz ankommt? In Zeiten von mehreren hundert MB
RAM noch auf 1,2 Bytes mehr oder weniger gucken?
mfg
Christian