-
11. Data: 2019-06-12 17:27:32
Temat: Re: Porównywanie liczb, double float
Od: "J.F." <j...@p...onet.pl>
Użytkownik "Szyk Cech" napisał w wiadomości grup
dyskusyjnych:Jk8ME.2$6...@f...fr7...
>> 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ą?
>Weź chłopie ić na studia (ja miałem to nawet na wieczorowych 20 lat
>temu) i się doucz! Zamiast zadawać głupie pytania. Choć gdybyś dłubał
>w czymś innym niż VB to byś wiedział o problemie (w każdej książce do
>Asemblera czy C czy C++ to powinno być).
Musialbym sobie przypomniec ... ale przy okazji Assemblera raczej nikt
nie poruszal takiego watku.
Przy C predzej, ale to gdzies na pograniczu.
Kto nie uczyl sie Fortranu, ten nie zna zycia :-)
J.
-
12. Data: 2019-06-12 17:45:14
Temat: Re: Porównywanie liczb, double float
Od: s...@g...com
W dniu środa, 12 czerwca 2019 07:17:44 UTC-5 użytkownik Pszemol napisał:
>
> Czy to jest normalne zachowanie się VB6?
>
> Czy inne Visuale jak VC++ lub VC# też tak mają?
Koledzy juz powiedzieli co trzeba. Ja dodam ze jak ten kto ten program pisal naprawde
malo wie i jesli on dzialal wczesniej to tylko przypadkiem.
Jesli on, ten kontraktor jest z indii to albo zglos to jako ryzyko projekt managerowi
i zasugeruj zeby znalezli nieco kompetentniejszego albo od teraz testujcie wszystko
tak jakby to wam, nie przymierzajac, malpa pisala.
Co do PM-a. Policz ile czasu na to poswieciles, udokumentuj buga i zbieraj. Jak sie
trafi kolejny taki kwiatek to zbieraj w kupke.
Nawet dobry PM nie unegocjuje wiele bez podkladki. A negocjacje nie koniecznie musza
sie toczyc z kontraktorem, moze to byc tez wewnetrzne tarcie na zmiane na inna lige
cenowa.
Podkladka czyni cuda.
-
13. Data: 2019-06-12 18:17:17
Temat: Re: Porównywanie liczb, double float
Od: stary grzyb <s...@o...pl>
> Kto nie uczyl sie Fortranu, ten nie zna zycia :-)
Prawda, ale wcześniej trzeba było zaliczyć Algol.
-
14. Data: 2019-06-13 15:24:35
Temat: Re: Porównywanie liczb, double float
Od: "Pszemol" <P...@P...com>
"JDX" <j...@o...pl> wrote in message
news:5d00fc5f$0$522$65785112@news.neostrada.pl...
> On 2019-06-12 14:17, Pszemol wrote:
> [...]
>> Pisząc w Visual Basic 6 gostek porównywał rezultat konwersji CDbl()
> No nieźle, nieźle. Myślałem, że to ja jestem dinozaurem, który w chacie
> używa WinXP, a tu widzę, że ludzie jeszcze komercyjnie piszą coś nowego
> pod VB6, do którego extended support skończył się w 2008. :-D Tak mnie
> jakoś tknął ten VB6, bo pamiętam, jak mój koleżka się nim zachwycał
> gdzieś pod koniec lat 90-tych. :-D
To raczej utrzymywanie starego kodu.
-
15. Data: 2019-06-13 15:35:17
Temat: Re: Porównywanie liczb, double float
Od: "Pszemol" <P...@P...com>
"Szyk Cech" <s...@s...pl> wrote in message
news:Jk8ME.2$6r.0@fx19.fr7...
>> 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ą?
>
> Weź chłopie ić na studia (ja miałem to nawet na wieczorowych
> 20 lat temu) i się doucz! Zamiast zadawać głupie pytania.
Ale kultury osobistej Cię tam nie nauczyli... szkoda.
> Choć gdybyś dłubał w czymś innym niż VB to byś wiedział
> o problemie (w każdej książce do Asemblera czy C czy C++
> to powinno być).
ha ha :-) No brawo.
-
16. Data: 2019-06-13 15:36:14
Temat: Re: Porównywanie liczb, double float
Od: "Pszemol" <P...@P...com>
<s...@g...com> wrote in message
news:f37ce076-b7e3-4dfc-803c-12c1d09de65d@googlegrou
ps.com...
> W dniu środa, 12 czerwca 2019 07:17:44 UTC-5 użytkownik Pszemol napisał:
>>
>> Czy to jest normalne zachowanie się VB6?
>>
>> Czy inne Visuale jak VC++ lub VC# też tak mają?
>
> Koledzy juz powiedzieli co trzeba. Ja dodam ze jak ten kto ten program
> pisal naprawde malo wie i jesli on dzialal wczesniej to tylko przypadkiem.
>
> Jesli on, ten kontraktor jest z indii to albo zglos to jako ryzyko projekt
> managerowi i zasugeruj zeby znalezli nieco kompetentniejszego albo od
> teraz testujcie wszystko tak jakby to wam, nie przymierzajac, malpa
> pisala.
>
> Co do PM-a. Policz ile czasu na to poswieciles, udokumentuj buga i
> zbieraj. Jak sie trafi kolejny taki kwiatek to zbieraj w kupke.
> Nawet dobry PM nie unegocjuje wiele bez podkladki. A negocjacje nie
> koniecznie musza sie toczyc z kontraktorem, moze to byc tez wewnetrzne
> tarcie na zmiane na inna lige cenowa.
> Podkladka czyni cuda.
Nie wiem jaką mają z nim umowę.
Ale ich wystawił do wiatru bo ostatnio jakąś dodatkową funkcję
chcieli dodać do programu i nie był zainteresowany aby przyjść
i pisać ten kod dalej... Gdy patrzę jak jest kod napisany to się nie dziwię.
-
17. Data: 2019-06-13 15:37:55
Temat: Re: Porównywanie liczb, double float
Od: "Pszemol" <P...@P...com>
"Mateusz Viste" <m...@n...pamietam> wrote in message
news:5d00f035$0$15194$426a74cc@news.free.fr...
> On Wed, 12 Jun 2019 07:17:45 -0500, Pszemol wrote:
>> 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.
>
> Prawdziwi programiści nie używają liczb zmiennoprzecinkowych.
Faktem jest, że gdy zmienne nie skaczą dynamicznie od e-15 do e+15 to
warto znaleźć zakres wariacji mierzonej zmiennej, oczekwianą dokładność
i zamiast na float operować na long integer * 10000 na przykład...
> Obowiązkowa lektura na wieczór:
> http://perso.ens-lyon.fr/jean-michel.muller/goldberg
.pdf
Dzięki za linka, zapoznam się w wolnym czasie.
-
18. Data: 2019-06-13 15:39:28
Temat: Re: Porównywanie liczb, double float
Od: "Pszemol" <P...@P...com>
"J.F." <j...@p...onet.pl> wrote in message
news:5d00f430$0$17345$65785112@news.neostrada.pl...
> Użytkownik "Pszemol" napisał w wiadomości grup
> dyskusyjnych:qdqqh6$n2f$...@d...me...
>>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ł...
>
>>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?
>
> To nie jest problem VB, to jest problem przyjetego formatu liczb
> rzeczywistych.
> Albo problem programisty :-)
>
> 31 jest dokladne, 0.8 nie.
> 0.5 jest dokladne, 0.25 i 0.75 itd - ale wiekszosc liczb "dziesietnych po
> przecinku" niestety nie.
>
> Po prostu nie da sie zapisac 32.8 dokladnie.
> Programista ma o tym wiedziec i sie zabezpieczyc :-)
>
>>Czy inne Visuale jak VC++ lub VC# też tak mają?
>
> To jest problem procesora z FP IEEEcostam.
Teraz jak czytam co napisałeś to wydaje się to oczywiste.
Ale taki byłem szczęśliwy że wreszcie znalazłem buga i uruchomiłem
program że samamu mi się ta klapka w mózgu nie odklapiła - dzięki.
-
19. Data: 2019-06-13 17:28:02
Temat: Re: Porównywanie liczb, double float
Od: Dariusz Dorochowicz <_...@w...com>
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
-
20. Data: 2019-06-16 21:19:42
Temat: Re: Porównywanie liczb, double float
Od: AK <n...@n...net>
On 2019-06-12 14:44, J.F. wrote:
> Użytkownik "Pszemol" napisał w wiadomości grup
> To nie jest problem VB, to jest problem przyjetego formatu liczb
> rzeczywistych.
I tam. Nieprawda. W _kazdym_ systemie/formacie FP moze sie zdarzyc.
> Albo problem programisty :-)
_Wylacznie_ problem programisty.
> Po prostu nie da sie zapisac 32.8 dokladnie.
> Programista ma o tym wiedziec i sie zabezpieczyc :-)
Prawda!
>> Czy inne Visuale jak VC++ lub VC# też tak mają?
>
> To jest problem procesora z FP IEEEcostam.
Wcale nie. To jest problem jak najbardziej ogolny.
> Akurat .net ma dodatkowe formaty (Decimal), w ktorych powinno to dzialac.
> Tylko trzeba ie
> Ale i tak bym dorzucil zabezpieczenie.
Racja! Sam Decimal tak naprawde przed niczym sam z siebie nie chroni.
> Problem promieniuje na bazy danych, gdzie mamy duzo kwot, a te grosze
> tez nie sa dokladne :-)
Raaacja ! :)
AK