Używam Kinetis Design Studio. MCU: Arm Cortex-M4. Dokładnie jest to MK22FN512VLH12. Definiuję zmienną globalną : double a; . W przerwaniu zmienna jest inkrementowana: a=a+Byle_Co; Program działa poprawnie, ale do pewnego momentu czasowego. W pewnym momencie idzie "w maliny". Sekwencja:
a=a+Byle_Co; if(a>Max)a=0;
rozwiązuje problem. Ile maksymalnie mogę ustawić Max? Za cholerę nie mogę się doszukać maksymalnej wartości zmiennej typu "double" dla mojego MCU. Eksperymentalnie ustawiłem Max=1e6. Program nie idzie w maliny. Jakie może być największe Max?
Didn't find your answer? Ask the community — no account required.
D
Dawid Rutkowski
niedziela, 26 lutego 2023 o 01:35:04 UTC+1 Stachu Chebel napisał(a):
Już lepiej napisz, ile wynosi Byle_co. A długo musisz czekać na to "pójście w maliny"?
J
J.F
Double na ARM? Nie wiem, ale jakies horendalnie duzo. DBL_MAX
1.7e+308 ?
formatting link
Raczej niemozliwe, zebys tyle zrobil w petli ... ile wynosi Byle_co?
Ale jeszcze czemu program idzie w maliny - wyjatek jakis ?
J.
K
KLoSS
W dniu 26.02.2023 o 01:35, Stachu Chebel pisze:
Double jest z definicji zmiennoprzecinkowe z określoną dokładnością mantysy a dokładna definicja jest zależna m.im. od języka i kompilatora i może być różna Np .w c++ jest zdefiniowana tak:
formatting link
czyli zgodnie z "IEEE-754 binary64 format" co daje jako max jakieś
1.79769e+308
Nie sądzę aby to było problemem. Prędzej ilość miejsc znaczących mantysy bo jeśli Byle_Co jest stałe to po określonej ilości iteracji 'a' przestanie nam się zwiększać.
I jeszcze wielokrotne inkrementowanie liczb zmiennoprzecinkowych nie jest dobrym pomysłem bo błąd zaokrągleń będzie nam narastał i przy odpowiednio dużych iteracjach błąd może być większy niż Byle_Co.
I na koniec konstrukcja
jest zupełnie bez sensu. Bo skoro z definicji 'a' nie może być większe niż Max to cały ten if nie zadziała nigdy prawidłowo.
Proponuję najpierw poczytać podstawy matematyki binarnej i jej ograniczenia.
Nie znam problemu ale zamiast double w przypadku inkrementacji zazwyczaj lepiej użyć zmiennej stałoprzecinkowej.
M
Marek
A co w takiej zmiennej "się zapisze" po operacji (1.7e+307)+1? :-)
M
Marek
A skąd to założenie, że a z definicji nie jest większe od Max?
G
Grzegorz Niemirowski
Marek snipped-for-privacy@fakeemail.com napisał(a):
Z pierwszego posta. Szukamy takiej wartości Max, która będzie największą możliwą dla a.
M
Marek
Ale dlaczego zakladasz że Twórca nie wie co pisze? To chyba jasne że autor zrobił skrót myślowy czyli " Max" to wartość graniczna lokalna (na potrzeby algorytmu) a nie max możliwej (absolutna) dla a.
K
KLoSS
W dniu 26.02.2023 o 11:19, Marek pisze:
Sprowadź te liczby do wspólnego wykładnika to zobaczysz co się "zapisze".
Najlepiej rozpisz sobie to na kartce, dużej kartce ;-)
M
Marek
Chodziło mi raczej o wynik operacji na zmiennej a nie na kartce.
K
KLoSS
W dniu 26.02.2023 o 19:06, Marek pisze:
"Zmienna" to tylko miejsce do zapamiętywania wartości bez znaczenia czy na kartce, czy kamyki na piasku, czy elektrony w krzemie.
Jak chcesz tylko wiedzieć jaki będzie wynik a kartka zła to sprawdź na MCU, szybciej byś sprawdził niż zadał zapytał na grupie i czekał na odpowiedź.
A jak chcesz wiedzieć dlaczego tak, to bez kartki się nie obejdzie.
M
Marek
Serio nie zrozumiałeś kontekstu pytania?
D
Dawid Rutkowski
niedziela, 26 lutego 2023 o 22:01:39 UTC+1 Marek napisał(a):
Hmm, a odpowiedź ma być "tyle samo"? Czy jakaś nieskończoność? W sumie też nie wiem ile to będzie MAX_DOUBLE+1. Trzeba w IEEE-854 sprawdzić.
Hmm, a czy w C można: double d=9; d++; ?
A nie skomentujecie pomysłu robienia sobie licznika z double? I założenia, że "zmiennoprzecinkowa"nkażdą wartość przyjmie? W Bajtku był taki cykl "programować może każdy". Może i prawda, ale "zaprogramować" już niekoniecznie...
M
Marek
Ale ja nie wybrałem MAX_DOUBLE do operacji sumy, zwróć uwagę.
D
Dawid Rutkowski
poniedziałek, 27 lutego 2023 o 09:55:11 UTC+1 Marek napisał(a):
No racja, to MAX_DOUBLE czy też DBL_MAX to jest minimum 1.79769e+308
A
Adam Górski
W dniu 26.02.2023 o 01:35, Stachu Chebel pisze:
Problemem jest , że double jest zmiennoprzecinkowe i jak każdy typ posiada swoją rozdzielczość.
W przypadku a=a+Byle_co; w pewnym momencie osiągnie wartość stacjonarną i nie będzie się już zwiększać bo Byle_Co będzie poniżej błędu pojedynczego bitu dla formatu double ( no chyba że się przekręci ).
Taki przykład:
Czy double i =
100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0 da się zwiększać o
0,000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ? Nie. Z tego samego powodu z którego int64_t nie da się zwiększać o 0,1.
Jeżeli chcesz żeby to działało to np :
int64_t a = a + Byle_co; gdzie Byle_co >= 1 żeby miało sens.
double b = (double) a * CONST_VALUE;
Poza tym używanie double w przerwaniu to niekoniecznie dobry pomysł , ale to już inna historia.
Jeżeli mijam się z prawdą lub jak to się kiedyś mówiło - kłamię , proszę o korektę.
Pozdrawiam
Adam Górski
J
J.F
Moze nie wiedziec, ale zadeklarował double a. A przynajmniej tak pisze.
A zmienna double nie moze miec większej wartosci, nie da sie.
J.
J
J.F
Sugerujesz ze "program idzie w maliny" oznacza, tzn jest skutkiem tego, ze przestala sie zmienna zwiekszac? Moze i tak.
Zanim sie to osiągnie, to bedzie jeszcze etap, ze zwiększa sie o nieco inną wartosc, bo jest to Byle_co zaokrąglane do aktualnej rodzielczosci.
Ale tak czy inaczej to nastąpi po bardzo wielu dodawaniach, kolega by chyba nie doczekal.
J.
A
Adam Górski
Nie mogę sobie tego inaczej wyobrazić skoro po ograniczeniu do jakiegoś poziomu - działa.
Chętnie usłyszałbym inny powód.
Pozdrawiam
Adam Górski
J
J.F
Werjsa druga - osiaga wartosc maksymalną, jakis wjątek sie generuje i nie wiadomo co program wtedy zrobi ..
J.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.