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!news.icm.edu.pl!news.supermedia.pl!newsfeed2.atman.pl!n
    ewsfeed.atman.pl!.POSTED!not-for-mail
    From: bartekltg <b...@g...com>
    Newsgroups: pl.comp.programming
    Subject: Re: Błędny epsilon - this is not a bug, this is ?
    Date: Thu, 01 Nov 2012 14:49:57 +0100
    Organization: ATMAN - ATM S.A.
    Lines: 69
    Message-ID: <k6tum6$592$1@node2.news.atman.pl>
    References: <50924bb1$0$1308$65785112@news.neostrada.pl>
    <a...@g...com>
    NNTP-Posting-Host: 144-mi3-6.acn.waw.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=UTF-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: node2.news.atman.pl 1351777798 5410 85.222.69.144 (1 Nov 2012 13:49:58 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Thu, 1 Nov 2012 13:49:58 +0000 (UTC)
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20121010
    Thunderbird/16.0.1
    In-Reply-To: <a...@g...com>
    Xref: news-archive.icm.edu.pl pl.comp.programming:200451
    [ ukryj nagłówki ]

    W dniu 2012-11-01 12:08, kenobi pisze:

    >>
    > Ciekawe, ale dlaczego to jest dokladnie podwojona
    > wartosc epsilona? Z poczatku wydawalo mni sie ze slowo double odnosi sie wlasnie do
    tego (a nie do typu double) i ze ta podwojna wartosc ma jakiej uzasadnienie
    >


    Z powodu niedoczytania i niejasnej definicji (definicja w floath.h
    jest myląca, ale ta w eps w matalbie powinna wszystko wyjaśnić).

    Bierzemy 1 i nasz epsylon_s = 1.11022324691088480000E-16.

    Odpalamy:
    ee=1.11022324691088480000E-16
    a=1+ee
    roznica = a-1

    Wychodzi:
    ee =
    1.1102e-016
    a =
    1.0000
    roznica =
    2.2204e-016

    Odległość między 1 a następną liczbą double wynosi 2.2204e-016,
    i to jest prawdziwa dokładność maszynowa.

    Dlaczego ten dwa razy mniejszy działa dla 'testu' 1+eps != 1?
    Koprocesor Zaokrąglanie. Koprocesor działa na ciut dłuższych
    liczbach niż 64bity (80bitów na x86) dodaje bez problemu 1 do
    epsylona sławka, następnie rzutuje na double. A, że jest w połowie
    drogi do następnej liczby zapisywalnej w double, zaokrągla w górę.
    I różnica wychodzi 2.2204e-016.

    Ale nie znajdziesz takiej liczby x>1, aby |x-1|= 1.1102e-016

    Co bardziej zasługuje na nazwę epsylon maszynowy,
    1+eps != 1 czy eps = min_{x>1} (x-1)
    to dyskusja o wyższości świat przesilenia zimowego na marsie
    i rocznicy uśpienia chutuchtu.

    I tak używamy raczej liczb typu 100*eps, gdzie to 100 jest bardzo
    orientacyjne czy, częściej i większą podbudową teoretyczną, np
    sqrt(eps).
    Jeśli nasz program 'działa' dla jednego z tych epsyllonów,
    a nie "działa" dla drugiego, to i tak trzeba pomyśleć albo
    użyć większej precyzji.


    A, żeby było zabawniej:
    ee=1.11022324691088480000E-16/2 %dwa razy mniej!
    a=1-ee
    roznica = a-1

    ee =
    5.5511e-017
    a =
    1.0000
    roznica =
    -1.1102e-016

    :-)


    pzdr
    bartekltg

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: