-
Data: 2019-06-13 17:28:02
Temat: Re: Porównywanie liczb, double float
Od: Dariusz Dorochowicz <_...@w...com> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]W dniu 2019-06-12 o 14:17, Pszemol pisze:
> 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ą?
Kiedy dawno temu (naprawdę dawno) pisałem/modyfikowałem program do pracy
dyplomowej to w pewnym momencie zaczął się wysypywać z błędem dzielenia
przez zero. Po dochodzeniu okazało się że pomimo jawnej deklaracji
double pewne konkretne obliczenia robił na real i w mianowniku pojawiało
się zero. Żadne jawne deklaracje i wymuszenia typu obliczeń tego nie
potrafiły zmienić, pomogła dopiero zmiana kompilatora. Sztuczne dodanie
obliczeń powodowało tylko przesunięcie momentu wywalenia się programu.
Podobne obliczenia w innym miejscu robił jak należy. A ten drugi
(właściwie to on był pierwszy tylko z pewnych powodów chciałem użyć
innego) nie miał w ogóle takich problemów.
Pozdrawiam
DD
Następne wpisy z tego wątku
- 13.06.19 23:22 bartekltg
- 13.06.19 23:25 bartekltg
- 14.06.19 06:35 JDX
- 14.06.19 08:19 Mateusz Viste
- 16.06.19 21:19 AK
- 16.06.19 21:21 AK
- 16.06.19 21:40 AK
- 16.06.19 21:43 AK
- 16.06.19 21:48 AK
- 16.06.19 21:50 AK
- 16.06.19 21:53 AK
- 16.06.19 22:10 Szyk Cech
- 17.06.19 03:44 bartekltg
- 17.06.19 09:02 Mateusz Viste
- 17.06.19 09:21 Mateusz Viste
Najnowsze wątki z tej grupy
- Alg. kompresji LZW
- Popr. 14. Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- Arch. Prog. Nieuprzywilejowanych w pełnej wer. na nowej s. WWW energokod.pl
- 7. Raport Totaliztyczny: Sprawa Qt Group wer. 424
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
Najnowsze wątki
- 2025-03-03 a Ty jak się zachowasz w godzinie próby?
- 2025-03-03 nie naprawiam więcej telewizorów
- 2025-03-03 Białystok => Gen AI Engineer <=
- 2025-03-03 Poznań => Konsultant wdrożeniowy Comarch XL/Optima (Księgowość i
- 2025-03-03 Olsztyn => Sales Specialist <=
- 2025-03-03 Gdy ministrowie sa golodupcami
- 2025-03-03 Pruszków => Specjalista ds. public relations <=
- 2025-03-03 Białystok => System Architect (Java background) <=
- 2025-03-03 Białystok => System Architect (background deweloperski w Java) <=
- 2025-03-03 China-Kraków => Senior PHP Symfony Developer <=
- 2025-03-03 China-Kraków => Senior PHP Symfony Developer <=
- 2025-03-03 Warszawa => Data Engineer (Tech Lead) <=
- 2025-03-03 Gliwice => Ekspert IT (obszar systemów sieciowych) <=
- 2025-03-03 Gliwice => IT Expert (Network Systems area) <=
- 2025-03-03 Mińsk Mazowiecki => Area Sales Manager OZE <=