Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 7 kwi 2025, o 04:17


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
    Autor Wiadomość
    PostNapisane: 26 wrz 2012, o 08:22 

    Pomógł: 0

    Z tym tematem http://atnel.pl/domyslna-promocja-do-typu-int.html się kolega zapoznał???



    Góra
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 wrz 2012, o 08:37 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    Bo może obliczenia są robione on lewej do prawej i rzutowanie do 32bit nastepuje końcu.
    Natomiast w drugim przypadku od razu operujesz na zmiennej 32bit

    ------------------------ [ Dodano po: 2 minutach ]

    w drugim przypadku kłania się kolejność obliczeń matematycznych ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 wrz 2012, o 09:05 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    robiw napisał(a):
    Rzeczywiście kolejność może mieć znaczenie, ale według artykułu Mirka:

    "Ale z powyższych wyjaśnień pewnie już rozumiesz, że dodawanie do każdej nie jest konieczne ponieważ wystarczy aby jedna składowa wyrażenia posiadały typ większy od domyślnego 16-bitowego i od razu kompilator zrezygnuje z domyślnej promocji do int."


    Wydaje mi się że przykład jest troszkę nie fortunny dlatego że mnożenie nadal jest w zakresie int16 stąd ten problem nie wynikł ;)
    Zresztą jak Mirek sie pojawi napewno nie omieszka zabrać głos w tej sprawie ;)
    A z cytatu którego użyłeś wynika tylko tyle że nie wszytskie wartości muszą być rzutowane, i do prawidłowych obliczeń wystarczy że będzie miała tylko jedna ;)


    robiw napisał(a):
    Zastanawiam się w takim razie czy "pod kreską" zostawić w takim razie również (1000UL*pulses) czy już wtedy wystarczy, że tylko w liczniku tego wyrażenia jest promocja do UL. No i swoją drogą zastanawiam się także czemu rzutowanie do (uint32_t) tego nie załatwia tak samo...robiw


    Powinieneś uzyć (1000UL*pulses), ponieważ kładnia się kolejność obliczeń. Najpierw w nawiasach, czyli nadal byś operował na uint8_t, a wynik działania przekracza ten typ ;)
    Zresztą przy dwóch zmiennych nie powinno mieć to znaczenia, ważne tylko aby wynik mieścił się w zadeklarowanym typie danych ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 wrz 2012, o 11:46 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    Kolejność obliczeń jak zauważył wyżej Malutki_27 to jedna i bardzo ważna rzecz. Ale niezrozumienie tego zagadnienia bierze się tutaj z jednej prostej przyczyny.

    Dokąd nie przestawisz się na myślenie o rozpatrywaniu w C każdej najmniejszej operacji jako .... uwaga! .... WYRAŻENIA dotąd będziesz miał kłopoty z tym.

    bo co to jest?

    Kod:
    pulse*weg


    ????

    to jest wyrażenie

    Kod:
    (pulse*weg)


    tak na prawdę składa się ono z dwóch mniejszych wyrażeń

    Kod:
    (pulse) * (weg)


    a całe działanie to mnożenie wyniku tych dwóch wyrażeń czyli

    Kod:
    ( (pulse) * (weg) )


    jak spojrzymy na to przez ten pryzmat to chyba nie trudno zauważyć, że jeśli dodamy kolejną zmienną

    Kod:
    pulse*weg*dist


    to będziemy mieli - no właśnie ile wyrażeń ? ;) zagadka

    pokażę to nawiasami:

    Cytuj:
    ( ((pulse)*(weg)) * (dist) )


    no i co ? :) to chyba logiczne zgodnie z kolejnością działań rozpatrujemy wartości każdego wyrażenia i to dokładnie będzie miało odzwierciedlenie w kodzie asemblera. Czyli ja tu widzę konieczność wyliczenia 5 wyrażeń - zgadza się?

    w związku z tym jeśli mamy działanie teraz z dzieleniem

    Kod:
    (pulse*weg*dist) / (pulse*1000UL)


    to czy nie zaczyna już być to jasne jak drut ? po co się zastanawiać czy trzeba pisać

    Kod:
    pulse*1000UL


    czy może

    Kod:
    1000UL*pulse


    toż to nie będzie miało ŻADNEGO znaczenia w związku z tym co napisałem wyżej.

    odnośnie ostatniego stwierdzenia że w działaniu

    Kod:
    Dist += ((WEG*wheel) / pulses);


    nie działa rzekomo wstawienie hmmm poprawnie mówiąc wykonanie rzutowania do typu uint32_t - jest nieprawdą. Coś ci może się już pomyliło w trakcie tych prób. Nie mam akurat teraz pod ręką zestawu uruchomieniowego więc musiałem skorzystać z "obrzydliwego" ;) symulatora pod AS6 .... więc proszę bardzo - najpierw bez żadnego rzutowania i zły wynik - zgadza się ? spójrzmy:

    Obrazek

    a teraz po kolei dwa rodzaje rzutowania jedno z użyciem 1UL a drugie z użyciem (uint32_t)

    ObrazekObrazek

    i jak widać wartość na końcu obliczona jest taka sama

    ------------------------ [ Dodano po: 1 minucie ]

    reasumując - jeśli mnożymy 3 liczby

    Kod:
    32UL * pulse * dist


    w taki sposób, to na podstawie powyższych rozważań pierwsze wyrażenie z uwagi na użyte rzutowanie już będzie miało wynik uint32_t dlatego mnożenie *dist już także będzie promowane do uint32_t

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 wrz 2012, o 12:00 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    a przy okazji tej dyskusji podpowiedziałeś wielu osobom jak w prosty sposób dla "leniwych" robić że tak powiem krótsze rzutowanie ;) już tłumaczę co mam na myśli ;) (to tak troszkę pół żartem pół serio ale fakt faktem że sam nieraz tak robię) hahaha

    (uint32_t) - tu musimy wklepać aż 10 znaków z klawiatury - męczarnia

    1UL* - tu możemy wklepać TYLKO 4 znaki z klawiatury - uuuuuf ;) jak przyjemnie

    jak widać sam zaliczam się do tych "leniwych" żeby nikt nie pomyślał że kogoś chciałem tu urazić ;)

    ------------------------ [ Dodano po: kilkunastu sekundach ]

    w związku z ciekawymi pytaniami podlinkuję te tematy do strony na atnelu o promocji do int16 ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO