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: a teraz po kolei dwa rodzaje rzutowania jedno z użyciem 1UL a drugie z użyciem (uint32_t) 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/ |