Skocz do zawartości

Float...okreslenie ilosci cyfr po przecinku


farmaceuta

Pomocna odpowiedź

6 minut temu, ethanak napisał:

A skąd będziesz przy odbiorze wiedział do jakiego to najniższego zakresu bitów tę liczbę skonwertowałeś? Dziesięć bitów? Osiem? Szesnaście?

Bede wiedzial ze np. liczba

50.00

123.00

45.50

10.00

100.00

nigdy nie przekrocza tych wartosci wiec moge pomnozyc zeby miec..

5000

12300

4550

1000

10000

I odrazu uwzglednic maksymalny zakres bitow dla kazdej czyli

13

14

13

10

14

Co dami lacznie 64bit/8 = 8 bajtow, czyli zaoszczedzilem 12 bajtow! 

16 minut temu, ethanak napisał:

No - chyba że dla każdej liczby przypisana jest na sztywno ilość bitów (np. pierwsza ma zawsze siedem, druga trzynaście a trzecia szesnaście). 

Dokladnie tak...z gory bede wiedzial ile bitow na kazda liczbe jest mi potrzebne...(kuzwa nie wiem czemu sie uparlem na kombinowanie ile miejsc po przecinku mam zeby mnozyc itp itp...) 

Link do komentarza
Share on other sites

 

17 minut temu, farmaceuta napisał:

z gory bede wiedzial ile bitow na kazda liczbe jest mi potrzebne

Mogłeś od tego zacząć - oszczędziłoby to nam trochę czasu przy czytaniu i próbowaniu pomocy. Następnym razem prosiłbym (i pewnie nie tylko ja) abyś przed zadaniem pytania upewnił się, że wiesz o co pytasz i że na pewno chcesz odpowiedzi na to pytanie a nie na inne.

Link do komentarza
Share on other sites

@ethanak Czytam dziś ten wątek od początku i trochę nie rozumiem dlaczego tak uporczywie wytykasz człowiekowi, że to co wymyśłił jest głupie, niemożliwe i niepraktyczne. Przecież napisał wyraźnie, że chce przesyłać dane przez radio. LoRa nie grzeszy prędkością a jeśli na dodatek chce utrzymać w ryzach pobór energii, to jest oczywiste, że ilość danych (czas on-air) powinna być minimalizowana. OK, rozumiemy już, że być może nie istnieje ogólna metoda dobrej kompresji floatów na coś innego, ale kolega @farmaceuta ma na myśli konkretny przykład. I że dla niego zastąpienie formatu 4-bajtowego floata formatem także zmiennoprzecinkowym z przykładowo 12 bitową mantysą i 4 bitową cechą jest zupełnie wystarczające. Tak, tracimy na precyzji, tracimy na zakresie, ale coś za coś. Pytanie jak to ładnie zrobić? Jeśli przesyłane dane mieszczą się zawsze w zakresie wyznaczonym formatem, to można go wykorzystać w sposób natywny: każdą liczbę wejściową (nazwijmy to formatem 24E8) konwertujemy na format 12E4, pakujemy to do ramki i wysyłamy. Jeśli natomiast czasem liczby wychodzą poza zakres, trzeba przewidzieć jakiś sprytniejszy sposób, np. przesyłanie jednej dodatkowrej liczby (nawet w formacie 12E4 lub int8_t) będącej np. mnożnikiem wszystkich pozostałych. Możliwości jest dużo, bo taka "dedykowana" kompresja jest jednak bardzo zależna od danych.

Ciekawym moim zdaniem jest problem konwersji formatu 24E8 na 12E4. Można to zrobić "łopatologicznie", przechodząc "po drodze" przez reprezentację dziesiętną, ale ma to swoje wady i być może da się to zrobić przez manipulację liczbami w postaci binarnej. Należy zacząć od zapoznania się z konstrukcją standardowego formatu float. Nie, to nie jest tak proste jak się wydaje. Trzeba wiedzieć jak wygląda zero, jak wygląda nadmiar, co to jest normalizacja, NAN i oczywiście jak są reperezentowane mantysa i cecha. Może kolega @farmaceuta mógłby nam tu napisać czego się o tym dowiedział i jak na tym tle widzi format 12E4? Można też podać i porównać zakresy dynamiczne (maksymalana wartość i najbliższa odróżnialna od zera) itp. Na pewno przyda się to w rozważaniach i pomoże podjąć decyzje o ew. rozszerzeniach (ten nieszczęsny wspólny mnożnik np).

  • Pomogłeś! 1
Link do komentarza
Share on other sites

8 minut temu, marek1707 napisał:

dlaczego tak uporczywie wytykasz człowiekowi, że to co wymyśłił jest głupie, niemożliwe i niepraktyczne.

Ależ nic takiego nie robię! To co opisał w ostatnim poście jest akurat całkiem niegłupie, praktyczne i proste w realizacji. Problem był tylko taki, że dowiedziałem się tego dopiero w ostatnim poście, a jak sam stwierdziłeś:

11 minut temu, marek1707 napisał:

być może nie istnieje ogólna metoda dobrej kompresji floatów na coś innego

i właśnie szukanie takiej metody nie byłoby specjalnie mądre (szczególnie nie znając wymagań co do zakresu i koniecznej precyzji).

A jeśli czytałeś wątek od początku spójrz na pytanie w pierwszym poście i porównaj z ostatnim.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Juz z drugiego mogłeś domyślić się o co chodzi, ale dobra, nie ma co bić pianę.

Co myślisz o prostej i ładnej konwersji formatów 4- na 2-bajtowy? Na pewno są do tego biblioteki a pewnie połowa kompilatorów wspiera natywnie format (o wymyślonej przeze mnie nazwie) 12E4. W ogóle czy jest jakaś konwencja nazywania tego, tak jak dla fixed point może to być 16.16 czy 0.16 i od razu wiadomo gdzie jest przecinek i ile bitów jest po jednej i drugiej jego stronie? Skoro w grafice się z tego korzysta się nagminnie, to musi to być wspierane w narzędziach i nie trzeba wyważać otwartych drzwi. Choć z drugiej strony taka działalność (wyważanie) może być niezła nauką zawodu (włamywacza? ślusarza? funkcjonariusza ABW?) więc może warto się nad tym pochylić?

@farmaceuta Czy możesz powiedzieć co to są za dane, znaczy skąd się biorą? Bo jeśli są jakoś ze sobą skorelowane albo stanowią fragment jakiegoś ciągu, to może inna metoda (lepiej dopasowana do charakteru danych) sprawdziłaby się lepiej, np. przesyłanie tylko różnic między nimi np. jak w ADPCM, albo współczyyników jakiegoś filtra który generuje taki sygnał z jakiegoś standardowego wzorca, albo współczynników wielomianu dobrze dopasowanego do charakteru zjawiska itp? Bo to, że jesteś w stanie zrezygnować z pewnych informacji (kompresja stratna) to już wiemy. 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

(edytowany)
1 godzinę temu, marek1707 napisał:

@ethanak Czytam dziś ten wątek od początku i trochę nie rozumiem dlaczego tak uporczywie wytykasz człowiekowi, że to co wymyśłił jest głupie, niemożliwe i niepraktyczne. 

Nie nie...nic sie nie stalo.. Kolega ethanak ma racje...to ja zadalem zle pytanie przez co powstal haos...no tak jakos mi sie ubzduralo ze musze wiedziec ile liczb po przecinku mam zebym wiedzial ile razy mnozyc/dzielic zeby zrekonstrulowac spowrotem do float..lecz mam calkowity wglad na to jakie wartosci maja zmienne...to o co pytalem na poczatku mialo by sens w przypadku kiedy mam np. 40.864268 a za "sekunde" np. 40.480000, mnozac te liczby przez 10 moge uzyskac "duzo lub malo" bitow i "jakims tam" sposobem zapisac to tak zeby po odebraniu mozna bylo odtworzyc ta liczbe. Czyli pakiet moglby miec zmienny rozmiar...ale takie kombinowanie nie jest mi potrzebne.. 

43 minuty temu, marek1707 napisał:

 

@farmaceuta Czy możesz powiedzieć co to są za dane, znaczy skąd się biorą?

Z kontrolera lotu (RC) wolam o zestaw danych przez protokol MAVLink (glownie floaty) przez serial otrzymuje pakiet zlozony powiedzmy z 32 bajtow...w pakiecie zawarte sa zmienne ktorych powiedzmy nie musze przesylac on-air bo moge po drugiej stronie sam je dopisac...oszczedzajac na transferze..dodatkowo "kompresja" i odrazu radiu "lzej"..

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

16 minut temu, SOYER napisał:

@farmaceuta to masz kupę szczęścia bo trafiłeś na elektronika i modelarza👍

To takie plany na przyszlosc zeby powiedzmy do skrzydla wyscigowego dorzucic ardu/gps i miec w MP pozycje na mapie/baterie/moze atl...modelarz odrazu zapyta..."po co chlopie kombinujesz skoro mozesz kupic omnibus f4 z gps np. I masz taki wypas ze ho! ho!!" ...zgadza sie! No ale fakt taki ze lubie czasem sobie "komplikowac"...a jak juz cos dziala to satysfakcja wielka...

Link do komentarza
Share on other sites

1 godzinę temu, marek1707 napisał:

Na pewno są do tego biblioteki a pewnie połowa kompilatorów wspiera natywnie format (o wymyślonej przeze mnie nazwie) 12E4.

Sprawdziłem z ciekawości - gcc wspiera to natywnie podobno tylko na ARM-ach, z wbudowaną konwersją. Na RPi się to ładnie kompiluje po dodaniu -mfp16-format=ieee, na Pico też, natomiast na amd64 np. próba użycia _Float16 kończy się błędem "error: '_Float16' is not supported on this target". Ale...

Rzecz w tym, że w tym przypadku używamy tego formatu wyłącznie do przesyłu danych, po obu stronach mamy konwersję z/do floata. Czyli możemy albo poszukać gotowych bibliotek i wyciągnąć z nich wyłącznie konwersję, albo wyrzeźbić coś samemu.

Teraz pytanie: czy te liczby będą w jakiś sposób dalej przetwarzane, czy tylko ładnie wyświetlone? Bo jeśli tylko wyświetlone, to można pobawić się we własny format (szczególnie, że nie jesteśmy tu ograniczeni wyrównaniem do 8 bitów). Taki przykładowy mieszany format to 12B4D (właśnie taką nazwę wymyśliłem), pozwalałby na zapis jedenastobitowej liczby (czyli 3.5 cyfry, do wyświetlania to powinno wystarczyć bo czwartej cyfry praktycznie nikt nie czyta) i przesunięcia dziesiętnego o +/- 7 miejsc. Można użyć 11B3D, zawsze dwa bity mniej a mamy trzy pełne cyfry - przesunięcie o trzy miejsca dziesiętne. Tu nie ma się co bać układu dziesiętnego, w końcu przecież jakiś powód istnienia typów Decimal i podobnych istnieje. Możliwości jest wiele.

Takie przykładowe rozwiązanie dla zmiennej ilości bitów mogło by wyglądać tak:

  • Zakres 0..100 (typowy dla procentów) - 0xxxxxxx (osiem bitów)
  • Zakres 0..255 (bajt) - 10xxxxxxxx (dziesięć bitów)
  • "Krótki" float - 11xxxxxxxxxxxxxx (szesnaście bitów dla 11B3D, 18 bitów dla 12E4, zależy czego się spodziewamy)

I podobnie. Tyle, że wolałbym nie sugerować takiego rozwiązania komuś, kto pyta ile miejsc po przecinku ma liczba float.

Edytowano przez ethanak
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Rzeczywiście, gdyby te dane przeznaczone byłyby np. tylko do wyświetlania albo zapamiętywania w logu (ale nie do późniejszych obliczeń np. trajektorii) to może wystarczy jeszcze coś prostszego, np. 3 pełne cyfry BCD (12 bitów) i 4 bitowy int na pozycję przecinka. Wtedy na 16 bitach mamy coś łatwo uzyskiwalnego ze zwykłego sprintf'a (konwersja ASCII->BCD i w drugą stronę w odbiorniku jest trywialna), a człowiek i tak więcej nie potrzebuje. Zmienna długość bitowa wydaje się przesadą (zysk kompresji vs. skomplikowanie), ale pomysł ciekawy.

Czy nadajnik LoRa będzie kolejnym linkiem radiowym oprócz RC i FPV na pokładzie? Dlaczego nie możesz tego zapisywać lokalnie do pamięci np. FLASH czy SD?

BTW: Nie podążam za nowinkami i nie wiem co to jest MP ani omnibus-cośtam. Moje modele maja tylko to co niezbędne by cieszyć się nieskrępowanym lataniem. Żadnych autopilotów, stabilizacji, GPSów i całego tego nowoczesnego g*.. Samolot to samolot, mam radochę gdy lata za reką i kręci figury jakich nauczyłem się na nim kilka dni wcześniej. Kopterki też nie latają jakichś kilometrów od bazy i nie robią filmów sąsiadom tylko "przy nodze", no czasem między drzewami. Także w tej dziedzinie proszę do mnie mówić wolno i dużymi literami 🙂 

EDIT: * - wyposażenia

Edytowano przez marek1707
  • Pomogłeś! 1
Link do komentarza
Share on other sites

22 minuty temu, SOYER napisał:

@farmaceuta pisałem o @marek1707 choć i @ethanakmoże się do modelarzy zaliczyć;)

Ze mnie i elektronik i modelarz marny😭

Haha:-) (...wlasnie sie tak zastanawialem czy mowiles o sobie czy o poprzednikach..hehe:-))

21 minut temu, ethanak napisał:

Teraz pytanie: czy te liczby będą w jakiś sposób dalej przetwarzane, czy tylko ładnie wyświetlone?

Zakladajac ze przerobie je tak jak pisalem i po przeslaniu/odebraniu i "odtworzeniu" na float maja byc przekazane do struktury polecenia protokolu MAVLink po czym to polecenie leci przez uart do pc i w aplikacji MP mam wyswietlone parametry wlasnie w tej postaci (float)

21 minut temu, ethanak napisał:

Taki przykładowy mieszany format to 12B4D (właśnie taką nazwę wymyśliłem), pozwalałby na zapis jedenastobitowej liczby (czyli 3.5 cyfry, do wyświetlania to powinno wystarczyć bo czwartej cyfry praktycznie nikt nie czyta) i przesunięcia dziesiętnego o +/- 7 miejsc. Można użyć 11B3D, zawsze dwa bity mniej a mamy trzy pełne cyfry - przesunięcie o trzy miejsca dziesiętne. Tu nie ma się co bać układu dziesiętnego, w końcu przecież jakiś powód istnienia typów Decimal i podobnych istnieje. Możliwości jest wiele.

Jeszcze wiele czasu musi uplynac zanim zrozumiem o czym tu napisales...😢 (poczatkujacy biedak)

23 minuty temu, ethanak napisał:

Tyle, że wolałbym nie sugerować takiego rozwiązania komuś, kto pyta ile miejsc po przecinku ma liczba float.

..."nie kazdy facet z widlami to Zeus...czy tam Neptun" :-)hehe poprostu duzo duzo duzo jeszcze nie rozumiem...nigdy nie mialem doczynienia z niczym innym niz Arduino wiec opornie idzie...caly czas dziekuje serdecznie wszystkim za pomoc!! 🙂

Link do komentarza
Share on other sites

8 minut temu, marek1707 napisał:

Kopterki też nie latają jakichś kilometrów od bazy i nie robią filmów sąsiadom

Toż Ty chłopie całej zabawy się pozbawiasz😂

@farmaceuta co to za wyścigowe skrzydło? Skrzydło i wyścigi to już dziwne powiązanie...;)

Ja tylko zwykłym pioneerkiem latam... Latałem...

Link do komentarza
Share on other sites

20 minut temu, marek1707 napisał:

Dlaczego nie możesz tego zapisywać lokalnie do pamięci np. FLASH czy SD? 

No wlasnie chodzi o to ze to ma "imitowac" autopilota...czyli lecac np. 1km od bazy trace wizje, ale w pc na aplikacji "Mission Planner" (aplikacja pokazujaca doslownie wszytko o obecnym stanie modelu )

dalej mam np. Polozenie geograficzne/wysokosc/odleglosc dopoki nie strace lacza...

Ja juz latalem na ponad 10km i przy takich lotach autopilot/gps etc to cos koniecznego! (choc na szczescie nigdy nie musialem korzystac z uslug "awaryjnych")Wyobraz sobie ze na odleglosci 2km tracisz wizje bez autopilota...nie chce krakac ale raczej juz masz pozamiatane i szanse na odnalezienie modelu nikle...:-(

30 minut temu, marek1707 napisał:

 Nie podążam za nowinkami i nie wiem co to jest MP ani omnibus-cośtam. 

MP (Mission Planner...aplikacja potrzebna do wgrania oprogramowania na autopiloty obslugujace oprogramowanie "ardupilot" do samolotow/skrzydel/lodzi/samochodow/kopterow etc...plus wyswietlanie setek parametrow podczas lotu etc)

Omnibus f4 to poprostu kontroler lotu na stm32 f4 (tani i dosc popularny obecnie)

26 minut temu, SOYER napisał:

 

@farmaceuta co to za wyścigowe skrzydło? Skrzydło i wyścigi to już dziwne powiązanie...;)

To skrzydlo ktore jeszcze nie istnieje...ale juz mam profile przygotowane. Jak sie cieplej zrobi to sie wezme za nie...to taka kopia "Sonic Modell f1" zobacz na yt to zrozumiesz ze to nie jest dziwne powiazanie...:-)hehe 

26 minut temu, ethanak napisał:

Mam nadzieję że z naciskiem na słowo kluczowe "jeszcze" 🙂

Daj Boze zebys mial racje!:-)

 

...(przepraszam za ten modelarski offtop)

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.