logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

karol1996 18 Gru 2016 23:25 2037 14
  • #1 16136378
    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: VB.net
    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
  • #2 16136446
    Konto nie istnieje
    Konto nie istnieje  
  • #3 16136706
    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
  • #4 16136870
    kamyczek
    Poziom 38  
    Masz takie coś jeszcze:
    Kod: VB.net
    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 .
  • #5 16137126
    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
  • #6 16137181
    Konto nie istnieje
    Konto nie istnieje  
  • #7 16137283
    karol1996
    Poziom 19  
    Witam
    Po pierwsze, używany jest wyświetlacz LED.
    Co do kodów:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Ta wersja się nie kompiluje.

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


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

    Kod: VB.net
    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
  • #8 16137364
    Konto nie istnieje
    Konto nie istnieje  
  • #9 16137816
    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: VB.net
    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
  • #10 16137916
    Konto nie istnieje
    Konto nie istnieje  
  • #11 16138045
    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
  • #12 16138185
    Konto nie istnieje
    Konto nie istnieje  
  • #13 16138797
    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: VB.net
    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
  • #14 16138854
    kamyczek
    Poziom 38  
    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 ...
  • #15 16138948
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA