Skocz do zawartości

Brak cyfr po przecinku w działaniu arytmetycznym


Dzonzi

Pomocna odpowiedź

Mam takie coś w arduino:

float f;
f = (2*RPM)/60;

następnie wyświetlam f w LCD i mam wyniki typu 50.00, 51.00 itd Na miejscach po przecinku zawsze są zera. Co jest źle? 

 

Do usunięcia. Rozwiązałem problem.

Edytowano przez Dzonzi
Link do komentarza
Share on other sites

A RPM to jest float czy int? Bo jeśli int to nic dziwnego:

Niech RPM będzie równe 1512. Liczymy:

2 * 1512 =3024;

3024 / 60 = 50; // wynik działania na liczbach całkowitych jest liczba całkowitą

(float)50 = 50.00; // no a ile ma być?

Jeśli chcesz mieć wynik zmiennoprzecinkowy, to i działanie musi być wykonywane na liczbach zmiennoprzecinkowych, np:

f = (2 * RPM) / 60.0;

Czy to jasne?

  • Lubię! 1
Link do komentarza
Share on other sites

Nie wiem jak kompilator radzi sobie z tym w przypadku kodu Arduino, ale czy napisanie zmiennej z zerem to nie jest typ double, który rzutowany jest na float? Zawsze pisałem tego typu zmienne w stylu:

float f = (2 * RPM) / 60.0f;

 

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

No to można jeszcze dorzucić:

float f = (float)RPM * 2 / 60;

Mamy tu klasyczną "promocję do int" dlatego przy obliczeniach należy jawnie rzutować na float.

W mojej opinii zapis 60.0 jest wyjątkowo sztuczny. To jest liczba całkowita, więc powinna być zapisana najprościej czyli bez żadnych przecinków.

Jawne rzutowanie jak pokazałem uczy dobrych nawyków programowani przy pisaniu w C.

Link do komentarza
Share on other sites

7 minut temu, Zealota napisał:

. To jest liczba całkowita

Nie. To jest liczba rzeczywista, dokładniej sześćdziesiąt przecinek zero. Dlaczego niby miałaby być całkowita? Dlaczego RPM ma się zrobić nagle float, jeśli cały czas jest to liczba całkowita?

 

27 minut temu, Gieneq napisał:

czy napisanie zmiennej z zerem to nie jest typ double, który rzutowany jest na float

Ale wiesz o tym, że w avr-gcc double i float to to samo?

  • Lubię! 2
Link do komentarza
Share on other sites

21 minut temu, ethanak napisał:

Nie. To jest liczba rzeczywista, dokładniej sześćdziesiąt przecinek zero. Dlaczego niby miałaby być całkowita?

Liczby całkowite to podzbiór liczb rzeczywistych. Niezależnie ile byś dopisał 0 po przecinku to i tak na koniec jest to liczba całkowita i zarazem rzeczywista. Dlatego nie można powiedzieć, że to TYLKO liczba rzeczywista. Chyba łatwo to udowodnić 🙂 czy 60.0 = 60?. Oczywiście, że się równa zatem skoro 60 jest całkowita i rzeczywista to 60.0 też jest całkowita i rzeczywista.

Nie ma potrzeby rozszerzania zbioru liczb jeśli mamy interesujący nas zakres. To tak jak branie typu int zamiast uint8_t do mnożenia 2 liczb z zakresu 1-5.

Dlatego uważam, że zapis jest sztuczny, bo do prawidłowych obliczeń w języku C jest jawne rzutowanie.

Jak widać z wątku, autor miał zamiar podzielić przez liczbę całkowitą 60 ( pewnie 60 minut stąd liczba całkowita). Dostał wynik niezgodny z oczekiwaniem zaczął kombinować, dopisał przecinek, a za miesiąc nie będzie pamiętał dlaczego. Wiem, że często ten zapis z przecinkami się stosuje, ale jak dla mnie to jakiś wytrych jasny głównie dla kompilatora, dlatego pisałem, że to jakieś sztuczne...

 

 

Link do komentarza
Share on other sites

21 minut temu, Zealota napisał:

Liczby całkowite to podzbiór liczb rzeczywistych.

W matematyce owszem. Ale typ danych int nie jest podzbiorem typu float (przede wszystkim typ nie może być podzbiorem typu bo nie jest zbiorem). A matematyczne liczby rzeczywiste i wartości typu float w informatyce to dwie bardzo, bardzo różne rzeczy.

22 minuty temu, Zealota napisał:

jest to liczba całkowita i zarazem rzeczywista.

Brednie. Albo jest to wartość typu int, albo float. Nie może byc jednocześnie int i float.

23 minuty temu, Zealota napisał:

o jakiś wytrych jasny głównie dla kompilatora

Nie, to normalny sposób pisania programów wykonujących jakieś działania.

Jak widać z wątku, autor miał podzielić ilość impulsów (czyli wartość typowo całkowitą, nie może być pół impulsu) przez interwał (który wcale nie musi być wartością całkowitą). Dostał wartość niezgodną z oczekiwaniem bo nie wziął pod uwagę specyfiki arytmetyki całkowitoliczbowej.

Na razie wysnułeś jakąś teorię spiskową, stwierdziłeś że Ci się przecinki nie podobają, ale nie odpowiedziałeś na pytanie - dlaczego to właśnie RPM (ilość, wartość przeliczalna) ma być wartością rzeczywistą.

  • Lubię! 1
Link do komentarza
Share on other sites

59 minut temu, ethanak napisał:

Brednie. Albo jest to wartość typu int, albo float. Nie może byc jednocześnie int i float.

Pisałem w kontekście matematyki ten cały "wywód" o liczbach. Żeby coś zrobić "w komputerze" najpierw należy rozwiązać problem "poza". Rozwiązaniem problemu był wzór f = (2*rpm)/60 - nie f=(2*rpm)/60.0. Zadaniem programisty/Autora było powiedzenie kompilatorowi co ma zrobić tzn: 

float f = (float)(2*RPM)/60;

Powyższy wzór jest czytelniejszy niż dopisywanie "przecinków", przynajmniej dla mnie 🙂

 

59 minut temu, ethanak napisał:

Na razie wysnułeś jakąś teorię spiskową, stwierdziłeś że Ci się przecinki nie podobają, ale nie odpowiedziałeś na pytanie - dlaczego to właśnie RPM (ilość, wartość przeliczalna) ma być wartością rzeczywistą.

2 godziny temu, Zealota napisał:

60.0 jest wyjątkowo sztuczny. To jest liczba całkowita

Gdzie to niby pisałem o zmiennej RPM?  Ja pisałem o 60,  a Ty o RPM. Tak sobie możemy gadać jeden o jabłkach, a drugi o gruszkach 🙂 Pisałem o tym, że 60 to jest liczba całkowita i bez sensu jest zamienianie jej na float przez dopisywanie jakichś przecinków (60.0)  i a problem można rozwiązać poprzez jawne rzutowanie co być może jest lepszym, czytelniejszym rozwiązaniem. W końcu to wynik f ma być float, a nie zmienne (RPM) i stałe (60) są całkowite.

 

  • Lubię! 1
Link do komentarza
Share on other sites

6 godzin temu, Dzonzi napisał:

Na razie wysunąłem wniosek, że nie ma za dużej różnicy między tym forum, a elektrodą 😅

@Dzonzi forum tworzą użytkownicy (również Ty). Jeśli uważasz, że coś jest niezgodne z polityką przyjaznego forum to zaraportuj wiadomość lub zwróć uwagę publicznie na forum - nie ma się czego obawiać 🙂 Z tego co widzę uzyskałeś odpowiedź na swoje pytanie już na samym początku, więc chyba problem został rozwiązany. Oczywiście, wkradło się tutaj później małe zamieszanie, bo jedna osoba pisała o podejściu "matematycznym", a druga o "programistycznym", ale dyskusja była merytoryczna. Zachęcam przy okazji również Ciebie do stosowania PPF w praktyce, czyli np. do oceny postów, które były pomocne (ikona serca w prawym dolnym rogu wiadomości). Dzięki temu można podziękować bezpośrednio autorowi i (co czasami ważniejsze) wyróżnić daną odpowiedź, aby inni widzieli od razu, że jest ona rozwiązaniem opisywanego problemu. Oczywiście, jeśli nie zgadzasz się z jakąś wypowiedzią to możesz ocenić ją negatywnie. Zachęcam do korzystania z tych opcji 😉

  • Lubię! 1
Link do komentarza
Share on other sites

Dnia 23.11.2019 o 00:37, Zealota napisał:

Gdzie to niby pisałem o zmiennej RPM? 

A tutaj:

Dnia 22.11.2019 o 21:43, Zealota napisał:

No to można jeszcze dorzucić:


float f = (float)RPM * 2 / 60;

 

No... chyba że nie znasz pierwszeństwa operatorów w C ale o to Cię nie nawet nie śmiem podejrzewać.

Dnia 23.11.2019 o 05:36, BananWszyscy napisał:

rpm to liczba a nie ilość bo policzalna

O właśnie,święte słowa! Liczba! Zawsze mi się wydaje że "ilość" to prawidłowe sformułowanie, muszę się wreszcie tego oduczyć.

Dnia 22.11.2019 o 23:26, Dzonzi napisał:

Na razie wysunąłem wniosek, że nie ma za dużej różnicy między tym forum, a elektrodą 😅

Różnica jest zasadnicza. Tutaj najpierw ktoś Ci pomaga, a potem jakieś dwa typy zaczynają się kłócić w temacie jakości owej pomocy, a pomyśl co by było, gdyby faktycznie kolega Z. miał rację a ja napisał jakąś bzdurę? Miałby siedzieć cicho?

Edytowano przez Treker
Usunąłem fragment niezgodny z PPF.
  • Lubię! 2
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.