Goto page Previous 1, 2
Adam GĂłrski
Guest
Mon Feb 27, 2023 1:48 pm
W dniu 26.02.2023 o 01:35, Stachu Chebel pisze:
Quote:
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?
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.F
Guest
Mon Feb 27, 2023 5:18 pm
On Sun, 26 Feb 2023 14:58:50 +0100, Marek wrote:
Quote:
On Sun, 26 Feb 2023 14:15:09 +0100, "Grzegorz Niemirowski"
grzegorz@grzegorz.net> wrote:
Z pierwszego posta. Szukamy takiej wartości Max, która będzie
największą
możliwą dla a.
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.
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.F
Guest
Mon Feb 27, 2023 5:23 pm
On Mon, 27 Feb 2023 12:48:06 +0100, Adam Górski wrote:
Quote:
W dniu 26.02.2023 o 01:35, Stachu Chebel pisze:
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?
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 ).
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.
Adam GĂłrski
Guest
Mon Feb 27, 2023 6:48 pm
W dniu 27.02.2023 o 16:23, J.F pisze:
Quote:
On Mon, 27 Feb 2023 12:48:06 +0100, Adam Górski wrote:
W dniu 26.02.2023 o 01:35, Stachu Chebel pisze:
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?
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 ).
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.
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.F
Guest
Mon Feb 27, 2023 8:08 pm
On Mon, 27 Feb 2023 17:48:44 +0100, Adam Górski wrote:
Quote:
W dniu 27.02.2023 o 16:23, J.F pisze:
On Mon, 27 Feb 2023 12:48:06 +0100, Adam Górski wrote:
W dniu 26.02.2023 o 01:35, Stachu Chebel pisze:
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?
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 ).
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.
Nie mogę sobie tego inaczej wyobrazić skoro po ograniczeniu do jakiegoś
poziomu - działa.
Werjsa druga - osiaga wartosc maksymalną, jakis wjątek sie generuje
i nie wiadomo co program wtedy zrobi ..
J.
Marek
Guest
Mon Feb 27, 2023 8:13 pm
On Mon, 27 Feb 2023 12:48:06 +0100, Adam
Górski<gorskiamalpawpkropkapl@xx> wrote:
Quote:
Jeżeli mijam się z prawdą lub jak to się kiedyś mówiło - kłamię ,
proszę
o korektę.
Nie potrzeba aż takich wartości:
$ cat a.c
#include <stdio.h>
#include <string.h>
int main()
{
int i;
double a;
a=9007199254740990;
for(i=0;i<5;i++)printf("%f\r\n", a++);
}
$ gcc a.c && ./a.out
90071992547409900.000000
90071992547409901.000000
90071992547409902.000000
90071992547409902.000000
90071992547409902.000000
--
Marek
Janusz
Guest
Tue Feb 28, 2023 9:36 am
W dniu 2023-02-26 o 01:35, Stachu Chebel pisze:
Quote:
Używam Kinetis Design Studio. MCU: Arm Cortex-M4. Dokładnie jest to
MK22FN512VLH12. Definiuję zmienną globalną : double a; .
Ja bym dał
unsigned long long
jest liczbą całkowitą.
--
Janusz
Piotr Wyderski
Guest
Sat Mar 04, 2023 2:19 pm
Stachu Chebel wrote:
Quote:
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.
Tak działa reprezentacja zmiennoprzecinkowa, czego się spodziewałeś?
x+y == x dla x dużo większych od y. Ogranicza Cię pojemnośc mantysy,
a nie zakres wykładnika, więc pytanie postawione tak, jak to zrobiłeś,
jest "not even wrong".
Pozdrawiam, Piotr
Piotr Wyderski
Guest
Sat Mar 04, 2023 2:26 pm
Dawid Rutkowski wrote:
Quote:
W sumie też nie wiem ile to będzie MAX_DOUBLE+1.
Zależy od tego 1. MAX_DOUBLE albo +inf.
Quote:
A nie skomentujecie pomysłu robienia sobie licznika z double?
Jak się rozumie, co się robi, to licznik na double jest całkowicie
dopuszczalny. W IEEE754 zachowuje się jak 53-bitowy integer. A potem
przestaje.

Obsesyjnie pilnujesz zakresu, albo się dziwisz.
Quote:
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...
Nie ma się co znęcać nad Kolegą, każdy czegoś nie wie. Choć tutaj te
braki są dość fundamentalne.
Pozdrawiam, Piotr
Goto page Previous 1, 2