Thread View: pl.comp.lang.pascal
7 messages
7 total messages
Started by Dawidek
Mon, 10 Aug 2009 16:53
Największa liczba powtórzeń pętli for ...
Author: Dawidek
Date: Mon, 10 Aug 2009 16:53
Date: Mon, 10 Aug 2009 16:53
64 lines
3013 bytes
3013 bytes
Na początku chciałbym wspomnieć , że kompletnie nie znam się na
programowaniu w pascalu.
Mam natomiast 1 program i chciałbym go nieco zmodyfikować .
Aktualnie moje zmienne liczbowe są zapisane jako typ Longword a więc
ich wartość wynosi od 0 do 4294967295 .
Chciałbym ten zakres jednak poszerzyć , znalazłem taką tabelkę :
Nazwa typu Zakres Znaczące cyfry Format
Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 48-bitowy
Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 32-bitowy
Double 1.5 x 10^-309 .. 1.7 x 10^309 15-16 64-bitowy
Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 80-bitowy
Comp -2^63 .. 2^63 -1 19-20 64-bitowy
Currency -922337203685477.5808 .. 922337203685477.5807 19-20 64-
bitowy
zmieniłem longword na double jednak program nie chce się skompilować .
Podejrzewam , że muszę coś jeszcze zrobić aby wszystko ładnie
działało ...
Jeśli ktoś ma jakieś rady byłbym wdzięczny .
oto jak program wgląda aktualnie :
program gbfa;
uses crt;
var w,i,r,dana,orl,blad:longword;
tak:char;
begin
Repeat
clrscr;
writeln('Ile razy podrzucic monete ? ');
readln(dana);
r:=0;
randomize;
for i:=1 to dana do
begin
w:=random(2)+1;
if w mod 2=0 then r:=r+1;
end;
orl:=dana-r;
writeln('Wylosowano ',r,' reszek ');
writeln('Wylosowano ',orl,' orlow ');
writeln(' ');
writeln('Procentowy dzial reszek ',r/dana*100:1:6);
writeln('Procentowy udzial orlow ',orl/dana*100:1:6);
writeln(' ');
writeln('Roznica miedzy reszkami a orlami ',r-orl);
writeln(' ');
writeln('Wartosc bledu ',r/dana*100-orl/dana*100:1:6);
writeln(' ');
writeln('Jeszcze raz ? (t/n) ');
tak:=UpCase(readkey);
until not (tak = 'T');
end.
Re: Największa liczba powtórzeń pętli for ...
Author: Tygrys
Date: Mon, 10 Aug 2009 22:11
Date: Mon, 10 Aug 2009 22:11
30 lines
2249 bytes
2249 bytes
Dawidek pisze: > Na początku chciałbym wspomnieć , że kompletnie nie znam się na > programowaniu w pascalu. > Mam natomiast 1 program i chciałbym go nieco zmodyfikować . > > Aktualnie moje zmienne liczbowe są zapisane jako typ Longword a więc > ich wartość wynosi od 0 do 4294967295 . > > Chciałbym ten zakres jednak poszerzyć , znalazłem taką tabelkę : > > Nazwa typu Zakres Znaczące cyfry Format > Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 48-bitowy > Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 32-bitowy > Double 1.5 x 10^-309 .. 1.7 x 10^309 15-16 64-bitowy > Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 80-bitowy > Comp -2^63 .. 2^63 -1 19-20 64-bitowy > Currency -922337203685477.5808 .. 922337203685477.5807 19-20 64- > bitowy > > > > zmieniłem longword na double jednak program nie chce się skompilować . Zamień pętlę for na while i będzie działać. Licznik w pętli for musi być typu całkowitego, Longword to wszystko co możesz uzyskać. W niektórych implementacjach pascala masz jeszcze typ Int64, jak Twój kompilator to łyka to możesz zmienić Wordy na to. Ale to i tak tylko 2^63 :-) Tygrys
Re: Największa liczba powtórzeń pętli for ...
Author: Tomasz Kaczanowski
Date: Tue, 11 Aug 2009 06:29
Date: Tue, 11 Aug 2009 06:29
36 lines
2350 bytes
2350 bytes
Dawidek pisze: > Na początku chciałbym wspomnieć , że kompletnie nie znam się na > programowaniu w pascalu. > Mam natomiast 1 program i chciałbym go nieco zmodyfikować . > > Aktualnie moje zmienne liczbowe są zapisane jako typ Longword a więc > ich wartość wynosi od 0 do 4294967295 . > > Chciałbym ten zakres jednak poszerzyć , znalazłem taką tabelkę : > > Nazwa typu Zakres Znaczące cyfry Format > Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 48-bitowy > Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 32-bitowy > Double 1.5 x 10^-309 .. 1.7 x 10^309 15-16 64-bitowy > Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 80-bitowy > Comp -2^63 .. 2^63 -1 19-20 64-bitowy > Currency -922337203685477.5808 .. 922337203685477.5807 19-20 64- > bitowy > > > > zmieniłem longword na double jednak program nie chce się skompilować . > > Podejrzewam , że muszę coś jeszcze zrobić aby wszystko ładnie > działało ... Dobrze podejrzewasz. Żeby dobrze działało - musisz sie pouczyć. Typy typu double, real, extended to typy liczb zmiennoprzecinkowych, jeśli nie wiesz co to oznacza, lepiej ich nie używaj, bo za chwilę będziemy mieli kolejne posty ze zdziwieniem, że dodajesz 1 a wartość się nie zmienia, albo jeszcze inne przypadki. Moja rada, najpierw się naucz, potem zmieniaj... -- Kaczus http://kaczus.republika.pl
Re: Największa liczba powtórzeń pętli for ...
Author: Tomasz Kaczanowski
Date: Tue, 11 Aug 2009 06:31
Date: Tue, 11 Aug 2009 06:31
36 lines
2226 bytes
2226 bytes
Tygrys pisze: > Dawidek pisze: >> Na początku chciałbym wspomnieć , że kompletnie nie znam się na >> programowaniu w pascalu. >> Mam natomiast 1 program i chciałbym go nieco zmodyfikować . >> >> Aktualnie moje zmienne liczbowe są zapisane jako typ Longword a więc >> ich wartość wynosi od 0 do 4294967295 . >> >> Chciałbym ten zakres jednak poszerzyć , znalazłem taką tabelkę : >> >> Nazwa typu Zakres Znaczące cyfry Format >> Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 48-bitowy >> Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 32-bitowy >> Double 1.5 x 10^-309 .. 1.7 x 10^309 15-16 64-bitowy >> Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 80-bitowy >> Comp -2^63 .. 2^63 -1 19-20 64-bitowy >> Currency -922337203685477.5808 .. 922337203685477.5807 >> 19-20 64- >> bitowy >> >> >> >> zmieniłem longword na double jednak program nie chce się skompilować . > > Zamień pętlę for na while i będzie działać. Nie będzie działać, a przynajmmniej nie będzie działać poprawnie. Chyba, że ta Twoja rada miała zaszkodzić pytającemu? Ale chyba mamy pomagać, a nie szkodzić! -- Kaczus http://kaczus.republika.pl
Re: Największa liczba powtórzeń pętli for ...
Author: Tygrys
Date: Tue, 11 Aug 2009 14:55
Date: Tue, 11 Aug 2009 14:55
13 lines
1391 bytes
1391 bytes
Tomasz Kaczanowski pisze: > Tygrys pisze: >> Zamień pętlę for na while i będzie działać. > > Nie będzie działać, a przynajmmniej nie będzie działać poprawnie. Chyba, > że ta Twoja rada miała zaszkodzić pytającemu? Ale chyba mamy pomagać, a > nie szkodzić! > > A tak konkretnie, dlaczego ? Tygrys
Re: Największa liczba powtórzeń pętli for ...
Author: Tomasz Kaczanowski
Date: Wed, 12 Aug 2009 06:23
Date: Wed, 12 Aug 2009 06:23
22 lines
1790 bytes
1790 bytes
Tygrys pisze: > Tomasz Kaczanowski pisze: >> Tygrys pisze: > >>> Zamień pętlę for na while i będzie działać. >> >> Nie będzie działać, a przynajmmniej nie będzie działać poprawnie. >> Chyba, że ta Twoja rada miała zaszkodzić pytającemu? Ale chyba mamy >> pomagać, a nie szkodzić! >> >> > A tak konkretnie, dlaczego ? Ze względu na arytmetykę liczb zmiennoprzecinkowych? Może się zdziwić, gdy przy dużych liczbach doda jedynka, a wartość się nie zmieni... Przecież sam napisał, że chodzi mu o większy zakres... Liczby zmiennoprzecinkowe, sa przydatne i warto ich używać w wielu aspektach, ale należy wiedzieć o ich ograniczeniach i robić to z rozmysłem... -- Kaczus http://kaczus.republika.pl
Re: Największa liczba powtórzeń pętli for ...
Author: Tygrys
Date: Wed, 12 Aug 2009 08:14
Date: Wed, 12 Aug 2009 08:14
73 lines
4458 bytes
4458 bytes
Tomasz Kaczanowski pisze: > Tygrys pisze: >> Tomasz Kaczanowski pisze: >>> Tygrys pisze: >> >>>> Zamień pętlę for na while i będzie działać. >>> >>> Nie będzie działać, a przynajmmniej nie będzie działać poprawnie. >>> Chyba, że ta Twoja rada miała zaszkodzić pytającemu? Ale chyba mamy >>> pomagać, a nie szkodzić! >>> >>> >> A tak konkretnie, dlaczego ? > > Ze względu na arytmetykę liczb zmiennoprzecinkowych? Może się zdziwić, > gdy przy dużych liczbach doda jedynka, a wartość się nie zmieni... > Przecież sam napisał, że chodzi mu o większy zakres... Liczby > zmiennoprzecinkowe, sa przydatne i warto ich używać w wielu aspektach, > ale należy wiedzieć o ich ograniczeniach i robić to z rozmysłem... > E no, masz rację, niemniej problemem nie było "do ilu się da to zwiększyć" tylko, że trzeba poszerzyć zakres, a nie chce się kompilować z double - na tak sformułowane pytanie dałem jak sądzę poprawną odpowiedź. :-) Autor nie określił, jak duże liczby chce testować. Napisał tylko, że chce większe niż longword. ZAWSZE będzie jakaś granica wielkości, czy to wynikająca z pojemności zmiennej czy tego co piszesz. :-) Zmienna typu double mimo wszystko zapewnia większy zakres niż longword, a najlepiej na tym wszystkim wypada int64 Przez "będzie działać" rozumiem przejdzie proces kompilacji, jak również spełni wymagania autora by zakres był większy. Longword to mimo wszystko marne 4 miliardy. :-) Więc żeby domknąć ten temat należało by dopowiedzieć: W programie autora można zwiększyć zakres obliczanych wartości, jednakże zmiana typu zmiennej na np. double nie spowoduje zaraz zwiększenia zakresu pętli do 10e309 :-) Natomiast spowoduje zwiększenie tego zakresu do około 10e16, w stosunku do 10e9 którą zapewnia typ longword. --------- Jednym słowem - nie potęga liczby, a ilość cyfr znaczących ma znaczenie. --------- W tym kontekście najlepsze rezultaty da użycie typu int64, lub - w przypadku braku czegoś takiego - comp lub extended, co umożliwi uzyskanie zakresu 10e19, z czego comp będzie bardziej na miejscu jako typ semi-całkowity, a extended może dać zakres minimalnie większy. Natomiast do obliczania takich dużych wartości całkowitych należało by użyć specjalizowanej klasy, niemniej na tym poziomie to bym raczej nie sugerował takich rozwiązań. Jeżeli już, to raczej zrobienie z części programu procedury i wywoływanie jej w pętli i sumowanie rezultatów w liczbach rzeczywistych, co pozwoliło by w najprostszym ujęciu rozszerzyć zakres obliczeń do 10e38. Jakby to było mało, to można ten schemat powielić kilka razy, zwiększając za każdym razem precyzję o te 19 cyfr. Choć, w przypadku takiego rozwiązania lepiej by było pozostać pętlę for i pozostać z licznikiem całkowitym ze względów wydajnościowych - użycie koprocesora do dodawania jedynki to mimo wszystko przerost formy nad treścią. :-) --------- Czy teraz Tomku, czujesz się usatysfakcjonowany wyjaśnieniem dla autora? I, czy gdyby tak czasem chodziło mu o zwiększenie zakresu z 4 miliardów do powiedzmy 4 bilionów poprzednia odpowiedź nie była by wystarczająca ? :-))) Tygrys
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads