Błąd przy dodawaniu :) (typy double)

0
procedure TForm1.Button1Click(Sender: TObject);
var
  a,b,c : double;
begin
  a := 54.12;
  b := 10.12;
  c := 44;
  if (a<>(b+c))     then ShowMessage('Dziwne');       // <- wchodzi
  if not (a=(b+c))  then ShowMessage('Bardzo dziwne');// <- wchodzi

  a := b+c;

  if (a<>(b+c))     then ShowMessage('Dziwne');       // <- wchodzi
  if not (a=(b+c))  then ShowMessage('Bardzo dziwne');// <- wchodzi

  ShowMessage('A = '+FloatToStr(a));
  ShowMessage('B = '+FloatToStr(b));
  ShowMessage('C = '+FloatToStr(c));
  ShowMessage('B+C = '+FloatToStr(b+c));

  ShowMessage('A - (B+C) = '+FloatToStr( a-(b+c) ) );
end;

Proszę o pomoc w wyjaśnieniu zagadki.

[edit]
p.s. A może mam wirusa lub padł mi coprocesor :| ?
Powiedzcie, że u was jest OK bo albo jestem głupi albo mam walnięty sprzęt.

1

lub padł mi coprocesor

I niby przeglądarka, która pracuje praktycznie 90% czasu na liczbach zmiennoprzecinkowych Ci działa?

Jaki kompilator+użyj debuggera, niewykluczone że to jakiś bug.

Edit: np.przy Extended problemu już nie ma, więc o ile możesz to po prostu zmień typ (wytłumaczenie masz w poście -321oho).

1

Nie wiem czy ktoś słyszał że liczby zmiennoprzecinkowe mają określoną dokładność i ich porównywanie za pomocą = jest niebezpieczne właśnie ze względu na niedokładność obliczeń. Bodaj każdy kurs podstaw o tym mówi, no ale nawet @Patryk27 dał się zmylić .

0
Patryk27 napisał(a):

Edit: np.przy Extended problemu już nie ma, więc o ile możesz to po prostu zmień typ (wytłumaczenie masz w poście -321oho).

Albo (najlepiej) przerób podstawy metod numerycznych:

const
  Epsilon = 0.0001;

if ABS(a-b) <= Epsilon Then 
  MessageDlg('Równe z dokładnością epsilon', mtInformation, [mbOK], 0);

bo i przy extended prędzej czy później natkniesz się na kumulowanie błędów działań arytmetycznych.

0

No i wyszło że sprzęt jest dobry ;)

Dzięki za odpowiedzi i za typ extended :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0