Problem z typami w Pascalu


(Chmielus51) #1

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:

1)

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:

2)

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


(Sawyer47) #2

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


(Chmielus51) #3

ja postanowiłem sie uczyc pascal bo chyba jest to podstawa,najpierw sie uczy chodzic a potem biegac(najpierw Pascal potem cos wyzszego:P),


(Xwars) #4

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


(Sawyer47) #5

Ale od razu można zacząć uczyć się chodzić w wygodnych sportowych butach. Zainteresuj się raczej C, C++, Java, Python etc.


(somekind) #6

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.


([alex]) #7

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.


(Chmielus51) #8

for i :=1 to 1.3 step 0.1 do

end

a czemu taka petla nie bedzie dokladna,przeciez w pewnym momencie,a dokladnie po trzek krokack i bedzie sie rownalo 1.3?


(somekind) #9

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.


(Chmielus51) #10

ok,myśle ze powoli to zrozumiem :stuck_out_tongue:


([alex]) #11

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?


(somekind) #12

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


([alex]) #13

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.