Skocz do zawartości

Float...okreslenie ilosci cyfr po przecinku


farmaceuta

Pomocna odpowiedź

21 minut temu, farmaceuta napisał:

Da sie jakos okreslic ilosc liczb po przecinku??

Nie ma tu czegoś takiego jak ilość cyfr (a nie liczb) po przecinku - jest tyle ile sobie chcesz wyświetlić. Typ float nie jest dokładny, czyli te 54.123 to  raczej 54.12299999999999755573298899 (i tak dalej) w reprezentacji dziesiętnej.

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

(edytowany)

Chodzi o to ze bede mial duzo zmiennych typu float ktore maja dosc niski zakres np 35.50...

Gdybym mogl wyciagnac ilosc cyfr po przecinku to moglbym tego float pomnozyc *10/*10...co by mi dalo wynik 3550 ktory sie miesci w zakresie 12 bitow..do tego informacja ile razy mnozylem przez 10 do uzyskania liczby calkowitej, w przykladzie 2 razy czyli zapisuje to powiedzmy w kolejnych 2 bitach i w sumie mam tylko 14 bitow zamiast 32...przesyl bedzie przez lora rf wiec rozmiar pakietow ma duze znaczenie..

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

No ale nie możesz bo coś takiego nie istnieje. Problem w tym, że zmienne float są przechowywane w postaci binarnej, a np. 0.1 nie da się dokładnie w tej postaci zapisać i dla procesora 0.1 i 0.099999999 to to samo. Musisz kombinować inaczej.

  • 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

(edytowany)

Hmmm...tylko jak? 

No nic mi nie swita..a np. float 35.50 rzutuje na int i mam 35, no i teraz odejmujac int od float sprawdzam czy otrzymuje 0 , mnoze i licze ile razy...?

 

Edit: 

Oczywiscie wynik po mnozeniu zamieniam na liczbe calkowita i dopiero wtedy operuje na bitach..

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

Generalnie na dzien dzisiejszy to nie robie nic...ksztalce sie na przyszlosc.

Chodzi o to ze mam np. 10 zmiennych float (40 bajtow) ktore maja takie zakresy liczb ze po pomnozeniu i rzutowaniu na int zajely by juz powiedzmy 15-20 bajtow co przy przesyle przez rf juz roznice robi tym bardziej ze lora jest dosyc wolna jesli chce sie zachowac dobra czulosc odbioru..

Link do komentarza
Share on other sites

10 godzin temu, farmaceuta napisał:

Oo..nawet nie wiedzialem ze takie cos istnieje jak  dwu bajtowy float (poczatkujacy Jestem)...napewno duzo ulatwia mi takie rozwiazaniej lecz dalej moze byc przydatne "przerabianie" bo duzo licz bedzie rowniez z nizszych zakresow jak np 100.0 / 255.0 etc...ktore mozna odchudzic do bajta...

 

Link do komentarza
Share on other sites

Istnieje, ale z ograniczeniami i nieoficjalnie, tylko jako "storage type" i jego obsługa w kompilatorach jest... no, rożna (GCC obsługuje). Pełna obsługa jest zdaje się tylko w kartach graficznych i tego typu zabawkach.

Jeżeli znasz dokładny potrzebny zakres, to zawsze możesz pomnożyć przez coś i zachować jako n-bitowy int, wyrównany do 8. Znaczy w 3 bajtach można upchnąć 2 12bit liczby. Albo 12 po 4bit.

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

Tyle że weź pod uwagę to, że w najprostszym przypadku musisz powiedzieć stronie odbierającej jakiej długości liczbę przesyłasz (8/16 bitów). Czyli co najmniej jeden dodatkowy bit.

Ogólnie kodowanie zmiennej długości może być lekko upierdliwe (vide UTF-8, którego pewnie jakaś połowa z tu obecnych nie rozumie, ew. - to już dla bardziej dociekliwych - protokół MySQL-a).

 

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

14 minut temu, kaworu napisał:

 

Jeżeli znasz dokładny potrzebny zakres, to zawsze możesz pomnożyć przez coś i zachować jako n-bitowy int, wyrównany do 8. Znaczy w 3 bajtach można upchnąć 2 12bit liczby. Albo 12 po 4bit.

Dokladnie o to mi chodzi...zeby maksymalnie "skompresowac" liczby zamiast marnowac 4 bajty na przeslanie np. 125.0 plus informacja ile razy musialem mnozyc zeby wyszla liczba calkowita..zamiana na liczbe calkowita i operacje na bitach zeby wrzucic to do bajtow..

 

17 minut temu, ethanak napisał:

Tyle że weź pod uwagę to, że w najprostszym przypadku musisz powiedzieć stronie odbierającej jakiej długości liczbę przesyłasz (8/16 bitów). Czyli co najmniej jeden dodatkowy bit.

 

Po stronie odbiorczej odpowiednio wyciagam liczby, rzutuje do float (chyba sie da?) i dziele przez 10 tyle ile razy mnozylem i mam spowrotem te powiedzmy 35.50...

No chyba ze pierdoly opowiadam to mozna mi liscia wyplacic..;-) poczatkujacy Jestem...

Dziekuje wam za pomoc! 🙂 jak cos wymyslicie lepszego to slucham bardzo uwaznie..

Link do komentarza
Share on other sites

Przed chwilą, farmaceuta napisał:

odpowiednio wyciagam liczby

Kluczowe słowo: odpowiednio. Skąd będziesz wiedział, czy dane 8 bitów to jeden bajt  ośmiobitowej liczby, czy pierwsza połówka fp16?

2 minuty temu, farmaceuta napisał:

dziele przez 10 tyle ile razy mnozylem

Czyli tak jak zauważył @deshipu - próbujesz zrobić swojego floata tylko gorszego.

4 minuty temu, farmaceuta napisał:

jak cos wymyslicie lepszego to slucham bardzo uwaznie

Trudno wymyślać rozwiązanie jeśli się nie wie do czego ma to służyć (bo nie chodzi tu o "do przesyłania liczb przez lora" tylko co te liczby oznaczają).

Dwa rozwiązania które narzucają się same: wspomniany już fp16 albo 16-bitowy int (ściślej ułamek fixed point). Ewentualnie właśnie jakieś kodowanie zmiennej długości... ale musiałbym wiedzieć co te liczby oznaczają, jaka jest wymagana dokładność i jaki jest zakres każdej z nich... i to nie ogólnie "to temperatura" tylko szczegółowo, np. "temperatura w pomieszczeniu z dokładnością do pół stopnia" lub "temperatura tygla do topienia ołowiu z dokładnością do 5 stopni".

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

3 minuty temu, ethanak napisał:

Kluczowe słowo: odpowiednio. Skąd będziesz wiedział, czy dane 8 bitów to jeden bajt  ośmiobitowej liczby, czy pierwsza połówka fp16?

 

Tutaj musze przeprosic bo zamotalem...w sumie nie jest mi potrzebne "rozgryzienie" ile liczb po przecinku bede mial, bo poprostu bede to wiedzial i moge to na "sztywo" bez problemu uwzglednic...czyli zamieniam float do liczby calkowitej i zapisuje ja do maksymalnie najnizszego zakresu bitow...po odbiorze paczki bajtow poprostu odtwarzam tego float 

Link do komentarza
Share on other sites

1 minutę temu, farmaceuta napisał:

zapisuje ja do maksymalnie najnizszego zakresu bitow

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?

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). Ale w takiej sytuacji każda liczba jest dekodowana niezależnie od pozostałych i może mieć swój prywatny kodek (np. logarytmiczny).

  • Pomogłeś! 1
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.