ATNEL tech-forum
https://forum.atnel.pl/

Promocja, problemy z obliczeniami - prośba o wytłumaczenie.
https://forum.atnel.pl/topic1595.html
Strona 1 z 1

Autor:  rezasurmar [ 26 wrz 2012, o 08:22 ]
Tytuł:  Re: Promocja, problemy z obliczeniami - prośba o wytłumaczen

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

Autor:  Malutki_27 [ 26 wrz 2012, o 08:37 ]
Tytuł:  Re: Promocja, problemy z obliczeniami - prośba o wytłumaczen

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 ;)

Autor:  Malutki_27 [ 26 wrz 2012, o 09:05 ]
Tytuł:  Re: Promocja, problemy z obliczeniami - prośba o wytłumaczen

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 ;)

Autor:  mirekk36 [ 26 wrz 2012, o 11:46 ]
Tytuł:  Re: Promocja, problemy z obliczeniami - prośba o wytłumaczen

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

Autor:  mirekk36 [ 26 wrz 2012, o 12:00 ]
Tytuł:  Re: Promocja, problemy z obliczeniami - prośba o wytłumaczen

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 ;)

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/