Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

c - velicine promenljivih

[es] :: C/C++ programiranje :: c - velicine promenljivih

[ Pregleda: 3233 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

turncoat
Bg, Kg, Va

Član broj: 4063
Poruke: 241
*.InfoSky.Net

Sajt: marko.uskokovic.name


Profil

icon c - velicine promenljivih23.07.2002. u 02:38 - pre 264 meseci
Sledeci kod rucno izracunava minimalnu i maksimalnu vrednost tipa int:

int i,ti;
i=0;ti=1;
while (ti>i) {ti=i;i--;}; /* minimum */
printf ("int: [min,max] = [%d,",ti);
i=1;ti=0;
while (ti<i) {ti=i;i++;}; /* maksimum */
printf ("%d]\n",ti);

Kako ovo da uradim za float (double)? Kojim brojem da delim ili sta drugo da radim da bih dobio FLT_MIN, FLT_MAX i FLT_EPSILON vrednosti iz <float.h>?
"Ako hoćeš da saznaš, pristani na sve"
- Džoni Štulić
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.bitsyu.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: c - velicine promenljivih23.07.2002. u 04:11 - pre 264 meseci
Tvoj kod sadrži previše pretpostavki. Naime, ISO C standard definiše da se prilikom pojave prekoračenja (ono što ti koristiš za određivanje granica opsega celih brojeva) svaka implementacija može odlučiti da različito reaguje. Može izbaciti signal, zamku (trap) i slično. Prema tome, mada ti koristiš ponašanje koje je uobičajeno na ,,našim'' računarima i njima odgovarajućim kompajlerima, takav program neće biti ISO C kompatibilan.

Dalje, kako je veličina svake promenljive, kao i njene osobine utvrđena i poznata i u vreme kompajliranja, jasno je da će tada vrednosti date u INT_MAX, INT_MIN, FLT_MIN... biti odgovarajuće, i nema potrebe za ovakvim ,,trikovima''.

Uostalom, ovako nešto je moguće izvesti i za fp vrednosti, samo moraš posebno ,,napipavati'' granicu za svaku od zasebnih promenljivih u jednoj fp: eksponent, broj značajnih cifara, binarnih naravno, itd.

Drugi pristup ovom problemu je preko upotrebe prekoračenja za brojeve u pokretnom zarezu. Neke implementacije ISO C-a mogu errno postaviti na EDOM ili ERANGE u zavisnosti od toga da li je domen neodgovarajući, ili je vrednost prevelika za opseg vrednosti.

Još bolja varijanta je upotreba ,,floating-point environment <fenv.h>'' (v. ISO C99 7.6). Konkretno, možeš onda koristiti:
Code:
if (fetestexcepts(FE_OVERFLOW)) završi()


Na ovaj način sam uspeo da saznam opseg eksponenta (<2^128), kao i da stignem dovoljno blizu FLT_MAX. Naravno, moji testovi su bili samo približni i na brzinu sklepani, a krenuo sam od a=1, i množio sa 2 (zbog zapisa brojeva). Kao uporedni primer, dobio sam 170141183460469231731687303715884105728.000000 a FLT_MAX je bio 340282346638528859811704183484516925440.000000. Ovo delimično liči na dvostruko manji broj, ali nešto u mojoj ,,logici'' nije valjalo, pa nije bilo moguće dobiti tačnu vrednost. Međutim, ovo su sve ,,trikovi'' i nikakvih garancija nema.

Toliko..
Ona ima definisanu relaciju
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

turncoat
Bg, Kg, Va

Član broj: 4063
Poruke: 241
*.041net.co.yu

Sajt: marko.uskokovic.name


Profil

icon Re: c - velicine promenljivih23.07.2002. u 13:20 - pre 264 meseci
K&R 2nd Ed. Exercise 2-1.
Write a program to determine the ranges of char, short, int, and long variables, both signed and unsigned, by printing appropriate values from standard headers and by direct computation. Harder if you compute them: determine the ranges of the various floating-point types.

> ... nema potrebe za ovakvim ,,trikovima''.
... znam da nema potrebe, al' ja reko' da uradim domaci...
hvala na odgovoru
marko
"Ako hoćeš da saznaš, pristani na sve"
- Džoni Štulić
 
Odgovor na temu

[es] :: C/C++ programiranje :: c - velicine promenljivih

[ Pregleda: 3233 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.