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

januszwoj
-
-
Posty: 3
Rejestracja: 31 sty 2006, o 15:37
Lokalizacja: Kielce

Prosta operacja matematyczna ????

Postautor: januszwoj » 31 sty 2006, o 16:11

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

Awatar użytkownika
Press
-
-
Posty: 389
Rejestracja: 10 mar 2004, o 16:21
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: Press » 31 sty 2006, o 16:35

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

Awatar użytkownika
piotr_go
-
-
Posty: 159
Rejestracja: 27 sie 2004, o 12:18
Lokalizacja: far far away

Postautor: piotr_go » 31 sty 2006, o 16:54

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.

Awatar użytkownika
Press
-
-
Posty: 389
Rejestracja: 10 mar 2004, o 16:21
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: Press » 31 sty 2006, o 18:18

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.
gdyby bylo tak jak mowisz, to Danac = 740 * 0.049 tez dawaloby wynik zerowy, a w tym wypadku wynik jest zgodny z oczekiwanym.

a_antoniak
-
-
Posty: 645
Rejestracja: 13 sty 2005, o 18:38
Lokalizacja: Krasnystaw
Kontaktowanie:

Re: Prosta operacja matematyczna ????

Postautor: a_antoniak » 31 sty 2006, o 18:55

Strzał:
Danab = Danad * 0.049
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.
Danac = 740 * 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.

Troche to glupie, ale..... ciekawe co M.A. tam zaszyl :)

januszwoj
-
-
Posty: 3
Rejestracja: 31 sty 2006, o 15:37
Lokalizacja: Kielce

Re: Prosta operacja matematyczna ????

Postautor: januszwoj » 31 sty 2006, o 21:54

Strzał:
Danab = Danad * 0.049
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.
Danac = 740 * 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.

Troche to glupie, ale..... ciekawe co M.A. tam zaszyl :)
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.

szymel
-
-
Posty: 212
Rejestracja: 16 sty 2005, o 16:42
Lokalizacja: Włocławek

Re: Prosta operacja matematyczna ????

Postautor: szymel » 31 sty 2006, o 23:39

...
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.
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ą.

Kod: Zaznacz cały

Danab = Danad *49 '***Dabab = danaB/1000 - bez tego
Należy tylko pamiętać , że wynik w zmiennej "Danad" jest w ... mV.

Piotrek

a_antoniak
-
-
Posty: 645
Rejestracja: 13 sty 2005, o 18:38
Lokalizacja: Krasnystaw
Kontaktowanie:

Re: Prosta operacja matematyczna ????

Postautor: a_antoniak » 31 sty 2006, o 23:54

Wywal zmienną SINGLE na śmietnik i skorzystaj z rozwiązania podanego przez Press z małą poprawką.
Dokladnie tak. Przyklad manipulowania wynikami konwersji A/C za pomoca liczb calkowitych dla uC ADuC812 ('51) mozesz znalezc np. tu (trzeba znac C):

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

januszwoj
-
-
Posty: 3
Rejestracja: 31 sty 2006, o 15:37
Lokalizacja: Kielce

Re: Prosta operacja matematyczna ????

Postautor: januszwoj » 1 lut 2006, o 09:49

...
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ą.

Kod: Zaznacz cały

Danab = Danad *49 '***Dabab = danaB/1000 - bez tego
Należy tylko pamiętać , że wynik w zmiennej "Danad" jest w ... mV.

Piotrek
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.
Pozdrawiam JanuszW.

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 83 gości