Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#18

Re: wirklich große Zahlen unter Delphi

  Alt 15. Aug 2006, 20:52
Zitat:
Gibt es irgendwo eine Dokumentation für alle Funktionen der Unit NInts? Das fände ich ziemlich hilfreich, denn ohne weiss ich noch nichtmal wie ich überhaupt eine Variable des typs IInteger erzeuge...

Nach dem Entpacken hast du 2 Möglichkeiten:

1.) im Ordner \LibIntf\ sind alle PASCAL Header der Units enthalten. Da kannst du nachschlagen.
2.) im Ordner \Part_II\Demo\ findest du ein DEMO Projekt. In diesem wird die Benutzung der IInteger demonstriert

Ein IInteger ist wie ein normaler Integer anzusehen nur mit dem Unterschied
a.) das er so groß wir der gesamte Speicher sein könnte (als Zahl wohl gemerkt)
b.) er mit eigenen Funktionen rechnen muß (in Unit NInts)

ansonsten gibts fast keine Unterschiede, besonders nicht bei Zuweisungen, Allokation und Freigeben. Darum musst du dsich nicht kümmern und DECMath macht das alles automatisch für dich.

Beispiel

Delphi-Quellcode:
procedure DEMO;
var
  Sum: IInteger;

  function DoTest(const N: IInteger): Boolean; register;
  begin
    NAdd(Sum, N);
    Result := False;
  end;

var
  A,B,C: IInteger;
  X: IIntegerArray;
begin
  // A,B,C sind hier schon auf NIL initialisiert. NIL ist per Definition im DECMath identisch zum Zahlenwert 0 !!

  NSet(A, 12); // A := 12;
  NSet(B, A); // B := A; // @B == @A, B und A sind gleiches Speicherobjekt
  C := B; // C := B := A;

  NAdd(B, C); // B := B + C;
  
  SetLength(X, 3);
  X[0] := A;
  X[1] := B;
  X[2] := C;
  
  NForEach(X, @DoTest); // für jedes Element eine Callback -> DoTest aufrufen.
                        // Diese Callback kann auf unsere Variablen im Stack zugreifen, hier Sum !!
     

  WriteLn( NStr(Sum) ); // ergibt Sum := A + B + C;
end;
Wie du siehst, nichts freigeben, nichts allozieren, alles wird autom. gemacht.

Zitat:
if i < round(sqrt(zahl)) then
Delphi-Quellcode:
var
  T: IInteger;
begin
  NSqrt(T, Zahl); // T := Zahl^0.5
  if NCmp(NInt(I), T) < 0 then ;
end;
1.) NSqrt(T, Zahl), berechne Quadratwurzel der Zahl und speichert das Resultat in T
2.) NInt(I), wandelt I in einen IInteger um
3.) NCmp(NInt(I), T) vergleich I mit T und gibt < 0 zurück wenn I < T, = 0 wenn I == T und > 0 wenn I > T.

Also nur 1 Variable und 1 Zeile Source mehr

Gruß Hagen
  Mit Zitat antworten Zitat