Witam, spędziłem wczoraj sporo godzin w biurze na debugowaniu kodu napisanego przez naszego kontraktora i w końcu znalazłem buga. Przyczyną błędu była różnica odejmowania dwu liczb całkowitych wynosząca 15.1234e-15 :-)
Ale może więcej szczegółów podam:
Pisząc w Visual Basic 6 gostek porównywał rezultat konwersji CDbl() stringu od którego odjął stałą numeryczną 1.8 do lokalnej zmiennej double.
Czyli mamy kod:
Sub AlaMaKota(nieważne tutaj argumenty procedury) Dim len as Double
len = CDbl("tekst wydłubany z RS232") - 1.8
If len <> CDbl("inny tekst wydłubany z RS232) Then zgłoś błąd i kapitulujemy... kaput! Else lecimy z testami talej, wsio w pariadkie Endif.
Pierwszy tekst z RS232 był 32.8, drugi 31. 32.8-1.8 = 31. Powinno być wszystko ok, bo w matematyce 31 równe jest 31 :-) Wynik porównania VB6 był 31 nie jest równe 31 i program kapitulował...
Po zamienieniu testu "if double <> double then" na test "if double - double < -0.001 Or double - double > 0.001 then" program zaczął pracować normalnie.
Przyczyną błędu była różnica odejmowania wynosząca 15.1234e-15
Dlaczego konwersja CDbl stringu 31 lub 32.8 dodaje jakieś śmieci do zmiennej double float na 15 miejscu po przecinku?? A może odejmowanie stałej 1.8 wprowadza ten błąd?
Czy to jest normalne zachowanie się VB6?
Czy inne Visuale jak VC++ lub VC# też tak mają?