Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

Re: Exponent aus Extended extrahieren?

  Alt 2. Mai 2009, 18:36
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
$2B or not $2B
  Mit Zitat antworten Zitat