Thema: Delphi Potenzreihen: Horner

Einzelnen Beitrag anzeigen

gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#8

Re: Potenzreihen: Horner

  Alt 29. Jun 2009, 08:38
Zitat von alzaimar:
Die Rangecheck-Problematik könnte man mit dem richtigen Datentyp implizit vermeiden: Kandidaten wären "Byte","Word" oder "Cardinal".
Genau! Bei der Gelegenheit kann man sich dann auch um zu großes n kümmern. Es gibt zwei Möglichkeiten: Entweder Rangecheck-Fehler oder Abschneiden. Hier mal ein Codeschnipsel, der hoffentlich alle bisherigen Argumente berücksichtigt.

Delphi-Quellcode:
{$define Horner_RTE}  {Fehler falls n>high(c), sonst wird n auf high(c) beschränkt}

{---------------------------------------------------------------------------}
function HornerFkt(n: cardinal; const c: array of extended; x: extended): extended;
  {-HornerFkt - Berechnet den Funktionswert eines Polynoms}
  { n: Grad des Polynoms                                  }
  { c: Koeffizienten des Polynoms (aufsteigend)           }
  { x: Argument                                           }
  { Result: Funktionswert an der Stelle x                 }
var
  i: cardinal;
begin
  if n>high(c) then begin
    {$ifdef Horner_RTE}
      RunError(201);
    {$else}
      n := high(c)
    {$endif}
  end;
  Result := 0.0;
  for i:= n downto 0 do Result:= Result*x + c[i];
end;

{---------------------------------------------------------------------------}
function HornerAbl(n: cardinal; const c: array of extended; x: extended): extended;
  {-HornerAbl - Berechnet die Ableitung eines Polynoms}
  { n: Grad des Polynoms                              }
  { c: Koeffizienten des Polynoms (aufsteigend)       }
  { x: Argument                                       }
  { Result: Ableitung an der Stelle x                 }
var
  i: cardinal;
begin
  if n>high(c) then begin
    {$ifdef Horner_RTE}
      RunError(201);
    {$else}
      n := high(c)
    {$endif}
  end;
  Result:= 0.0;
  for i:= n downto 1 do Result:= Result*x + i*c[i];
end;
Edit: Habe zu hause noch mal die for-Schleife in HornerAbl korrigiert. :)
  Mit Zitat antworten Zitat