Wpis z mikrobloga

#programowanie #cpp #arduino #avr

Czy można jakoś zwiększyć dokładność i maksymalną długość zmiennych typu float i double na ATmega328 (arduino uno)?

Aktualnie mam taki fail, że np. 2 + 0,001 = 2,000999

Jeśli się nie da, to zostaje mi pisanie funkcji które rozbiją stringi (czynniki) na mantysę i część całkowitą i ulepią z tego trzeciego (suma) :|
  • 19
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@vifon_pikantny: używając floatów nie da się mieć dokładnych ułamków.

Tak jak w systemie dziesiętnym nie da się zapisać dokładnie 1/3 (zawsze będziesz miał 0,333333(3), tak w systemie binarnym nie da się zapisać dokładnie liczb w stylu 1/5 czy 1/10 czy x/1000 (rozwinięcie binarne jest nieskończone, więc zawsze będzie zaokrąglone w którąś stronę).

Możesz użyć tego modułu http://docs.python.org/2/library/fractions.html albo zaimplementować liczby wymierne samemu (trik polega na pamiętaniu licznika i mianownika jako oddzielne lcizby
  • Odpowiedz
@tell_me_more: no to właśnie ja już napisałem sam funkcje w C++, bierze stringa w którym jest liczba, jedna to co znajdzie do przecinka zapisuje do long long calkowita, druga resztę po przecinku do long long mantysa, teraz jeszcze zrobię kolejne żeby mi sumowało jedno z drugim, w razie czego dodawało coś do jednego/odejmowało z drugiego i tak to pewnie zostanie (mówię o samym dodawaniu póki co, dzielenie zrobię
  • Odpowiedz
@vifon_pikantny: jeśli chcesz wypisać dziesiętne przybliżenie, to tak. Ale masz też możliwość wypisać u góry licznik u dołu mianownik po skróceniu ułamka).

Główna zaleta to to, że błędy w między czasie nie powstają, a tylko przy wyświetlaniu wyniku. Jak byś mnożył liczbę razy 2 i potem dzielił przez 3 i tak w kółko - za każdym razem wzrastałby błąd. A tak masz dokładny wynik i tylko wprowadzasz błąd przy wypisywaniu.
  • Odpowiedz
@tell_me_more: i w ogóle, ja zrozumiałem że mam zrobić tak (słownopseudokod):

- arduino zapisuje wpisaną przeze mnie liczbę do stringa String wpisywana;, tego pominąć nie ma sensu i tak jest aktualnie

- arduino zamienia wpisywana na long long wpisliczba1, od razu odczytuje ile jest cyfr po przecinku i
  • Odpowiedz