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

BASCOM AVR DEMO - Problemy z obsługą zmiennych typu DOUBLE

Beeper 19 Sie 2006 17:06 2791 7
REKLAMA
  • #1 2931423
    Beeper
    Poziom 12  
    Posty: 29
    Pomógł: 1
    Ocena: 2
    Czy ktoś stosował zmienne typu DOUBLE?
    Próbuje od pewnego czasu i dzieją się dziwne rzeczy

    Dim Aa As Double
    Dim B As Double

    Aa = 5 / 6
    Print Aa

    B = Sin(0.2)
    Print B

    Zmienna Aa zawsze ma wartość zero.
    Zmienna B pokazuje się jako B=0198669330795061
    Przypomina raczej łańcuch niż liczbę (brak przecinka)

    Po kompilacji w raporcie nie wyświetla typu zmiennej (puste pole).

    O co tu chodzi?
  • REKLAMA
  • #2 2931565
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    proponuje lekturę pomocy:
    "Word (two bytes).
    Words are stored as unsigned sixteen-bit binary numbers ranging in value from 0 to 65535. " ;)

    użyj single lub double
  • REKLAMA
  • #3 2931638
    Beeper
    Poziom 12  
    Posty: 29
    Pomógł: 1
    Ocena: 2
    Pomoc czytałem i wynika z niej, że double powinno się zachowywać identycznie jak single w obliczeniach a jest inaczej.

    Najdziwniejsze że funkcje trygonometryczne przynajmniej próbują działać, natomiast zwykłe działania arytmetyczne dają zawsze wynik zero.


    P.S.
    To co cytowałeś o typie 'WORD', to chyba nie bardzo na temat
  • #4 2931749
    Konsul
    Poziom 23  
    Posty: 772
    Pomógł: 37
    Ocena: 21
    Spróbuj najpierw rzutować jeden z argumentów na Double. Dzielenie, które wykonujesz daje wynik typu takiego jaki jest najszerszy typ danych wejściowych czyli w tym wypadku liczba stałoprzecinkowa. Jeśli to c to spróbuj np. Ab=(Double)5/6. Wydaje mi się, że może o to chodzić. Z pewnością w javie i chyba c++ występuje takie zjawisko.
  • REKLAMA
  • #5 2932112
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    heh nawet nie wiem jak to sie stało że widziałem wszedzie word...

    możesz sprobować również bez rzutowania (jawnego) - Aa=5.0/6.0
  • #6 2932285
    leoha
    Poziom 17  
    Posty: 173
    Pomógł: 18
    Ocena: 8
    Sinus policzył dobrze....
    sprobuj 5.0/6.0 wzamian za 5/6
  • REKLAMA
  • Pomocny post
    #7 2932443
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Można zrobić tak:

    $hwstack = 32
    $swstack = 32
    $framesize = 32 
    
    Dim Aa As Double 
    Dim B As Double 
    
    Aa = 5
    Aa = Aa / 6 
    Print Aa 
    
    B = Sin(0.2) 
    Print B 
    
    Do
    Loop
    
    End


    ...i będzie działać !

    Pozdrawiam...
  • #8 2932873
    Beeper
    Poziom 12  
    Posty: 29
    Pomógł: 1
    Ocena: 2
    Jaca jesteś wielki!
    Właśnie przetestowałem kilka wariantów i okazało się, że wszystko działa, pod warukniem że jest dyrektywa $framesize = 32. Gdy parametr zmniejszyć na 16 to kompilator głupieje.

    Jeszcze raz wielkie dzięki i szacunek.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem z obsługą zmiennych typu DOUBLE w BASCOM AVR, gdzie zmienna Aa przy dzieleniu 5/6 zwracała zawsze zero, a zmienna B po wywołaniu funkcji Sin(0.2) wyświetlała nieprawidłową wartość bez przecinka dziesiętnego. Sugerowano, że problem może wynikać z niejawnego rzutowania typów podczas operacji arytmetycznych, zalecając użycie liczb zmiennoprzecinkowych (np. 5.0/6.0) lub jawne rzutowanie na Double. Kluczowym rozwiązaniem okazało się ustawienie dyrektywy $framesize na 32, co umożliwiło poprawne działanie zmiennych typu DOUBLE i funkcji trygonometrycznych. Zmniejszenie tego parametru do 16 powodowało błędy kompilacji i nieprawidłowe wyniki. Dyskusja podkreśla znaczenie odpowiedniej konfiguracji stosu i ramki stosu w BASCOM AVR dla poprawnej obsługi typów zmiennoprzecinkowych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA