Programowanie MCU - największa liczba

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?

Reply to
Stachu Chebel
Loading thread data ...

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"?

Reply to
Dawid Rutkowski

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.

Reply to
J.F

W dniu 26.02.2023 o 01:35, Stachu Chebel pisze:

  1. 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.

Reply to
KLoSS

A co w takiej zmiennej "się zapisze" po operacji (1.7e+307)+1? :-)

Reply to
Marek

A skąd to założenie, że a z definicji nie jest większe od Max?

Reply to
Marek

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.

Reply to
Grzegorz Niemirowski

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.

Reply to
Marek

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 ;-)

Reply to
KLoSS

Chodziło mi raczej o wynik operacji na zmiennej a nie na kartce.

Reply to
Marek

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.

Reply to
KLoSS

Serio nie zrozumiałeś kontekstu pytania?

Reply to
Marek

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...

Reply to
Dawid Rutkowski

Ale ja nie wybrałem MAX_DOUBLE do operacji sumy, zwróć uwagę.

Reply to
Marek

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

Reply to
Dawid Rutkowski

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

Reply to
Adam Górski

Moze nie wiedziec, ale zadeklarował double a. A przynajmniej tak pisze.

A zmienna double nie moze miec większej wartosci, nie da sie.

J.

Reply to
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.

Reply to
J.F

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

Reply to
Adam Górski

Werjsa druga - osiaga wartosc maksymalną, jakis wjątek sie generuje i nie wiadomo co program wtedy zrobi ..

J.

Reply to
J.F

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.