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



Teraz jest 21 lis 2017, o 02:00


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: 21928
Lokalizacja: Szczecin
Pomógł: 802

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: 21928
Lokalizacja: Szczecin
Pomógł: 802

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 2 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