Liczba postów: 32
Liczba wątków: 10
Dołączył: Apr 2019
Reputacja:
1
Mam problem z bardzo prostą funkcją mianowicie kiedy kręcę enkoderem na wyświetlaczu co obrót dodawałem 1 a kiedy osiągnął pewną wartość to się zerwał, mniej więcej tak:
int suma = 0;
suma = suma + 1;
if (suma == 30){
suma = 0;
}
I to działało ale potrzebowałem miec większą rozdzielczość tego licznika więc użyłem float:
float suma = 0;
suma = suma + 0.10;
if (suma == 30.00){
suma = 0.00;
}
Niestety ten zapis nie działa licznik w ogóle się nie zeruje a w drugą stronę zaczyna pokazywać liczby ujemne.
Proszę o pomoc.
Liczba postów: 654
Liczba wątków: 3
Dołączył: Apr 2017
Reputacja:
51
Może suma nie osiąga wartości 30?
Może osiąga, ale w tym czasie program jest gdzie indziej?
Ciężko stwierdzić nie mając schematu i kodu.
Na pewno zadziała: if(suma>30)
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.
Liczba postów: 356
Liczba wątków: 5
Dołączył: Aug 2019
Reputacja:
28
10-09-2019, 11:57
(Ten post był ostatnio modyfikowany: 10-09-2019, 15:47 przez Agregacik.)
Sprawdziłem to na takim przykładzie i stwierdziłem, że program nie działa tak jak pisał autor.
float suma = 0;
float a = 30;
float b = 0.5; //podstawiając za b = 0.5 program działa poprawnie dla b = 0.2 już nie
void setup()
{
Serial.begin (9600);
}
void loop() {
suma = suma + b;
Serial.println ( suma );
if (suma == a) // gdy tu zmieni się warunek na >= to działa poprawnie przy b = 0.1
{
Serial.println ( "suma = 30" );
suma = 0;
}
delay (100);
}
Dlaczego warunek == nie działa poprawnie dla float.
Sprawdziłem
Liczba 0.1 w systemie dwójkowym przyjmuje wartość przybliżoną a wielokrotna suma tej liczby, nie może być nigdy dokładnie 30 i stąd warunek (suma ==30) nigdy nie będzie spełniony. Trzeba dać warunek (suma >=30) lub (suma > 30).
Liczba postów: 2,376
Liczba wątków: 0
Dołączył: Oct 2017
Reputacja:
240
I dlatego wszędzie piszą, by unikać float'ów. W kodzie programu możesz mieć wartości 0-300 z typem np. int czy uint16_t, zastosowanie jest dużo szersze niż float, a gdy potrzeba pokazywać z przecinkiem użyć własną funkcją na kilka linijek.
Na liczby ujemne sam musisz napisać obsługę, że jak mniejsze od 0 to =0, dla typów bez znaku przekręci Ci licznik na koniec zakresu typu, np. 255 dla typu uint8_t.