marcin_c napisał(a):
Witam,
poczytaj ten wpis Mirka o zaokrąglaniu wyniku podczas przeliczania float na int. To Ci powinno pomóc.
http://mirekk36.blogspot.de/2013/01/rs232-ubrr-jak-prawidowo-obliczac-trick.htmlPozdrawiam,
Marcin
Dziękuje Panowie, już wiem gdzie tkwił błąd w moim rozumowaniu.
Dla daty 2017-02-27 rds odbierze wartość mjd = 57811.
Rok = utcYear (odczytany z MJD) + 1900 + (jak kolega dambo nakierował mnie offset 1 lub 0). W naszym przypadku utcYear powinno wynosic 116.
Oryginalny wzór na obliczenie utcY:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Tu wychodzi 116,99. Zmyliła mnie funkcja floor. Teraz już wiem, ze obcina ona to co po przecinku - zaokragla zawsze w górę. Wiec floor(116,99) = 116
Nie wiedząc o tym, postanowiłem pozbyć się floatów - małe mnożenie:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wyszło znowu 116,99 - i elegancko, bo przeciez utcYear u mnie to liczba całkowita wiec mam 116!
Brakujaca jedynka "offset" jest liczony z wartosci utcMonth - jeśli otrzymamy (juz po zaokragleniu) wartość... 14 lub 15 - wtedy dodajemy do roku 1.
Wzór dla potomnych:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Za utcYear podstawiamy Inta 116 i wychodzi 15,88 czyli 15. Więc odnalazł mi się brakujący rok

Wartość miesiąca = utcMonth - 1 - offset * 12 = 15-1-12 = 2. Luty
