Dzonzi Napisano Listopad 22, 2019 Udostępnij Napisano Listopad 22, 2019 (edytowany) 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 Listopad 22, 2019 przez Dzonzi Link do komentarza Share on other sites More sharing options...
ethanak Listopad 22, 2019 Udostępnij Listopad 22, 2019 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? 1 Link do komentarza Share on other sites More sharing options...
Dzonzi Listopad 22, 2019 Autor tematu Udostępnij Listopad 22, 2019 o kurczę to ty jeszcze łatwiej to zrobiłeś. Tak to jest jak się nie programowało od gimnazjum ;/ Link do komentarza Share on other sites More sharing options...
Gieneq Listopad 22, 2019 Udostępnij Listopad 22, 2019 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 More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Zealota Listopad 22, 2019 Udostępnij Listopad 22, 2019 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 More sharing options...
ethanak Listopad 22, 2019 Udostępnij Listopad 22, 2019 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? 2 Link do komentarza Share on other sites More sharing options...
Gieneq Listopad 22, 2019 Udostępnij Listopad 22, 2019 27 minut temu, ethanak napisał: Ale wiesz o tym, że w avr-gcc double i float to to samo? Dobrze wiedzieć 🙂 Link do komentarza Share on other sites More sharing options...
Zealota Listopad 22, 2019 Udostępnij Listopad 22, 2019 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 More sharing options...
ethanak Listopad 22, 2019 Udostępnij Listopad 22, 2019 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ą. 1 Link do komentarza Share on other sites More sharing options...
Dzonzi Listopad 22, 2019 Autor tematu Udostępnij Listopad 22, 2019 Na razie wysunąłem wniosek, że nie ma za dużej różnicy między tym forum, a elektrodą 😅 3 Link do komentarza Share on other sites More sharing options...
Gieneq Listopad 22, 2019 Udostępnij Listopad 22, 2019 @Dzonzi nie jest źle, w piątkowy wieczór może nastroje są trochę luźne, ale atmosfera jest z reguły dobra. 🙂 Niemniej wszelkie sugestie są mile widziane. Link do komentarza Share on other sites More sharing options...
Zealota Listopad 22, 2019 Udostępnij Listopad 22, 2019 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. 1 Link do komentarza Share on other sites More sharing options...
BananWszyscy Listopad 23, 2019 Udostępnij Listopad 23, 2019 (edytowany) Jak już chcecie się tak o wsio kłócić to rpm to liczba a nie ilość bo policzalna, elo 😄 Edytowano Listopad 23, 2019 przez BananWszyscy Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Listopad 23, 2019 Udostępnij Listopad 23, 2019 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 😉 1 Link do komentarza Share on other sites More sharing options...
ethanak Listopad 23, 2019 Udostępnij Listopad 23, 2019 (edytowany) 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 Listopad 24, 2019 przez Treker Usunąłem fragment niezgodny z PPF. 2 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »