🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.programming
Article #215747

Re: Porównywanie liczb, double float

#215747
From: Dariusz Dorochowicz
Date: Thu, 13 Jun 2019 15:28
57 lines
3278 bytes
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
Technical Details
Message-ID: <5d026b7f$0$500$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-a-02.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <qdqqh6$n2f$1@dont-email.me>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-a-02.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
Subject: Re: Porównywanie liczb, double float
Newsgroups: pl.comp.programming,pl.misc.elektronika
References: <qdqqh6$n2f$1@dont-email.me>
From: Dariusz Dorochowicz <_dadoro_@wp.com>
Date: Thu, 13 Jun 2019 17:28:02 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.7.0
MIME-Version: 1.0
In-Reply-To: <qdqqh6$n2f$1@dont-email.me>
Lines: 57
Message-ID: <5d026b7f$0$500$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 89.77.186.177
X-Trace: 1560439679 unt-rea-b-01.news.neostrada.pl 500 89.77.186.177:61144
X-Complaints-To: abuse@news.neostrada.pl
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit