-
Data: 2019-06-13 23:25:18
Temat: Re: Porównywanie liczb, double float
Od: bartekltg <b...@g...com> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]On Wednesday, June 12, 2019 at 3:07:25 PM UTC+2, bartekltg wrote:
> On Wednesday, June 12, 2019 at 2:17:44 PM UTC+2, Pszemol wrote:
> > 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 :-)
>
> Ale nie działasz na liczbach rzeczywistych, ale na reprezentacji
> zmiennoprzecinkowej.
> Wszytkie trzy liczby tak naprawde mają wartość tylko zblizoną
> do tych napisanych.
>
> > 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.
>
> Używaj funkcji abs, to samo, a czytelniej.
>
> Tak, to jest poprawne rozwiązanie.
>
> > 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ą?
>
> W sumei to pierwsz rzecz, jakiej człowiek sie dowiaduja na jakimkolwiek
> poważniejsyzm kursie dotykającym zmiennego przecinka. Ze szczegolnym
> uwzlgędnieniem
> "Nie wykonuj porównania == i <> na liczbach zmiennoprzecinkowych"
>
>
> A jaka przyczyna? To przy okazji opisują.
>
> Zerknij na wiki, jak wyglada liczba zmiennoprzecinkowa.
>
> 2^coś *1.mantysa.
>
> 1/2 tak zapiszesz, ale 1/3 nie. 1/10 też nie.
> Zerknij tutaj,
> https://www.h-schmidt.net/FloatConverter/IEEE754.htm
l
> Liczy na single, ale zasada ta sama.
> wpisując 1.8 tak naprawdę trzymasz najbliższa
> reprezentaowalną liczbę, 1.7999999523162841796875
> Podobnie 32.8.
> 31 jest reprezentowane dokładnie.
>
> Teraz każda podstawowa operacja arytmetyczna biorąca argumenty
> a i b (oznaczamy fl(a) i fl(b) jako wartośći reprezentowane) liczy
> fl(a) (działanie) fl(b) dokładnie, a potem zapisuje jako najbliższa
> reprezentowalna wartość.
> W ogolności
> fl(a+b) = (fl(a)+fl(b))(1+eps), gdize ten epsylon to dokłądność
> reprezentacji.
Lepiej by było, jakbym napisał, że eps jest rzędu wielkośći reprezentacji.
Może być 0, może być jak dokładność v, dodatnia lub ujemna. Wzorkiem:
abs( eps ) < v.
pzdr
bartekltg
Następne wpisy z tego wątku
- 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
- 17.06.19 09:39 Piotr Wyderski
- 17.06.19 09:43 Piotr Wyderski
Najnowsze wątki z tej grupy
- 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??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
Najnowsze wątki
- 2025-01-20 Gdańsk => Programista Full Stack .Net <=
- 2025-01-20 Gliwice => Business Development Manager - Dział Sieci i Bezpieczeńst
- 2025-01-20 Warszawa => Full Stack .Net Engineer <=
- 2025-01-20 huta ruszyla
- 2025-01-20 piece wodorowe
- 2025-01-20 Lublin => Programista Delphi <=
- 2025-01-20 Warszawa => Architekt rozwiązań (doświadczenie w obszarze Java, AWS
- 2025-01-20 Mińsk Mazowiecki => Area Sales Manager OZE <=
- 2025-01-20 Bieruń => Spedytor Międzynarodowy (handel ładunkami/prowadzenie flo
- 2025-01-19 Test - nie czytać
- 2025-01-19 qqqq
- 2025-01-19 Tauron przysyła aneks
- 2025-01-19 Nowa ładowarka Moya a Twizy -)
- 2025-01-18 Power BANK z ładowaniem przelotowym robi PRZERWY
- 2025-01-18 Pomoc dla Filipa ;)