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.task.gda.pl!news.dialog.net.pl!not-for-mail
    From: Tomasz Sowa <t...@N...ttmath.org>
    Newsgroups: pl.comp.programming
    Subject: Re: Błędny epsilon - this is not a bug, this is ?
    Date: Sat, 03 Nov 2012 11:48:52 +0100
    Organization: Dialog Net
    Lines: 89
    Message-ID: <k72sqt$gq$1@news.dialog.net.pl>
    References: <50924bb1$0$1308$65785112@news.neostrada.pl>
    NNTP-Posting-Host: dynamic-78-8-96-237.ssp.dialog.net.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=ISO-8859-2
    Content-Transfer-Encoding: 8bit
    X-Trace: news.dialog.net.pl 1351939741 538 78.8.96.237 (3 Nov 2012 10:49:01 GMT)
    X-Complaints-To: a...@d...net.pl
    NNTP-Posting-Date: Sat, 3 Nov 2012 10:49:01 +0000 (UTC)
    User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:16.0) Gecko/20121101
    Thunderbird/16.0.2
    In-Reply-To: <50924bb1$0$1308$65785112@news.neostrada.pl>
    Xref: news-archive.icm.edu.pl pl.comp.programming:200478
    [ ukryj nagłówki ]

    On 2012.11.01 11:15, slawek wrote:

    > Tzw. maszynowy epsilon (see Wikipedia) wynosi nie więcej niż 1.111E-016 dla
    > liczb 64-bitowych.

    Na wikipedii jest 2.220446e-16 (zjedź na dół do przykładu)

    > Taki wynik łatwo otrzymać nawet naiwnym algorytmem, w
    > którym po kolei sprawdzane są w pętli kolejne wartości epsilon - każda
    > kolejna nieco (o ułamek procenta) mniejsza od poprzedniej.

    A po co taki naiwny algorytm? definicja maszynowego epsilon chyba jest
    jasna?

    > Algorytm "fast"

    O(1) patrz poniżej

    > adaptacyjnie zmienia krok itd. - nie ma to znacznego wypływu na wynik, ale
    > liczba kroków jest znacznie mniejsza.
    >
    > Jednak zaglądając do float.h w MS VS C++ można znaleźć definicję
    > DBL_EPSILON, wraz ze stosownym komentarzem, 2.22044604925031310000E-016.

    I jest to prawidłowa wartość.

    > Jest to niemal 2 razy więcej, niż naprawdę wynosi epsilon (obliczony właśnie
    > programem skompilowanym w MSVS C++). "This is not a bug, this is
    > inaccuracy" - chciałoby się powiedzieć.

    Pokaż ten program.

    > Zaglądamy dalej - Matlab - tak ostatnio chwalony - ma wbudowaną funkcję
    > eps - zgadnijcie co zwraca eps jako wynik liczbowy? Tak, też się zdziwiłem -
    > przecież Matlab to Matlab.
    >
    > Jeszcze raz rzut oka do Wikipedii - jest sobie wyraźnie dobra wartość
    > epsilona dla double w tabelce - ale już np. program w Phytonie i wyniki z
    > niego - znowu błędne 2.22E-16 . I nie jest to "wina Phytona" - ale po prostu
    > błąd w programie.
    >
    > "Phytonowcy", staff MS i ludzie z MathWorks popełnili jeden i ten sam błąd -
    > dzielili przez dwa. Ciąg wartości x[n], jakie otrzymywali, dla dostatecznie
    > dużego n nie spełniał nierówności 1.0+x[n] > 1.0.

    Nie wiem co tu jest do dzielenia, aby obliczyć maszynowe epsilon nic nie
    trzeba dzielić, przykład:

    #include <iostream>
    #include <stdint.h>
    #include <iomanip>

    int main()
    {
    union
    {
    double f;
    uint64_t i;
    } u1, u2, u3;


    u1.i = 0x3ff0000000000000ul;
    // jeden (exponent na 1023 mantysa na zero -- jeden bit z przodu
    // mantysy jest domniemany)

    u2.i = 0x3ff0000000000001ul;
    // jeden i ciupka (ostatni bit mantysy na jeden i jeden bit z przodu
    // domniemany)

    u3.f = u2.f - u1.f;


    std::cout << "Maszynowe epsilon: " << std::setprecision(18) <<
    u3.f << std::endl;
    }

    /home/tomek/roboczy/test$ g++ -O2 -o test test.cpp && ./test
    Maszynowe epsilon: 2.22044604925031308e-16

    Oczywiście nie widzę sensu wypisywania tej wartości jako decimal (to
    tylko przybliżenie).
    W C++ jako stałą możesz mieć w ten sposób:
    std::cout << std::numeric_limits<double>::epsilon() << std::endl;


    --
    Tomek
    http://www.ttmath.org

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: