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: Mon, 05 Nov 2012 21:35:47 +0100
    Organization: Dialog Net
    Lines: 64
    Message-ID: <k797v2$t98$1@news.dialog.net.pl>
    References: <50924bb1$0$1308$65785112@news.neostrada.pl>
    <k72sqt$gq$1@news.dialog.net.pl>
    <509505f2$0$1317$65785112@news.neostrada.pl>
    <k734vm$43g$1@news.dialog.net.pl>
    <509533d1$0$26687$65785112@news.neostrada.pl>
    NNTP-Posting-Host: dynamic-78-9-153-85.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 1352147746 29992 78.9.153.85 (5 Nov 2012 20:35:46 GMT)
    X-Complaints-To: a...@d...net.pl
    NNTP-Posting-Date: Mon, 5 Nov 2012 20:35:46 +0000 (UTC)
    User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:16.0) Gecko/20121101
    Thunderbird/16.0.2
    In-Reply-To: <509533d1$0$26687$65785112@news.neostrada.pl>
    Xref: news-archive.icm.edu.pl pl.comp.programming:200507
    [ ukryj nagłówki ]

    On 2012.11.03 16:10, slawek wrote:

    >> Bo popełniasz błąd który się propaguje w każdej iteracji
    >> algorytmu.
    >
    > Nie ma błędu. Za każdym razem jest na nowo sprawdzanie 1.0+eps > 1.0,
    > tj. pętla while(1.0 + eps > 1.0) {...}

    a no, tak sądziłem, sprawdź poniższy program

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

    template<typename float_t, typename int_t>
    float_t machine_eps()
    {
    union
    {
    float_t f;
    int_t i;
    } one, one_plus, little, last_little;

    one.f = 1.0;
    little.f = 1.0;
    last_little.f = little.f;

    while(true)
    {
    one_plus.f = one.f;
    one_plus.f += little.f;

    if( one.i != one_plus.i )
    {
    last_little.f = little.f;
    little.f /= 2.0;
    }
    else
    {
    return last_little.f;
    }
    }
    }

    int main()
    {
    std::cout << "machine epsilon:\n";
    std::cout << "float: " << std::setprecision(18)
    << machine_eps<float, uint32_t>() << std::endl;
    std::cout << "double: " << std::setprecision(18)
    << machine_eps<double, uint64_t>() << std::endl;
    }

    /home/tomek/roboczy/test$ g++ -o test test.cpp && ./test
    machine epsilon:
    float: 1.1920928955078125e-07
    double: 2.22044604925031308e-16

    ale to oczywiście tylko aproksymacja

    --
    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: