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

Jak uniknąć błędów przy obliczeniach zmiennoprzecinkowych w Bascom?

karol1010 19 Wrz 2006 15:34 1707 5
REKLAMA
  • #1 3035581
    karol1010
    Poziom 21  
    Posty: 570
    Ocena: 16
    :| Witam wszystkich. Mam taki problem bo bascom zle liczy ulamki (mniej wiecej wiem o co chodzi) np. w pewnym momencie zamiast 0.4 pokazuje0.399999999989 oczywiscie uzywam zmiennej single. czy da sie to jakos obejsc w prosty sposob czy bascom jest skazany na takie problemy?

    Bardzo prosze o pomoc.
  • REKLAMA
  • #2 3036199
    Bęben
    Poziom 16  
    Posty: 180
    Pomógł: 12
    Ocena: 13
    A mozesz napisac cos wiecej? np fragment kodu?
    U mnie wszystko jest ok, dziala bez problemow
    chyba ze chodzi ci o zaokraglanie, w tym przypadku do 0.4
  • REKLAMA
  • #3 3036314
    karol1010
    Poziom 21  
    Posty: 570
    Ocena: 16
    Config Portb = Output
    Config Porta = Output
    Config Portc = Input
    Portc = &B11111111
    
    Dim Forr As Word
    Dim Il_zebow As Word
    Dim Kat As Single
    Dim Katy As Long
    Dim Il_krokow As Word
    Dim Z As String * 10
    Il_zebow = 150                                <--przykladowa liczba 150
    Cls
    Cursor Off
    
    Lcd "PODZIELNICA"
    Cls
    Lcd "Ustaw liczbe zebow"
    Locate 2 , 1
    Lcd Il_zebow
    '------------------------------------------------------------------------
    Do
    If Portc.0 = 0 Then
    Gosub Dodaj_zab
    End If
    
    If Portc.1 = 0 Then
    Gosub Odejmij_zab
    End If
    
    If Portc.2 = 0 Then
    Gosub Przeliczenia
    End If
    
    Loop
    
    Dodaj_zab:
    Incr Il_zebow
    'Waitms 200
    Locate 2 , 1
    Lcd Il_zebow
    Return
                                                                  'ustawianie il zebow
    Odejmij_zab:
    Decr Il_zebow
    'Waitms 200
    Locate 2 , 1
    Lcd Il_zebow
    Return
    '-----------------------------------------------------------------------
    
    Przeliczenia:
    Cls
    Kat = 360 / Il_zebow                                        'przeliczanie il krokow
    Z = Fusing(kat , "#.#######")
    Kat = Val(z)
    Il_krokow = Kat * 1000
    Lcd "kroki:" ; Il_krokow           <--tu powinno wyswietlic 2400 a jest 2399
    Lowerline
    Lcd "il.zebow: " ; Il_zebow
    
    Do
    If Portc.3 = 0 Then
    Gosub Praca
    End If
    Loop
    
    '-----------------------------------------------------------------------
    Praca:
    
    
    For Forr = 1 To Il_krokow
    Set Porta.0
    Waitms 1
    Reset Porta.0
    Waitms 1
    Next Forr
    Lcd "kroki:" ; Il_krokow
    Lowerline
    Decr Il_zebow
    Lcd "il.zebow: " ; Il_zebow
    
    
    If Il_zebow = 0 Then
    Cls
    Lcd "KONIEC"
    End If
    Return


    najlepiej zrobic to w symulatorze i widac wtedy. <-- takim znakiem zaznaczylem opisy wazniejsze
  • REKLAMA
  • Pomocny post
    #4 3036331
    Electix
    Poziom 21  
    Posty: 462
    Pomógł: 46
    Ocena: 6
    Siemka!

    Musisz wziąść pod uwagę fakt, iż zmienna single przechowuje wartości zmiennoprzecinkowe ze skończoną dokładnością i to może być zauważalne przy niektórych operacjach na tego typu zmiennych. Poszukaj w helpie od Bascoma i poczytaj o kodowaniu liczb zmiennoprzecinkowych i wszystko Ci się wyjaśni:)

    Pozdrawiam!!

    Widzę że dałeś kod.:)

    Mi się wydaje że powinieneś najpierw pomnożyć wynik z single a potem dopiero go formatować i wyświetlać, być może w tedy unikniesz błędu. Formatując zmienną single ucinasz jej wartość, czyli poprostu wprowadzasz błąd do obliczeń i liczysz dalej. Więc tak jak Ci napisałem. Policz najpierw wszystko i dopiero przy wyświetlaniu wyniku formatuj liczby.

    :)
  • REKLAMA
  • #5 3036689
    karol1010
    Poziom 21  
    Posty: 570
    Ocena: 16
    czyli mam rozumiec ze normalnie takich bledow nie ma w bascomie?

    dzieki wielkie za pomoc.
  • #6 3040230
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    Kat = 360 / Il_zebow 'przeliczanie il krokow 


    Dlaczego konwertujesz dwa razy, skoro masz gotową wartość -sam generujesz niedokładności??

    
    Z = Fusing(kat , "#.#######") 
    
    Kat = Val(z)  ; ta instrukcja jest potrzebna?
    
    Il_krokow = Kat * 1000 ;przenieś nad Z=Fusing
    Lcd "kroki:" ; Il_krokow <--tu powinno wyswietlic 2400 a jest 2399 
    Lowerline 
    Lcd "il.zebow: " ; Il_zebow


    Moderowany przez McRancor:

    Dodałem znaczniki "code" prawda że czytelniej?

REKLAMA