eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingBłędny epsilon - this is not a bug, this is ?Re: Błędny epsilon - this is not a bug, this is ?
  • Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
    atman.pl!news.supermedia.pl!newsfeed.pionier.net.pl!newsfeed.neostrada.pl!unt-e
    xc-02.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED
    !not-for-mail
    From: "slawek" <h...@s...pl>
    Newsgroups: pl.comp.programming
    References: <50924bb1$0$1308$65785112@news.neostrada.pl>
    <k6vusd$o7$1@news.task.gda.pl>
    <50938915$0$1225$65785112@news.neostrada.pl>
    <f...@g...com>
    In-Reply-To: <f...@g...com>
    Subject: Re: Błędny epsilon - this is not a bug, this is ?
    Date: Fri, 2 Nov 2012 15:54:31 +0100
    MIME-Version: 1.0
    Content-Type: text/plain; format=flowed; charset="iso-8859-2"; reply-type=original
    Content-Transfer-Encoding: 8bit
    X-Priority: 3
    X-MSMail-Priority: Normal
    Importance: Normal
    X-Newsreader: Microsoft Windows Live Mail 15.4.3555.308
    X-MimeOLE: Produced By Microsoft MimeOLE V15.4.3555.308
    Lines: 59
    Message-ID: <5093dea9$0$1217$65785112@news.neostrada.pl>
    Organization: Telekomunikacja Polska
    NNTP-Posting-Host: 62.69.202.124
    X-Trace: 1351868073 unt-rea-b-01.news.neostrada.pl 1217 62.69.202.124:59987
    X-Complaints-To: a...@n...neostrada.pl
    Xref: news-archive.icm.edu.pl pl.comp.programming:200474
    [ ukryj nagłówki ]

    Użytkownik "kenobi" napisał w wiadomości grup
    dyskusyjnych:f1c06cb8-0345-44a8-8207-a4773d21ebf8@go
    oglegroups.com...

    >pozatym jednak niechybnie masz racje
    >jesli okazuje sie ze ten 2.2 nie jest
    >najmniejsza liczba, tylko 1.1 tez dziala;

    No właśnie rzecz w tym, że mam-i-nie-mam. Spróbuję uporządkować, ale
    potrzebna mi jest definicja op(a,b). Funkcję op(a,b) definiuję jako wynik
    "dodawania" wykonywanej na danym komputerze. W ten sposób nie musi być nawet
    op(2,2) == 4, bo op(a,b) nie jest sumą liczb a+b w sensie matematycznym.

    I teraz mamy 3 "epsilony":

    1. Liczbę x, która jest najmniejszą liczbą spełniającą nierówność op( 1.0,
    x ) > 1.0 .
    2. Liczbę y, która jest największą liczba spełniającą równanie op( 1.0, y )
    == 1.0 .
    3. Liczbę z, która wynosi z = q - 1.0, gdzie q jest najmniejszą liczbą
    zapisywalną w określony sposób i spełniającą warunek q > 1.0 .

    Uwaga: odejmowanie w pkt. 3. należy rozumieć abstrakcyjnie, czyli ściśle
    matematycznie.

    Liczby x oraz y są różne na n-tym miejscu po przecinku i dlatego traktuję
    je - choć niesłusznie - jako ten sam epsilon. Gdyby zwiększać ilość bitów
    mantysy do nieskończoności, to granicznie stałyby się identyczne (i równe
    zeru).

    Liczba z jest, w bardzo dobrym przybliżeniu, 2 razy większa niż z. I tę
    właśnie liczbę Bartek nazywa epsilonem. Ok, też można. Choć jest to jednak
    inna definicja niż np. w Numerical Recipes, czyli dość popularnym
    podręczniku nt. metod numerycznych (takim sobie, ale znacznie lepszym niż
    np. podręcznik Jankowskich) i niż "miał na myśli artysta" uwieczniający się
    komentarzem we float.h.

    Fakt, że z jest około dwukrotnie większy niż x jest trudno wytłumaczalny
    bez - czego właśnie Bartek nie potrafił wyjaśnić - wiedzy o tym, że
    obliczenia FPU są robione na 80 bitowych a nie 64 bitowych liczbach float
    point. Tzn. normalne liczby double mają mantysę 53 bitową, ale wewnętrznie
    FPU (zmutowany Intel 80287) liczy z mantysą 63 bitową. Zaokrąglanie op(1,x)
    następuje "do najbliższej", więc w ten sposób w jako wynik osiągana jest
    liczba q > 1.0 - "brakującą połówkę z" dostajemy w trakcie konwersji z
    mantysy 63 bitowej na 53 bitową.

    Przy "różnych opcjach kompilatora(ów)" da się wymusić czasem jakieś double
    double, quarduple czy extended - oraz rygorystyczne obcinanie dokładności
    FPU do 53 bitów. Istnieją też prawdziwe procesory 128 bitowe i takie tam.
    Więc rzeczywiście nie jest bezpiecznie polegać na wstępnie ustalonym
    DBL_EPSILON - a zwłaszcza (co już pisałem) brać dosłownie wszystkich cyferek
    jakie tam we float.h są wypisane.

    W Wikipedii jest jak wół epsilon 1.11E-16 (dla double), ale na tej samej
    stronie WWW jest przykład w Phytonie z wynikiem 2.22E-16. Już samo to
    wymagałoby sprostowania, przecież Wikipedia nie jest czymś czego nie można
    poprawiać - zwłaszcza jeżeli się aspiruje do bycia - jak Bartek - ekspertem
    w dziedzinie.


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: