Skocz do zawartości

liczby zmiennoprzecinkowe ???


Doc

Recommended Posts

Jest taki problem który mnie bardzo zadziwił. Pisałem program w którym był taki oto kod:

double x = 4.0;
double czesc_calkowita;
double czesc_ulamkowa;
czesc_calkowita = modf( x, &czesc_ulamkowa );

i wszystko byloby dobrze gdyby po wykonaniu tej funkcji w
czesc_calkowita byla liczba 4.0 a w czesc_ulamkowej bylo 0.0
ale jest w odpowiednio 3.0 i 0.9999999999....
CZy ktoś może mi wyjaśnić czemu??? (na VC6.0)

Link do komentarza
Udostępnij na innych stronach

Sorry zżeniłem tutaj, nie mialem dostepu do swojego zródła i dlatego.
Tak na prawde to jest taki motyw jak następuje:

        double liczba = 0.412;
        double calosci,ulamki;
        cout << "wartosc poczatkowa liczba=" << liczba << endl;
        cout << endl;     

        do
        {
                liczba *= 10.0;
                
                ulamki = modf( liczba, &calosci );
        
                


                cout << "liczba=" << liczba << endl;
                cout << "calosci=" << calosci << endl;
                cout << "ulamki=" << ulamki << endl;
                cout << endl;                     
                
                liczba -=  calosci;

        }while( liczba > 0.0 );

i po wywolaniu tego daje to dziwne wyniki takie jak:
( jak ktos mi powie co jest grane to bede wdzieczny)

wartosc poczatkowa liczba=0.412

liczba=4.12
calosci=4
ulamki=0.12

liczba=1.2
calosci=1
ulamki=0.2

liczba=2
calosci=2
ulamki=1.06581e-014

liczba=1.06581e-013
calosci=0
ulamki=1.06581e-013

liczba=1.06581e-012
calosci=0
ulamki=1.06581e-012

liczba=1.06581e-011
calosci=0
ulamki=1.06581e-011

liczba=1.06581e-010
calosci=0
ulamki=1.06581e-010

liczba=1.06581e-009
calosci=0
ulamki=1.06581e-009

liczba=1.06581e-008
calosci=0
ulamki=1.06581e-008

liczba=1.06581e-007
calosci=0
ulamki=1.06581e-007

liczba=1.06581e-006
calosci=0
ulamki=1.06581e-006

liczba=1.06581e-005
calosci=0
ulamki=1.06581e-005

liczba=0.000106581
calosci=0
ulamki=0.000106581

liczba=0.00106581
calosci=0
ulamki=0.00106581

liczba=0.0106581
calosci=0
ulamki=0.0106581

liczba=0.106581
calosci=0
ulamki=0.106581

liczba=1.06581
calosci=1
ulamki=0.0658141

liczba=0.658141
calosci=0
ulamki=0.658141

liczba=6.58141
calosci=6
ulamki=0.58141

liczba=5.8141
calosci=5
ulamki=0.814104

liczba=8.14104
calosci=8
ulamki=0.141036

liczba=1.41036
calosci=1
ulamki=0.410364

liczba=4.10364
calosci=4
ulamki=0.10364

liczba=1.0364
calosci=1
ulamki=0.0364015

liczba=0.364015
calosci=0
ulamki=0.364015

liczba=3.64015
calosci=3
ulamki=0.64015

liczba=6.4015
calosci=6
ulamki=0.401503

liczba=4.01503
calosci=4
ulamki=0.0150279

liczba=0.150279
calosci=0
ulamki=0.150279

liczba=1.50279
calosci=1
ulamki=0.502788

liczba=5.02788
calosci=5
ulamki=0.0278807

liczba=0.278807
calosci=0
ulamki=0.278807

liczba=2.78807
calosci=2
ulamki=0.788067

liczba=7.88067
calosci=7
ulamki=0.880669

liczba=8.80669
calosci=8
ulamki=0.806686

liczba=8.06686
calosci=8
ulamki=0.066864

liczba=0.66864
calosci=0
ulamki=0.66864

liczba=6.6864
calosci=6
ulamki=0.686401

liczba=6.86401
calosci=6
ulamki=0.864014

liczba=8.64014
calosci=8
ulamki=0.640137

liczba=6.40137
calosci=6
ulamki=0.401367

liczba=4.01367
calosci=4
ulamki=0.0136719

liczba=0.136719
calosci=0
ulamki=0.136719

liczba=1.36719
calosci=1
ulamki=0.367188

liczba=3.67188
calosci=3
ulamki=0.671875

liczba=6.71875
calosci=6
ulamki=0.71875

liczba=7.1875
calosci=7
ulamki=0.1875

liczba=1.875
calosci=1
ulamki=0.875

liczba=8.75
calosci=8
ulamki=0.75

liczba=7.5
calosci=7
ulamki=0.5

liczba=5
calosci=5
ulamki=0
-- koniec--

link do projektu www.lo1.elk.edu.pl/projekt/asd.zip
oraz do gotowego programu www.lo1.elk.edu.pl/projekt/asd.exe

Link do komentarza
Udostępnij na innych stronach

  • 4 weeks later...

Jeśli znasz się na systemach liczb to zapewne wiesz, że liczba która ma skończoną postać w systemie dziesiętnym nie koniecznie ma postać skończoną w systemie binarnym (albo jej rozwinięcie wykracza poza wielkość typu double)
Pierwsze wyniki są poprawne, ponieważ najprawdopodobniej zmienna liczba przechowuje np. 0.4120000000000000012334...
co jest zaokrąglane do 0.412 przy wyświetlaniu.
Gdy po mnożeniu przez 10 dochodzi do stanu, w którym liczba wynosi 0.000000000012344..., to zaczyna się wyświetlać w formie 1.2344e-10, czego wcześniej nie było widać.

Link do komentarza
Udostępnij na innych stronach

  • 2 weeks later...
  • 2 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...