Doc Napisano Grudzień 4, 2018 Autor Zgłoś Udostępnij Napisano Grudzień 4, 2018 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) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Jarema Napisano Grudzień 7, 2018 Zgłoś Udostępnij Napisano Grudzień 7, 2018 Ja sprawdzalem u siebie, ten sam kompilator. Daje dobre wyniki. A kompilujesz to pod Debug czy Release? Chociaz to i tak ma pewnie nie ma roznicy. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Doc Napisano Grudzień 13, 2018 Autor Zgłoś Udostępnij Napisano Grudzień 13, 2018 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 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Aberration Napisano Styczeń 7, 2019 Zgłoś Udostępnij Napisano Styczeń 7, 2019 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ć. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Doc Napisano Styczeń 19, 2019 Autor Zgłoś Udostępnij Napisano Styczeń 19, 2019 Dzieki za odpowiedz. Wiele mi wyjasnilo bo nie wiedzialem o tym motywie, ale czemu jak przypisuje się liczbę np. 4.123 do zmiennej double to czemu są takie motywy. Przecież to jest liczba określona jednoznacznie bez żadnych śmieci na końcu??? Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Aberration Napisano Styczeń 29, 2019 Zgłoś Udostępnij Napisano Styczeń 29, 2019 4.123 "śmieci" ma, ale 4.125 już nie. Jak już wspomniałem chodzi tu o binarne rozwinięcia tych liczb: 4.125 jest skończone, 4,123 nie. Jak chcesz, to sprawdź 4.125 w swoim programie. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.