ich glaub ich hab erstmal 'ne Lösung für den Bereich von etwas -96038,388 bis 96038,388 reicht aber aus, da die Multiplication bei rund 9223372036 = 96038*96038 eh einen Überlauf bringt.
(also 'ne Zahl kann natürlich auch größer als 96038,388 sein, wenn der andere Operand entsprechend kleiner ist)
Code:
Result := (left * right) div 1000000000;
***überlauf***
Result := left * (right div 1000000000)
+ (left * (right mod 1000000000)) div 1000000000
***********überlauf************
Result := left.FBCD9 * (right div 1000000000)
+ ((left mod 1000000000) * (right mod 1000000000)) div 1000000000
+ (left div 1000000000) * (right mod 1000000000);
[s]und mit Runden der 9. Kommastelle (glaub ich)
Result := left.FBCD9 * (right div 1000000000)
+ ((left mod 1000000000) * (right mod 1000000000)) div 1000000000
+ ((left + 500000000) div 1000000000) * (right mod 1000000000);[/s]
[edit] blödsinn
Delphi-Quellcode:
class operator FIXCOMMA64.Multiply(const Left, Right: FIXCOMMA64): FIXCOMMA64;
begin
Result.FBCD9 := left.FBCD9 * (right.FBCD9 div 1000000000)
+ ((left.FBCD9 mod 1000000000) * (right.FBCD9 mod 1000000000)) div 1000000000
+ (left.FBCD9 div 1000000000) * (right.FBCD9 mod 1000000000);
end;
und das Andere
Delphi-Quellcode:
class operator FIXCOMMA64.Multiply(
const Left, Right: FIXCOMMA64): FIXCOMMA64;
const idiv: LongInt = 1000000000;
asm
fild qword ptr [&left.FBCD9]
fild qword ptr [&right.FBCD9]
fmulp st(1), st(0)
fidiv dword ptr [&idiv]
fistp qword ptr [&result.FBCD9]
wait
end;
[edit] das mit dem Runden wahr wohl blödsinn ... kommt davon, wenn man das Rechenergebnis mit einem Ergebnis via Floattypen vergleicht und denkt die eigene Rechnung stimme nicht ganz