Path: csiph.com!aioe.org!.POSTED!not-for-mail From: "AK" Newsgroups: pl.comp.lang.python Subject: Re: Martwa grupa? Date: Sat, 17 Feb 2018 20:29:51 +0100 Organization: Aioe.org NNTP Server Lines: 69 Message-ID: References: <5a7d67d3$0$566$65785112@news.neostrada.pl> <5ce2d437-0c82-4cc2-8ca4-a2eb188237b7@googlegroups.com> <5a7d7652$0$665$65785112@news.neostrada.pl> <1w9lbxu5j97oe.dlg@tyczka.com> <5a7d8ff9$0$675$65785112@news.neostrada.pl> <1bjuq22x745gf$.dlg@tyczka.com> <5a7d9749$0$668$65785112@news.neostrada.pl> <506f1997-6b94-4c64-9e25-2c022f5aac62@googlegroups.com> NNTP-Posting-Host: jHM0fgmX8PLRSmVRRAzYag.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; format=flowed; charset="UTF-8"; reply-type=response Content-Transfer-Encoding: 8bit X-Complaints-To: abuse@aioe.org X-Notice: Filtered by postfilter v. 0.8.3 X-Antivirus: Avast (VPS 180217-2, 2018-02-17), Outbound message X-Priority: 3 X-MSMail-Priority: Normal X-Antivirus-Status: Clean X-Newsreader: Microsoft Windows Mail 6.0.6002.18197 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6002.19694 Xref: csiph.com pl.comp.lang.python:104 Użytkownik "slawek" napisał: > A ustawianie odcięcia na 1E-20 gdy zakres jest do 1E-308 to delikatnie ujmując jest > nieodpowiednie. Przeciez jasne (moze nie dla Ciebie?:) ze porownujemuy roznicę ? Nie wiem jak ciebie uczono, ale mnie uczono (pierwszy raz w ksiazce prof.Sysły "Algorytmy optymalizacji w jezyku Algol60"), ze zasada pracy na liczbach fp to _wlasciwie bez wyjatku_ porownania "nieostre" (czyli z zalozonym EPS): Czyli jak porownujemy liczby FP? Ano zawsze tak: a == b => abs(a - b) <= EPS a < b => (a - b) < -EPS a <= b => (a - b) <= EPS a > b => (a - b) > EPS a >= b => (a - b) >= -EPS gdzie EPS to gory zalozona dokladnosc i mniejsza _przynajmniej_ o rzad/dwa, (a tak naprawde mocno zalezna od "bledogennosci" - zaokraglenia/kumulacja bledow obliczen itp - wykonywanych obliczen) od rzedu dokladnosci/ilosci cyfr znaczacych mantysy. Mamy na IEEE double ~17 cyfr znaczacych mantysy czyli EPS minimalna to <= 1.0E-15. No i teraz sobie podstaw: a = 0.0 b = 1.0E-20 do: a == b => abs(a - b) <= EPS abs(0.0 - 1.0E-20) <= 1.0E-15 1.0E-20 <= 1.0E-15 # Prawda ci to czy nie ? Czyli a == b. Koniec kropka. Ale gdy sobie porownasz: a = 1.0E-10 b = 1.0E-20 abs(a - b) <= EPS => 9.999999999e-11 !<= 1.0E-15 # czyli a != b PS: Pamietam dobrze z "moich czasow" pewien projekt obliczeniowy wykonany przez Szacowna Woskowa Uczelnie dla przemyslu. Projekt/program dzialal tylko dla załaczonych przykladowych danych. Dla zadnych innych nie /nie byl zbiezny/ :) Miedzy innymi z powodu takich (choc nie tylko) kwiatkow. No i potem musieli dlugi czas zwykli programisci poprawiac mozolnie (a tak naprawde w duzym stopniu przepisac/napisac od nowa) "dzieło" (nie darmowe bynajmniej:) Panow Akademikow rodem z LWP. Ze juz o rachunkach 0.0zl czy bankowym zadluzeniu 0.0zl nie wspomne :) PS1: Nie zawsze teoretycznie mamy IEEE. Na rzeczonej Odrze czy Merze (czy nawet na PC-tach w poczatkowym okresie w kompilatorach MS-sa) liczby FP wcale nie byly IEEE-owe wiec nawet zalozenie o tych 17 cyfrach znaczacyh mantysy nie jest bezwzgledniee jedynie sluszne. PS2: A wystarczy przyjac prosta zasade: _Jakiekolwiek_ liczby FP sa z zadady niedokladne. Nawet po prostej operacji: b = a + 0.0 - 0.0 nie mozna przyjac ze pozniejsze "sztywne" porownanie a == b da prawdę. PS3: A ta naprawde/w praktyce to porownuje sie z reguly w numeryce _wzgledną_ roznicę liczb FP. Zasada z EPS pozostaje jednak wciaz aktualna. PS4: Wlasnie Python wyszedl na przeciw wiekszosci "nieswiadomym" dzis uzytkownikom FP i zaimplementowal wewnetrzenie nieco bardziej lagodny algorytm porownywania/wyswietlania/zaokraglana przy operacjach liczb fp niz taki "na surowo" czyli ze nieco czesciej a == b dziala dobrze nawet jesli liczby nie sa stricte/co do bita mantysy takie same. Stad zapewne to, ze 1.0e-20 == 0.0, choc osobiscie nie wierze bo w czystym Pythonie akurat ta operacja daje False. AK