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

[atmega8][bascom] złe obliczanie

Snikers 19 Sie 2009 17:25 1287 7
REKLAMA
  • #1 6910216
    Snikers
    Poziom 24  
    mam problem ze zliczaniem a wlaściwie mnożeniem wartości. kluczowe fragmenty w kodzie niżej:
    
    Start Timer1
     Waitms 500
    Stop Timer1
    A = Timer1 * 0.000167
    Timer1 = 0
    Odo = Odo + A
    Odo1 = Odo1 + A


    niby wszystko OK jednak po jednym impulsie ODO wynosci 0.0001669 a odo2 = 0.000152. blad jest potem powielany razy ilość impulsów

    wszyskie zmienne sa DIMowane jako SINGLE
    gdzie popełniam błąd?
  • REKLAMA
  • REKLAMA
  • #3 6910744
    BoskiDialer
    Poziom 34  
    m.bartczak: Zauważ, że jak by nie patrzeć zmienna A posiada pewną wartość, oba dodawania powinny dać ten sam wynik, problem polega na tym, że wygląda to tak, jak by dodawanie powodowało zmianę jednego z argumentów - tak jak by funkcja realizująca dodawanie nie robiła kopii zmiennej A tylko na niej robiła operacje. Dodatkowo zaokrąglenie 0.0001669 do 0.000152 wygląda jak by zmienna A została podczas dodawania ucięta do 16 bitów po przecinku (floor(0.0001669 * 65536) / 65536 = 0,0001525). Należało by sprawdzić, czy stworzenie kopii zmiennej A przed pierwszym dodawaniem oraz wykorzystanie jej przy drugim zmieni wynik, chociaż podana sytuacja nie powinna mieć nigdy miejsca.
  • REKLAMA
  • #4 6910766
    Snikers
    Poziom 24  
    probowałem przypisać B=A i odo + A oraz odo1 + B wynik ten sam.

    Myslalem ze na wynik ma wplyw wartość przed przecinkiem i wyzerowałem ODO i ODO1, po podaniu 1 impulsu z TIMERA wyniki w odo i odo1 sa rozne, tak jak wyzej opisałem...

    Robiłem kombinacje z B = timer * 167 i A = B / 1000....
    tez ten sam błąd
  • REKLAMA
  • #5 6924256
    Snikers
    Poziom 24  
    Czy można jakoś temu zaradzić? wynik potrzebuje wyświetlić w rozdzielczosci x.x km, przy czym impuls dostaje co 16.7cm
  • #6 6924326
    zumek
    Poziom 39  
    Snikers napisał:
    Czy można jakoś temu zaradzić?...

    Jasne ;)
    Użyj zmiennych typu Long i milimetrów, a po tym to już z góry.
  • #7 6926009
    Snikers
    Poziom 24  
    to się nie pomieszcze, przy 164000km jakbym mial wpisac milimetry.

    ale chyba sobie poradziłem. wykonuje obliczenia raz, natomiast przebieg dzienny obliczam z róznicy miedzy "zerowanym" przebiegiem a totalnym. czyli przy zerowaniu wpisuje wartość totalnego i dystans = total - total gdy zerowalem. w ten sposob mam rozwiazane tez inspekcje.

    troche To połowiczne rozwiązanie bo nadal nie wiem dlaczego wychodziły różne wyniki przy działaniu na tej samej liczbie...
  • #8 6927210
    Konto nie istnieje
    Poziom 1  
REKLAMA