procedure TTaylor.PerformDif(const Instr : word);

var k, L : integer; s : extended;

begin with DifInstructions[Instr] do

š try

ššš case ty of

. . . . . . . . .

ššš cv : case op of {Operand1 is constant, Operand2 is variable}

šššššššš nop: AuxVars[i3,N] := AuxVars[i1,N]; {nop means assignment}

šššššššš '*': AuxVars[i3,N] := AuxVars[i1,0] * AuxVars[i2,N];

šššššššš '+': AuxVars[i3,N] := AuxVars[i2,N];

šššššššš '-': AuxVars[i3,N] := - AuxVars[i2,N];

šššššššš '/': begin s := 0.0;

ššššššššššššš for k := 0 to Pred(N) do s := s - AuxVars[i3,k]*AuxVars[i2, N-k];

ššššššššššššš AuxVars[i3,N] := s/AuxVars[i2,0]

ššššššššššššš end

šššššššš else raise Exception.CreateFmt(msg, [Instr, op])

šššššššš end;

ššš vc : case op of {Operand1 is variable, Operand2 is constant}

 

šššššššš #6 : begin s := 0.0; { exp : Operand2 ignored }

ššššššššššššš for k := 0 to Pred(N) do s := s + C1[N,k]*AuxVars[i3,k]*AuxVars[i1, N-k];

ššššššššššššš AuxVars[i3,N] := s

ššššššš ššššššend;

 

šššššššš #7 : begin s := AuxVars[i1,N]; { ln : Operand2 ignored }

ššššššššššššš for k := 1 to Pred(N) do s := s - C1[N,k]*AuxVars[i3, N-k]*AuxVars[i1,k];

ššššššššššššš AuxVars[i3,N] := s/AuxVars[i1,0]

ššššššššššššš end;

. . . . . . . .

 

šššššššš #9 : begin s := 0.0; { sqrt : Operand2 ignored }

ššššššššššššš for k := 0 to Pred(N) do s := s + C05[N,k]*AuxVars[i3,k]*AuxVars[i1, N-k];

ššššššššššššš AuxVars[i3,N] := s/AuxVars[i1,0]

ššššššššššššš end;

 

šššššššš nop: AuxVars[i3,N] := AuxVars[i1,N]; {nop means assignment}

šššššššš '*': AuxVars[i3,N] := AuxVars[i1,N] * AuxVars[i2,0];

šššššššš '+': AuxVars[i3,N] := AuxVars[i1,N];

šššššššš '-': AuxVars[i3,N] := AuxVars[i1,N];

šššššššš '/': AuxVars[i3,N] := AuxVars[i1,N] / AuxVars[i2,0];

 

šššššššš '^': begin s := 0.0;

ššššššššššššš for k := 0 to Pred(N) do

ššššššššššššššš s := s + (AuxVars[i2,0]*C1[N,k] - C[N,k])*AuxVars[i3,k]*AuxVars[i1, N-k];

ššššššššššššš AuxVars[i3,N] := s/AuxVars[i1,0]

ššššššššššššš end

š šššššššelse raise Exception.CreateFmt(msg, [Instr, op])

ššššššš šend;

ššš vv : case op of {both operands are variables}

šššššššš nop: AuxVars[i3,N] := AuxVars[i1,N]; {nop means assignment}

 

šššššššš '2': beginš s := 0.0; L := Pred(N) div 2; {Square is twice faster than *}

ššššššššššššš for k := 0 to L do s := s + AuxVars[i1,k]*AuxVars[i2, N-k];

ššššššššššššš if N mod 2 = 0 then AuxVars[i3,N] := 2.0*s + sqr(AuxVars[i1,Succ(L)])

ššššššššššššš else AuxVars[i3,N] := 2.0*s

ššššššššššššš end;

 

šššššššš '*': begin s := 0.0;

ššššššššššššš for k := 0 to N do s := s + AuxVars[i1,k]*AuxVars[i2, N-k];

ššššššššššššš AuxVars[i3,N] := s

ššššššššššššš end;

 

šššššššš '+': AuxVars[i3,N] := AuxVars[i1,N] + AuxVars[i2,N];

šššššššš '-': AuxVars[i3,N] := AuxVars[i1,N] - AuxVars[i2,N];

 

šššššššš '/': begin s := AuxVars[i1,N];

ššššššššššššš for k := 0 to Pred(N) do s := s - AuxVars[i3,k]*AuxVars[i2, N-k];

ššššššššššššš AuxVars[i3,N] := s/AuxVars[i2,0]

šššššššš šššššend;

šššššššš else raise Exception.CreateFmt(msg, [Instr, op])

ššššššš šend

ššš end

š except

š raise Exception.CreateFmt(msg, [Instr, op])

š end

end;

 

Code Sample 1.

 

 

 

 

 

 

procedure TGraphForm.FillResultArrayOneStep(const cur : integer);

var k, i : integer; x1, y1, t, dt, dtMin, step : extended; q1, q2, tQuant : Int64;

begin t := 0.0;

with CurveSet, MyTaylor do

š begin step := Results[Succ(cur), tInd, 0] - Results[cur, tInd, 0];

š for i := 0 to PxLimitPerStep do

ššš begin dtMin := step; QueryPerformanceCounter(q1);

ššš for k := 1 to Count do with Curve[k] do

ššššš begin

ššššš x1 := Poly1(t, Results[cur, xInd-MainStart]);

ššššš y1 := Poly1(t, Results[cur, yInd-MainStart]);

ššššš if Abs(x1) > Abs(y1) then dt := ds/Abs(x1)

š ššššelse if Abs(y1) > 0 then dt := ds/Abs(y1)

šššššššššš else dt := step; {here dt actually must be infinitely big}

ššššš if dt > 0.0 then dtMin := Min(dtMin, dt);

ššššš CnvSetPixels(Poly(t, Results[cur, xInd-MainStart]),

ššššš Poly(t, Results[cur, yInd-MainStart]), Clr);

ššššš end;

ššš t := t + dtMin;

ššš if t > step then Exit; {normally it exits here!}

ššš tQuant := Round(dtMin/tSpan*nSec*HardwereFr);

ššš if QueryPerformanceCounter(q2) then

ššššš while q2 - q1 < tQuant do QueryPerformanceCounter(q2)

ššš else Sleep(Round(dtMin/tSpan*nSec*1000))

ššš end

š end

end;

 

Code Sample 2.