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!news.nask.pl!news.nask.org.pl!news.internetia.pl!no
    t-for-mail
    From: Michoo <m...@v...pl>
    Newsgroups: pl.comp.programming
    Subject: Re: Błędny epsilon - this is not a bug, this is ?
    Date: Mon, 05 Nov 2012 11:07:52 +0100
    Organization: Netia S.A.
    Lines: 81
    Message-ID: <k783go$q3k$1@mx1.internetia.pl>
    References: <50924bb1$0$1308$65785112@news.neostrada.pl>
    <a...@g...com>
    <50926d86$0$1216$65785112@news.neostrada.pl>
    <k6tusp$elk$1@node1.news.atman.pl>
    <5092979f$0$1208$65785112@news.neostrada.pl>
    <k6u5vk$cf9$1@node2.news.atman.pl>
    <5092a72c$0$1311$65785112@news.neostrada.pl>
    <k6u98u$fjc$1@node2.news.atman.pl>
    <5092aefd$0$1232$65785112@news.neostrada.pl>
    <b...@g...com>
    <5092c4d8$0$1222$65785112@news.neostrada.pl>
    <k700o6$52t$1@news.task.gda.pl>
    <50939638$0$26708$65785112@news.neostrada.pl>
    <k71ct6$fjv$1@mx1.internetia.pl>
    <5094e05f$0$1312$65785112@news.neostrada.pl>
    <k73isd$sfj$1@mx1.internetia.pl>
    <50958b34$0$26700$65785112@news.neostrada.pl>
    NNTP-Posting-Host: 83.238.197.12
    Mime-Version: 1.0
    Content-Type: text/plain; charset=ISO-8859-2; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: mx1.internetia.pl 1352110424 26740 83.238.197.12 (5 Nov 2012 10:13:44 GMT)
    X-Complaints-To: a...@i...pl
    NNTP-Posting-Date: Mon, 5 Nov 2012 10:13:44 +0000 (UTC)
    In-Reply-To: <50958b34$0$26700$65785112@news.neostrada.pl>
    X-Tech-Contact: u...@i...pl
    User-Agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0.6esrpre) Gecko/20120817
    Icedove/10.0.6
    X-Server-Info: http://www.internetia.pl/
    Xref: news-archive.icm.edu.pl pl.comp.programming:200489
    [ ukryj nagłówki ]

    On 03.11.2012 22:22, slawek wrote:
    > Użytkownik "Michoo" napisał w wiadomości grup
    > dyskusyjnych:k73isd$sfj$...@m...internetia.pl...
    >
    >> Nie chce mi się sprawdzać, ale oidp jest to zaokrąglanie do
    >> najbliższego. Zresztą tylko taka forma by miała sens przy tej dyskusji
    >> o dokładności.
    >
    > Czyli jednak są zaokrąglane - a nie przycinane?

    Są przycinane do 64 bitów afaik na 4 sposoby:
    - down
    - up
    - near
    - trunc

    Domyślne jest near.

    Wolę słowo "przycinane", niż zaokrąglane, bo inaczej mamy "zaokrąglanie
    przez obcięcie bitów", a tak jest "przycięcie bitów (z zaokrągleniem)".

    > Wiem, marudzę.

    Marudzisz, zwłaszcza, że najpierw błędnie napisałeś o zaokrąglaniu w górę.

    >
    >> Tak. I jak Ci już wspomniano - w praktyce nie interesuje programisty
    >> dokładność maszynowa a odległość między dwiema liczbami, czyli 2*e.
    >> Komentarz jest błędny w nagłówku a dobry w matlabie.
    >
    > Po drugie - czyli jednak mam rację - jest błąd w float.h ? Jest!

    Jest, ale wynika z czego innego niż myślisz.

    >
    > Po pierwsze - właśnie sam napisałeś, że to co jest równe 2.2E-16 to
    > odległość między dwiema liczbami i nie jest to epsilon. I znowu mam
    > rację?! Dziwne.

    Nie epsilon _maszynowy_ na FPU x86, które jak już wspomniano jest 80
    bitowe. To, że dodanie ~połowy tej wartości wystarcza dla uzyskania
    1.0+e!=1.0 wynika z tych 80 bitów i polityki near. W szerszym typie
    wynik masz bliżej (1.0+2.2E-16) niż 1.0 więc jest zaokrąglane do
    (1.0+2.2E-16) w momencie przycięcia do double. Jeżeli byś operował na
    czystym double (64 bit) to zabraknie ci bitów na reprezentację tej sumy
    i afaik nadal dostaniesz 1.0.

    W związku z tym:
    - 2.2E-16 nie jest najmniejszą wartością jaka na FPU x86 spowoduje
    zajście nierówności. Jest najmniejszą taką wartością w typie double.

    >
    > Po trzecie - zamiast napisać, cyt., "nie interesuje programisty" -
    > powinieneś napisać, iż ciebie nie interesuje. (Czyli po prostu nie
    > uogólniać swoich opinii jako opinii wszystkich programistów, bo są to -
    > być może nawet bardzo celne - ale wyłącznie twoje własne spostrzeżenia.)

    float.h jest częścią standardu i odnosi się do standardowych typów
    float(32 bit) i double (64 bit). Gdyby ten nagłówek oparto o corner-case
    x86 to programista piszący np na VFP by się bardzo zdziwił, że ten
    epsilon nie działa.

    Na którymś z egzotycznych procesorów (niagara? alfa?) można było
    ustawiać zaokrąglanie dla każdego rozkazu fpu. Wyobrażasz sobie, że w C
    trzeba by przy każdej operacji float/double podawać prefix jak to
    zaokrąglić?


    >
    > Podsumowując - dobrze jeżeli jest już poprawka w Wikipedii - to
    > pozytywny rezultat dyskusji. A problem jest dużo bardziej poważny, niż
    > mi się wydawało - po prostu nie wiadomo ile bitów mantysy jest naprawdę
    > użyte (tj. czy będą użyte 64 bitowe liczby double, czy 80 bitowe
    > rejestry FPU, zależy od humoru kompilatora).

    I zazwyczaj nie ma to znaczenia. Nikt nie robi poważnej numeryki
    opierając się o to, że na x86 połowa epsilona double wystarcza.

    --
    Pozdrawiam
    Michoo

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: