W podanum w pierwszym poscie przypadku nie bardzo widze możliwość, żeby pojawiły się wartości tak daleko po przecinku. Stawiam, że to jest kwestia kolejnosci przetwarzania warunków - przy tak ustawionych nawiasach nie wiadomo gdzie jest lewa, a gdzie prawa strona porownania - to znaczy czy lewa jest to co jest przed znakiem wiekszy-mniejszy czy przed znakiem rownosci.
Poza tym - nie wiem po jaką cholerę używać instrukcji continue, zamiast dla swojej wygody i czytelności użyć ludzkiej instrukcji "else".
Wykonajcie poniższy kod:
var
a, b, d, e : real;
c : integer;
pierwszy,drugi : Real;
begin
a := 0.3; //Pierwszy
b := 0.5; //Drugi
d := 0;
e := 0;
for c := 1 to 10 do begin
pierwszy:=a+d*a;
drugi:=b+e*b;
if pierwszy=drugi then begin
Memo1.Lines.add('atakuja oboje');
d := d + 1;
end else
if pierwszy > drugi then begin
Memo1.Lines.add('atakuje Drugi');
e := e + 1;
end else
if pierwszy < drugi then begin
Memo1.Lines.add('atakuje Pierwszy');
d := d + 1;
end;
Memo1.Lines.Add('pierwszy: '+FloatToStr(pierwszy)+', drugi: '+FloatToStr(drugi)+', c: '+IntToStr(c));
end;
end;
Okazuje się, że wartości jakie się pojawiają mają dokładność rzędu jednego miejsca po przecinku.
Generalnie jeżeli mogę coś zasugerować, to zanim zaczniesz cokolwiek pisać - rozrysuj to sobie na kartce i postaraj sie nie robić bałaganu we własnym kodzie. Za czasów studiów tłukli nam do głowy technikę SWYM: Say What You Mean - czyli pisz dokładnie to, co chcesz, żeby komputer zrobił i nie pozostawiaj miejsca na domysły. Kompilator nie zawsze interpretuje kod w taki sposób jak Ty go widzisz (nie mówiąc już o tym, że kompilator technicznie widzi kod zupełnie inaczej niż edytor - niektórzy pamiętają mój przypadek z błedną interpretacją kodu końca linii - edytor widzi 0D jak 0D0A, a kompilator tak jak jest na prawde = 0D)