Witam,nie dokońca rozumiem o co chodzi w tych typach,to znaczy rozumiem że np typ extended to typ ktory zmiesci duzo bo az 10 bajtow i zmiesci o wiele wieksza liczbe od np single czy double,ale nie rozumiem dlaczego np niektory typy nie chca dzialac w niektorych programach mimo iz uzywam bardzo malutkich liczb,oto dwa przyklady programów:
program Petelka;
var
licznik : real;
begin
for licznik :=1 to 2 {tu wpisuje rozne liczby} do
write(licznik:3);
readln;
end.
gdy zamiast real wpiszye byte lub integer wszystko jest ok,a tak to sie nie chce skompilowac,nastepny przyklad:
program test;
var
liczba : real;
begin
write(‘Podaj liczbe’);
readln(Liczba);
case liczba of
0 : write(‘zero’);
1 : write(‘jeden’);
2 : write(‘dwa’);
else write(‘cos innego’);
end;
end.
również gdy w tym przypadku podaje typ real to jest blad przy kompilacji,a gdy zmienei na byte juz jest ok,kompletnie tego nei czaje smilies/sad.gif
Podawaj błędy kompilatora. W Pascalu nie piszę (tylko w szkole nim męczyli), ale wydaje mi się, że w drugim przypadku w bloku case wymagane są argumenty całkowite (zgaduję, że Pascal sam z siebie tak chętnie jak np. w C++ nie rzutuje typów). Pętla for chyba też wymaga argumentów całkowitych (choć mogę się mylić).
To, że masz nauczyć się chodzić nie znaczy, że musisz do tego stosować drewniane chodaki jak pascal - zerknij na: Java, C#, Python.
A co do samego problemu - liczby zmiennoprzecinkowe nie mogą być używane w konstrukcjach switch/case ani w pętlach for z powodu niedokładność. Weźmy np taką pętle:
for i :=1 to 1.3 step 0.1 do
end
Ze względu na błędy reprezentacji 1.0 + 0.1 + 0.1 +0.1 wcale nie będzie się równać dokładnie 1.3 i pętla może się nigdy nie skończyć.
Może w Pascalu nie (w końcu ten język zawsze był “inny”), ale w C++ czy C# bez problemu.
Przecież pętla wykonuje się, dopóki warunek jest prawdziwy, warunek zazwyczaj dotyczy wartości iteratora i jest w relacji większości/mniejszości z jakąś liczbą. Jak zatem niedokładność liczb zmiennoprzecinkowych może sprawić, że pętla się zawiesi?
Jedyne co niepewne w takiej pętli, to możliwość, że po n iteracji może się okazać, że nadmiary złożyły się na wartość skoku i w ten sposób “zgubimy” jeden przebieg pętli.
Jak zawsze zbyt wąskie myślenie. Nie zawsze iterator pętli jest w relacji większości/mniejszości z jakąś liczbą, czasami może być w relacji nierówny. Właśnie o problemach takiej relacji w połączeniu z liczbami zmiennoprzecinkowymi pisał ucho3000.
W celu stwierdzenia równości dwóch liczb zmiennoprzecinkowych nie używa się operatora równości, lecz sprawdza, czy ich wartość bezwzględna ich różnicy jest mniejsza niż założona niedokładność. Zatem do wprowadzania programu w stan zapętlenia prowadzi nieumiejętność porównania dwóch liczb, a nie użycie liczby zmiennoprzecinkowej jako iteratora pętli.
Dziwne, że z takim doświadczeniem programistycznym tego nie wiesz. Tylko to nie jest powód, żeby mącić w głowach początkującym, Panie Profesorze.
Tak się zastanawiam czy ty w ogóle czytasz odpowiedzi czy tylko kilka wyrazów wychwycisz i już odpowiadasz?
To że nie czytasz w całości to już wiem na 100% ponieważ już trzeci raz tłumacze że nie jestem profesorem i że pomyliłeś mnie z 13tySmok i że on zresztą też nie jest profesorem i też tobie o tym mówił no ale to inny przypadek …
Poczytaj dokładniej o czym chodzi w wątku:
chmielusek pyta - czemu niewolno zmiennoprzecinkowych w paskalu …
ucho3000 odpowiada - bo zarobiono, oraz daje hipotetyczny przykład co by było gdyby było można …
somekind offtopuje - na temat jak należy pisać pętli (nie rozumiejąc tematu bo nie zna paskala, na miejscu moderatorów wlepiłbym ci kolejną nagrodę za offtopowanie)
[alex] tłumaczy somekind’owi o co chodziło w odpowiedzi ucho3000
somekind offtopuje - na temat jak że tajemną wiedzę o liczbach zmiennoprzecinkowych zdobył w ostatnie parę miesięcy. (i jeszcze raz offtopowanie, trzecia i ostatnia nagroda na najbliższy rok przydała by się)
I kto tu mąci w głowach początkującym?
somekind , naprawdę nie rozumiesz czy tylko zgrywasz pajaca?
A ja odpowiadam, że stwierdzenie o niemożności używania takich konstrukcji jest bezsensowne.
Ty potem znowu bezsensownie czepiasz się mnie, tylko po to, żeby się przyczepić, jednocześnie przecząc faktom i powszechnej wiedzy.
Wiem, że nie jesteś profesorem, tylko magistrem. Wiem gdzie pracujesz i czego uczysz. Wiem, że 13tySmok i Ty to jedna i ta sama osoba. I nie tylko ja o tym wiem, więc może Pan by przestał pajacować, Panie B.?
Tak właśnie odpowiadasz, nie myśląc. W paskalu taka konstrukcja jest zabroniona, iteratorem pętli for może być tylko zmienna całkowita. Więc twierdzenie o niemożności używania takich konstrukcji w paskalu jest absolutnie słuszne. Oczywiście ty musisz namącić w głowie ludziom o teoretycznej możności używania podobnych konstrukcji … a tak a propos nie zrozumiałem o który język ci chodziło.
Fajnie :lol: Przy twojej znajomości logiki radzę powstrzymywać się od jakichkolwiek wniosków.