Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięProsta operacja matematyczna ????
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
Witam Wszystkich!
Napisałem sobie prosty program, który mierzył napięcia i miał je przeliczać. Program został napisany na procka Mega8 z wykorzystaniem Bascoma ver. 1.11.8.1 DEMO.
Program okroiłem do minimum
Dim Danaa As Word
Dim Danab As Word
Dim Danac As Word
Dim Danad As Word
Danad = 740
Danaa = 49 * Danad
Danaa = Danaa / 1000
Danab = Danad * 0.049
Danac = 740 * 0.049
Print Danaa ; " " ; Danab ; " " ; Danac
End 'end program
Czy ktoś mógłby mi powiedzieć czy to jest błąd kompilatora, że DANAA, DANAC są sobie równe, a DANAB zawsze jest równa 0. Czy to może błąd mojej wersji kompilatora??
Napisałem sobie prosty program, który mierzył napięcia i miał je przeliczać. Program został napisany na procka Mega8 z wykorzystaniem Bascoma ver. 1.11.8.1 DEMO.
Program okroiłem do minimum
Dim Danaa As Word
Dim Danab As Word
Dim Danac As Word
Dim Danad As Word
Danad = 740
Danaa = 49 * Danad
Danaa = Danaa / 1000
Danab = Danad * 0.049
Danac = 740 * 0.049
Print Danaa ; " " ; Danab ; " " ; Danac
End 'end program
Czy ktoś mógłby mi powiedzieć czy to jest błąd kompilatora, że DANAA, DANAC są sobie równe, a DANAB zawsze jest równa 0. Czy to może błąd mojej wersji kompilatora??
Powiem szczerze, ze dziwny problem. W symulacji komputerowej tez liczy niepoprawnie. DanaB zawsze jest zero. jedyny poprawny wynik jaki uzyskalem to w sytuacji gdy DanaB byla typu Single.
Pomogło rozbicie linii:
Danab = Danad * 0.049
i zapisanie jako:
Danab = Danad *49
Dabab = danaB/1000
Tylko trzeba uwazac zeby nei przekroczyc zakresu zmiennej przy mnozeniu przez 49.
Ot, to tylk Bascom
Pomogło rozbicie linii:
Danab = Danad * 0.049
i zapisanie jako:
Danab = Danad *49
Dabab = danaB/1000
Tylko trzeba uwazac zeby nei przekroczyc zakresu zmiennej przy mnozeniu przez 49.
Ot, to tylk Bascom
gdyby bylo tak jak mowisz, to Danac = 740 * 0.049 tez dawaloby wynik zerowy, a w tym wypadku wynik jest zgodny z oczekiwanym.Nie znam za bardzo bascoma ale z tego co sie domyślam to przy:
Danab = Danad * 0.049
0.049 jest traktowana jako liczba całkowita (w tym przypadku jako 0) ponieważ Danab jest liczbą całkowitą. I mnożenie przez 0 daje 0
Zmień Word na float czy co tam jest ze zmiennym przecinkiem.
-
- -
- Posty:651
- Rejestracja:13 sty 2005, o 18:38
- Lokalizacja:Krasnystaw
- Kontaktowanie:
Re: Prosta operacja matematyczna ????
Strzał:
Troche to glupie, ale..... ciekawe co M.A. tam zaszyl
tu kompilator "widzi", ze mnozenie odbywa sie przez zmienna calkowita, wiec przed dokonaniem mnozenia rzutuje liczbe single 0.049 na liczbe calkowita 0. wynik mnozenia = 0.Danab = Danad * 0.049
tu kompilator przed mnozeniem uznaje obie liczby (740 i 0.049) za single i je mnozy przez siebie. dopiero przy probie przypisania wyniku tego mnozenia do zmiennej calkowitej stwierdza, ze trzeba rzutuwac, rzutuje i wynik = 36.Danac = 740 * 0.049
Troche to glupie, ale..... ciekawe co M.A. tam zaszyl
Re: Prosta operacja matematyczna ????
Chyba masz rację jak zmienię DANAB na single to działa i podaje wynik z bardzo dużą dokładnością . Wszystko było by dobrze gdyby nie to że program zwiększył się z 30% na 68%, a to bardzo dużo.Strzał:
tu kompilator "widzi", ze mnozenie odbywa sie przez zmienna calkowita, wiec przed dokonaniem mnozenia rzutuje liczbe single 0.049 na liczbe calkowita 0. wynik mnozenia = 0.Danab = Danad * 0.049
tu kompilator przed mnozeniem uznaje obie liczby (740 i 0.049) za single i je mnozy przez siebie. dopiero przy probie przypisania wyniku tego mnozenia do zmiennej calkowitej stwierdza, ze trzeba rzutuwac, rzutuje i wynik = 36.Danac = 740 * 0.049
Troche to glupie, ale..... ciekawe co M.A. tam zaszyl
Re: Prosta operacja matematyczna ????
Jak by troszkę ruszyć głową , to rozdzielczość (a nie dokładność) pozostanie , przy czym objętość kodu wynikowego , znacznie spadnie.Domyślam się , że mierzysz napięcie za pomocą pokładowego ADC.Wywal zmienną SINGLE na śmietnik i skorzystaj z rozwiązania podanego przez Press z małą poprawką....
Chyba masz rację jak zmienię DANAB na single to działa i podaje wynik z bardzo dużą dokładnością . Wszystko było by dobrze gdyby nie to że program zwiększył się z 30% na 68%, a to bardzo dużo.
Kod: Zaznacz cały
Danab = Danad *49
'***Dabab = danaB/1000 - bez tego
Piotrek
-
- -
- Posty:651
- Rejestracja:13 sty 2005, o 18:38
- Lokalizacja:Krasnystaw
- Kontaktowanie:
Re: Prosta operacja matematyczna ????
Dokladnie tak. Przyklad manipulowania wynikami konwersji A/C za pomoca liczb calkowitych dla uC ADuC812 ('51) mozesz znalezc np. tu (trzeba znac C):Wywal zmienną SINGLE na śmietnik i skorzystaj z rozwiązania podanego przez Press z małą poprawką.
http://www.ep.com.pl/pobierz.php?id=2122
Mozna tez uzyc liczb staloprzecinkowych - pozwalaja one na dokonywanie operacji na liczbach rzeczywistych z uzyciem tylko i wylacznie arytmetyki calkowitoliczbowej. Ale trzeba umiec dobrac sobie pozycje "kropki dwojkowej", tak, aby uzyskac wymagana precycje (rozdzielczosc) i jednoczesnie uniknac ryzyka przepelnienia (co jest tez istotne w ww. propozycji i o tym pisal press).
Re: Prosta operacja matematyczna ????
Może w pierwszym poście źle się wyraziłem. Podałem w nim trzy sposoby wyliczenia tego samego i ten który cytujesz też tam był. Chciałem się dowiedzieć czy to tylko błąd mojej wersji kompilatora? Ale bardzo dziękując za wytłumaczenie sam bym się nie domyślił z tą zmienną Single....
Jak by troszkę ruszyć głową , to rozdzielczość (a nie dokładność) pozostanie , przy czym objętość kodu wynikowego , znacznie spadnie.Domyślam się , że mierzysz napięcie za pomocą pokładowego ADC.Wywal zmienną SINGLE na śmietnik i skorzystaj z rozwiązania podanego przez Press z małą poprawką.Należy tylko pamiętać , że wynik w zmiennej "Danad" jest w ... mV.Kod: Zaznacz cały
Danab = Danad *49 '***Dabab = danaB/1000 - bez tego
Piotrek
Pozdrawiam JanuszW.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 78 gości