🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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 ...
#92881
Author: Dawidek
Date: Mon, 10 Aug 2009 16:53
64 lines
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 ...
#92882
Author: Tygrys
Date: Mon, 10 Aug 2009 22:11
30 lines
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 ...
#92887
Author: Tomasz Kaczanowski
Date: Tue, 11 Aug 2009 06:29
36 lines
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 ...
#92883
Author: Tomasz Kaczanowski
Date: Tue, 11 Aug 2009 06:31
36 lines
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 ...
#92884
Author: Tygrys
Date: Tue, 11 Aug 2009 14:55
13 lines
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 ...
#92885
Author: Tomasz Kaczanowski
Date: Wed, 12 Aug 2009 06:23
22 lines
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 ...
#92886
Author: Tygrys
Date: Wed, 12 Aug 2009 08:14
73 lines
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