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. :)