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 ?
  • Data: 2012-11-01 14:49:57
    Temat: Re: Błędny epsilon - this is not a bug, this is ?
    Od: bartekltg <b...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie 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: