eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaPorównywanie liczb, double float › Porównywanie liczb, double float
  • Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!go
    blin1!goblin.stu.neva.ru!eternal-september.org!feeder.eternal-september.org!rea
    der01.eternal-september.org!.POSTED!not-for-mail
    From: "Pszemol" <P...@P...com>
    Newsgroups: pl.comp.programming,pl.misc.elektronika
    Subject: Porównywanie liczb, double float
    Date: Wed, 12 Jun 2019 07:17:45 -0500
    Organization: A noiseless patient Spider
    Lines: 1
    Message-ID: <qdqqh6$n2f$1@dont-email.me>
    Reply-To: "Pszemol" <P...@B...com>
    Mime-Version: 1.0
    Content-Type: text/plain; format=flowed; charset="iso-8859-2"; reply-type=original
    Content-Transfer-Encoding: 8bit
    Injection-Date: Wed, 12 Jun 2019 12:17:43 -0000 (UTC)
    Injection-Info: reader02.eternal-september.org;
    posting-host="169dc811dd8517175745699fb5ac864e";
    logging-data="23631";
    mail-complaints-to="a...@e...org";
    posting-account="U2FsdGVkX19nLYaKO+pkim3DN9r6hdTt"
    Cancel-Lock: sha1:SYd4I3XEB36mrBHF4EwkmKgrwlE=
    X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8117.416
    X-Newsreader: Microsoft Windows Live Mail 14.0.8117.416
    Importance: Normal
    X-Priority: 3
    X-MSMail-Priority: Normal
    Xref: news-archive.icm.edu.pl pl.comp.programming:213535 pl.misc.elektronika:743691
    [ ukryj nagłówki ]

    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ą?

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: