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

Precyzja operacji na float w Keil dla `51 - jak ustawić?

pawel_5 10 Kwi 2008 23:12 1307 12
  • #1 5017011
    pawel_5
    Poziom 13  
    Posty: 131
    Ocena: 1
    Panowie!
    Małe pytanko, jak odbywa się zgłaszanie przybliżenia liczby float?
    Np. uzywając funkcji printf zgłasza się to jeśli dobrze mi wiadomo w następujący sposób: %3.2f - dwa miejsca po przecinku.
    Natomiast ja chciałbym aby operacje na wcześniej zgłoszonej liczbie float odbywały sie na ścisle określonej precyzji. Chciałbym uzyskać wynik np. do dwóch miejsc po przecinku.
    Przepraszam jeśli pytanie jest zbyt banalne, proszę mi wybaczyć, przygodę z C zacząłem niedawno dla `51.
    Pozdrawiam i dzieki serdeczne!
  • #2 5017058
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    Kolego napisz jasniej o co Ci chodzi bo czytam piaty raz i nie kapuje...

    BF
  • #4 5019257
    pawel_5
    Poziom 13  
    Posty: 131
    Ocena: 1
    Może mały przykładzik:
    
    long a,b;
    float srednia1;
    
    
    
    srednia1 = b / a   // a to liczba z zakresu 0-16777215
                              // b to liczba z zakresu 0-16777215 - przy czym b<a
                              // srednia1 po podzieleniu b przez a ma miec postac 0.00
  • #5 5019788
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    No przeciez crazy_phisic pokazal Ci dokladnie co masz zrobic?!
    Jezeli nie o to Ci chodzi to napisz dokladnie do czego chcesz tej liczby uzyc bo na razie ta elektrodowa komunikacja przypomina taniec we mgle...

    BF
  • #6 5019885
    pawel_5
    Poziom 13  
    Posty: 131
    Ocena: 1
    Bigfoot ... może trochę uprzejmości i wyrozumiałości? Jeżeli nie chcesz pomóc, nie zabieraj głosu.


    - zastanawiam się w którym miejscu w przykładzie podanym przeze mnie wyżej należy umieścić tą deklarację?

    Dzieki serdeczne!
  • #7 5019976
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    http://www.kaniup.agh.edu.pl/ftp/C_C++/C_Printf.pdf

    :arrow: pawel_5
    Cytat:
    zastanawiam się w którym miejscu w przykładzie podanym przeze mnie wyżej należy umieścić tą deklarację?

    Z deklaracją ma to tyle wspólnego co biedronka z konstrukcją rakiet ;).
  • #8 5020154
    pawel_5
    Poziom 13  
    Posty: 131
    Ocena: 1
    Jak zwał tak zwał....w zasadzie na upartego można by biedronkę wmieszać w budowę rakiety ;)
    Nie chcę używać printf. Chciałbym tylko aby liczba została zaokrąglona do drugiego miejsca po przecinku w miejscu w którym uznam za właściwy. Czy jest na to jakiś sposób?
  • #9 5020301
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    pawel_5 napisał:
    Czy jest na to jakiś sposób?


    Tak, zrobić to "ręcznie" albo zrezygnować z float i zrobić to na dwóch bajtach co dla '51 jest lepszym rozwiązaniem. :wink:.
  • #10 5020375
    pawel_5
    Poziom 13  
    Posty: 131
    Ocena: 1
    Tylko, że liczba na której bedą wykonywane obliczenia bedzie sięgała conajmniej piątego miejsca po przecinku. Po ostatecznych obliczeniach będzie zaokrąglona do dwóch co najwyżej trzech miejsc po przecinku po czym znowu zostanie poddana kilku operacjom arytmetycznym a następnie odpowiednio wyświetlona. Recznie nie zabardzo przychodzi mi do głowy algorytm?
  • #11 5020486
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    pawel_5 napisał:
    Bigfoot ... może trochę uprzejmości i wyrozumiałości? Jeżeli nie chcesz pomóc, nie zabieraj głosu.

    Ja chce pomoc i z checia pomoge! Na poczatku naprawde nie przyszlo mi do glowy, ze piszac o formatowaniu %f nie wiesz jak go uzyc w printf. Mam nadzieje, ze sie nie obraziles tym "tancem we mgle" :) Napisz dokladnie co chesz zrobic z ta zaokraglona liczba. Jezeli chcesz ja wyswietlac np na wyswietlaczu to uzyj funkcji sprintf (kuzynka printf). Samego zaokraglenia uzyj na samym koncu, po wszystkich obliczeniach. Zeby dokladnie Ci pomoc musisz napisac co dalej z ta liczba chcesz zrobic.

    BF
  • #12 5020531
    pawel_5
    Poziom 13  
    Posty: 131
    Ocena: 1
    Nie chcę używać ani printf ani sprintf dlatego, że już mam przez siebie napisany podprogram wyświetlający. Moze posłuże się przykładem:

    1443 / 2230 = 0,647085201793
    0,647085201793 * 25 * 60 = 776,502242152466
    zaokrąglenie----> 776,502
    776,502 * 1000 = 776502
    776502 to liczba gotowa do wyświetlenia oczywiście programowo dodany przecinek w odpowiednie miejsce na wyświetlaczu.
  • #13 5022353
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    Dla mnie Twoj sposob jest przekombinowany. Masz 776.502, mnozysz przez 1000 a dodajesz przecinek... Funkcja sprintf sluzy wlasnie do zamiany np float do postaci ASCII, ktora potem mozesz wyslac na wyswietlacz. Chyba, ze Twoja funkcja wyswietlajaca dziala na wartosciach typu int. Ale tego nie wiemy bo nie pokazales tej funkcji.

    BF

Podsumowanie tematu

✨ Dyskusja dotyczy precyzji operacji na liczbach typu float w środowisku Keil dla mikrokontrolera rodziny `51. Autor pyta, jak wymusić obliczenia z określoną precyzją, np. do dwóch miejsc po przecinku, a nie tylko formatowanie wyjścia za pomocą printf (np. %.2f). Wyjaśniono, że formatowanie w printf nie wpływa na precyzję obliczeń, a jedynie na sposób wyświetlania wartości. Wskazano, że zaokrąglanie float do określonej liczby miejsc po przecinku podczas obliczeń wymaga implementacji własnego algorytmu lub rezygnacji z typu float na rzecz arytmetyki całkowitej (fixed-point), co jest często lepszym rozwiązaniem na `51. Autor podaje przykład operacji arytmetycznych na float z wieloma miejscami po przecinku i chęć zaokrąglenia wyniku przed dalszymi obliczeniami i wyświetleniem. Sugerowano użycie funkcji sprintf do konwersji na tekst, ale autor ma własny podprogram wyświetlający i nie chce korzystać z printf/sprintf. Wskazano, że zaokrąglenie można wykonać ręcznie, np. mnożąc przez potęgę 10, zaokrąglając do int, a następnie dzieląc, lub stosując arytmetykę całkowitą. Podkreślono, że float w `51 ma ograniczoną precyzję i często lepiej stosować fixed-point dla kontroli dokładności.
Wygenerowane przez model językowy.
REKLAMA