logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[c] [c][AVR] Dlaczego wynik modulo 302 % 504 to 302 zamiast 302?

Adrian1978 23 Lip 2014 22:58 3837 11
  • #1 13820203
    Adrian1978
    Poziom 11  
    Witam Was, mam pewien upierdliwy problem, zerknijcie:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    i teraz zaskoczenie:
    po wyliczeniu reszty z dzielenia (modulo) obu tych liczb mam wynik ...302 !
    Nie kumam jak on to liczy , spodziewałem się np.5992 (reszty z dzielenia obu liczb)

    Dodam może że wartości jakie podstawiłem tutaj są przykładowe , chodzi mi o błąd w interpretacji działania operacji modulo (%).
    Z książki p.Kardasia wynika dość jasno że powinienem mieć wynik właśnie reszty z dzielenia (chociaż on to omawia na liczbach uint8_t / uint16_t)

    Możecie mnie oświecić gdzie błądzę?
  • #2 13820238
    Konto nie istnieje
    Poziom 1  
  • #3 13820268
    excray
    Poziom 41  
    Ściągnij erratę do podręcznika.
  • #4 13820283
    Eagle
    Poziom 24  
    Szukasz reszty z dzielenia czy wyniku z dzielenia ?
    Reszta z dzielenia 7 przez 3 wynosi 1 bo 2*3 +1 = 7. W każdym bądź razie reszta nie będzie 2.333(3) bo to jest już wynik dzielenia.

    A dla twojego przypadku reszta z dzielenia 302 przez 504 wynosi 302.
    0*504 + 302 = 302
  • #5 13820318
    Adrian1978
    Poziom 11  
    Tzn mozolę się z miernikiem przepływu , gdzie mam dwa przepływy i muszę określić ile mam % stężenia jednego w drugim.
    Zakres wskazań dla obu rozciąga się od 1 do 99000 (liczby całkowite) i jest różny w obu co chwilę.

    Ja zaś muszę podawać w postaci procentowej jakie jest aktualne stężenie jednego w drugim.

    Podążając więc za prostym wzorem obliczania procentu wykoncypowałem
    że będę dzielił mniejszy przepływ przez większy za pomocą modulo a resztę z dzielenia przemnożę X 100 i mam procent. No ale na wyliczaniu modulo zdębiałem ;)

    Dodano po 5 [minuty]:

    Eagle napisał:
    Szukasz reszty z dzielenia czy wyniku z dzielenia ?
    Reszta z dzielenia 7 przez 3 wynosi 1 bo 2*3 +1 = 7. W każdym bądź razie reszta nie będzie 2.333(3) bo to jest już wynik dzielenia.

    A dla twojego przypadku reszta z dzielenia 302 przez 504 wynosi 302.
    0*504 + 302 = 302


    Ha ! więc to tak ! no to kanał - próbując dzielić obie liczby gdzie z założenia "w_wynik_c" mam zawsze większy od "n_wynik_c" , więc wynikiem zwyczajnego dzielenia obu tych liczb miałem zero i nic mi z tego nie wychodziło
  • #6 13820583
    el2010tmp
    Poziom 25  
    To nie jest takie trudne:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jeżeli chcesz liczyć dokładniej użyj typów zmiennoprzecinkowych.
  • #7 13820708
    Adrian1978
    Poziom 11  
    el2010tmp napisał:
    To nie jest takie trudne:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jeżeli chcesz liczyć dokładniej użyj typów zmiennoprzecinkowych.



    Proste i eleganckie rozwiązanie, na które nie wpadłem :oops: DZIĘKUJĘ !!!
  • #8 13822175
    Adrian1978
    Poziom 11  
    A czy w takim razie można równie łatwo wyliczyć i wrzucić do innej zmiennej wartość po przecinku z takiego wyliczenia ? (czasem wyliczenie jest z wartością ułamkową , chciałbym chociaż jedną cyfrę po przecinku móc wyświetlić również)

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodano po 6 [minuty]:

    Bo jedyne co przychodzi mi do głowy to taka konstrukcja:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    nie wiem jednak czy będzie to dobrze liczył - zaraz sprawdzę i napiszę :)

    Dodano po 38 [minuty]:

    hmmm , chyba mam :

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #9 13822573
    el2010tmp
    Poziom 25  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Albo zamień uint32_t i uint16_t na float i będziesz miał poprzednią wersję od razu z częścią ułamkową.
  • #10 13822664
    piotrva
    VIP Zasłużony dla elektroda
    Z tym, że działanie na zmiennych float jest bardziej pamięcio-żerne i działa wolniej - lepiej przemnożyć wszystkie liczby np. razy 10 (jeśli chcemy mieć 1 miejsce po przecinku) i na takich liczbach prowadzić operacje.
  • #11 13822885
    tmf
    VIP Zasłużony dla elektroda
    Czyli ogólnie wprowadzić operacje stałopozycyjne. Można to zrobić tak jak pisze kolega piotrva, lub skorzystać z arytmetyki stałopozycyjnej oferowanej przez kompilator, np. z typu _Accum.
  • #12 13886448
    Adrian1978
    Poziom 11  
    Ok , rozwiązaniem problemu okazał się sposób opisany kilka postów wyżej - dziękuję za poradę i podanie sposobu. Temat uważam za zamknięty by nie "wisiał". Dziękuję Wam !!!
REKLAMA