Elektroda.pl
Elektroda.pl
X
Mitronik
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bascom - Zaokrąglanie liczby zmiennoprzecinkowej do liczby całkowitej

karol1996 18 Gru 2016 23:25 987 14
  • #1 18 Gru 2016 23:25
    karol1996
    Poziom 19  

    Witam
    Potrzebuję zaokrąglić liczbę zmiennoprzecinkową do liczby całkowitej (do późniejszego wyświetlenia na wietlaczu LED (rozbijanie liczby na pojedyncze cyfry działa poprawnie).
    Do tego celu wykorzystałem funkcję Round.
    Zgodnie z instrukcją Bascoma należy zrobić to tak:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Rozumiem, że gdyby np. B = 123.456, to A wyszłoby 123, tak?
    Ten sposób niestety nie działa (kompilator zgłasza błąd).
    Na Forum wyczytałem iż zmienna B powinna być typu Single. Po zmianie typu zmiennej program się kompiluje, ale liczba się nie wyświetla.

    Pozdrawiam,
    Karol

    0 14
  • Mitronik
  • #2 19 Gru 2016 00:13
    373522
    Użytkownik usunął konto  
  • #3 19 Gru 2016 09:33
    karol1996
    Poziom 19  

    Witam
    Wersja mojego Bascoma to 1.11.9.0.
    Niestety ani Round ani zrównanie liczb ze sobą skutków nie przynosi.

    Pozdrawiam,
    Karol

    0
  • Mitronik
  • #4 19 Gru 2016 11:25
    kamyczek
    Poziom 34  

    Masz takie coś jeszcze:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Poczytaj sobie o tej funkcji przekształca ona zmienną na tekst o ile coś ci pomoże
    z tego co pamiętam to w zależności od znaku który był na końcu wynik był zaokrąglony lub reszta była odrzucana wprost .

    0
  • #5 19 Gru 2016 14:05
    karol1996
    Poziom 19  

    Witam
    Funkcję Fusing znam. Niestety, zgodnie z instrukcją Bascoma, nie pozwala ona na zaokrąglanie liczby do całości "po kropce musi wystąpić przynajmniej jeden znak # lub &"
    Więc nie spełnia ona moich oczekiwań.

    Pozdrawiam
    Karol

    0
  • #6 19 Gru 2016 14:34
    373522
    Użytkownik usunął konto  
  • #7 19 Gru 2016 15:36
    karol1996
    Poziom 19  

    Witam
    Po pierwsze, używany jest wyświetlacz LED.
    Co do kodów:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Ta wersja się nie kompiluje.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Kompiluje się, ale pomimo zwiększania wartości liczby B, A pozostaje równe 0.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Efekt podobny do tego wyżej.
    Obsługa wyświetlacza LED zrealizowana jest prawidłowo, gdy napiszę B = 123456, to to się ładnie wyświetla.

    Pozdrawiam
    Karol

    0
  • #8 19 Gru 2016 16:19
    373522
    Użytkownik usunął konto  
  • #9 19 Gru 2016 20:05
    karol1996
    Poziom 19  

    Witam

    niveasoft napisał:
    Co to za problem wpisać do Single wartość z palca, kazać mu przepisać do Long i wyświetlić?

    Widać jakiś jest.
    Oto mój cały program:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    W tej sytuacji na wyświetlaczu mam same zera. A gdy zmienna Licz jest typu Long, i nie ma operacji dzielenia, to wszystko działa poprawnie (zmienna Licz przy takiej opcji jest bezpośrednio "przekazywana" do funkcji Led_dec).

    Pozdrawiam,
    Karol

    0
  • #10 19 Gru 2016 20:40
    373522
    Użytkownik usunął konto  
  • #11 19 Gru 2016 21:36
    karol1996
    Poziom 19  

    Witam
    Założenia programu są bardzo proste. Jest to cyfrowy licznik metrów taśmy mogący zliczać w przód i w tył. Sygnałami wejściowymi są sygnały A i B z optycznego enkodera inkrementalnego, które są przesunięte w fazie.
    Wynik ma być prezentowany na sześciocyfrowym wyświetlaczu LED (z multiplexem).
    Rozdzielczość enkodera wynosi 16 imp/obr. Znamy także średnicę rolki (w miejscu styku rolki z taśmą), na której zamontowany będzie enkoder (rolka ta napędzana jest przez przesuwającą się taśmę).

    niveasoft napisał:
    Niezależnie od tego czy naciśnięty jest jakiś przycisk to zmienna ta dzielona jest przez 16. Tak więc nawet gdyby przyciskiem została zwiększona o jeden to i tak zostanie podzielona przez 16. Czyli cały czas będzie mniejsza od jeden. Będzie to 0.xxx coś tam
    Takie 0.1 przepisane do zmiennej nie obsługującej przecinki zawsze będzie zwracało wartość zero.

    Zgadza się, ale teoretycznie do momentu, gdy zmienna osiągnie wartość >=16, a to stanie się już po jednym obrocie enkodera.

    Co do tego "Licz = 0" zamiast "Licz<0" , to tej sytuacji nie przewidziałem, już poprawiam.

    niveasoft napisał:

    Kolejnym błędem jest zapisywanie wartości jakiejś operacji na dwóch typach zmiennych na jeszcze innym.
    Chodzi o dzielenie Long przez 10 i zapisywanie od razu do Byte, albo Mod na Long i zapisywanie do Byte.
    W Helpie możesz przeczytać że poprawny wynik jest gwarantowany tylko kiedy zmienne uczestniczące w działaniu sa tego samego typu.
    Powinieneś to zrobić na tych samych typach rzutując je wcześniej lub później ;)

    Nie twierdzę, iż jest to dobre rozwiązanie, ale póki co działa. Pomyślę nad zmianą tego, gdy reszta programu ruszy. Chyba, że te błędy mają znaczący wpływ na działanie programu. Aczkolwiek, nie wydaje mi się żeby tak było, ponieważ część programu odpowiedzialna za obsługę wyświetlacza LED działa poprawnie.

    Pozdrawiam,
    Karol

    0
  • #12 19 Gru 2016 22:28
    373522
    Użytkownik usunął konto  
  • #13 20 Gru 2016 10:55
    karol1996
    Poziom 19  

    Witam
    Bardzo dziękuję za pomoc oaz ten program.
    Jedyne czego nie rozumiem w programie Kolegi, to zasady działania polecenia Shift. Z tego co zrozumiałem, to chodzi o przesuwanie bitów zmiennej, czyli umożliwia to de facto dzielenie lub możenie liczby. A co w przypadku, gdy chcę pomnożyć moją liczbę np przez 0.74, w tym wypadku byłby to zapis:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    A jak dokonać tego za pomocą plecenia Shift?
    W którą stronę przesuwać i ile razy, oraz dlaczego tak?

    Pozdrawiam,
    Karol

    0
  • #14 20 Gru 2016 11:46
    kamyczek
    Poziom 34  

    Do tego zagadnienia musi kolega zajrzeć do algebry Boole'a zapisać sobie liczby binarnie podpisać pod sobą i zrobić tak jak normalne mnożenie w słupku tyle że na 0 i 1 ...

    0
  • #15 20 Gru 2016 13:02
    373522
    Użytkownik usunął konto