Hallo Michael,
ein Typecast wandelt normalerweise physisch nichts um. Er erklärt einen Speicher Inhalt zu einem anderen Typ!
Eine Werte Umwandlung kann nur durch FloatToFix64(Float) oder Fix64ToFloat(Fix64) erfolgen. Deshalb kann auch Fix64ToFloat(Fix64(iFloat)) nicht funktionieren!
btw.
Wenn Float und Fix64 gkeichzeitig importiert sind kann das hier nicht funktionieren: IntToStr(Trunc(-7.7)
Woher soll der Compiler wissen was -7.7 für ein Typ ist?? Float oder Fix64...
Das sollte tun und kostet kein Byte Code mehr: IntToStr(Trunc(Fix64(-7.7))
Gerade bei immidiate Konstanten kann der Compiler hier nicht immer wissen was Sache ist.
Da die Fix64-Float Funktionen in Pascal geschrieben sind, müssen diese auch in einer Unit untergebracht sein. Hier die zwei Sources:
Code
type
TFix64Overlay = record // this is handy for fast extraction of integer and fractional parts
fix : fix64;
x [@fix] : fix64;
i64[@fix] : int64;
w64[@fix] : word64;
i [@fix+4]: longint;
i32[@fix+4]: longint;
f [@fix] : longword;
f32[@fix] : longword;
b [@fix] : array[0..7] of byte;
w [@fix] : array[0..3] of word;
end;
function FloatToFix64(const a: float): fix64;
var
Tmp: TFix64Overlay;
begin
Tmp.i := Trunc(a);
if (a < 0) and (Frac(a) <> 0) then
Dec(Tmp.i);
endif;
Tmp.f := Trunc(Frac(a) * (float($FFFFFFFF) + 1));
return(Tmp.fix);
end;
function Fix64ToFloat(const a: fix64): float;
var
Tmp[@a]: TFix64Overlay;
begin
return(float(Tmp.i) + float(Tmp.f) / (float($FFFFFFFF) + float(1)));
end;
rolf