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

Kako računar računa?

[es] :: C/C++ programiranje :: Kako računar računa?

[ Pregleda: 3950 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

nnn
Tech Lead
Haxr.io
Beograd

Član broj: 16743
Poruke: 679
*.yubc.net.



+87 Profil

icon Kako računar računa?12.12.2004. u 11:27 - pre 234 meseci
Date su dve realne promenjive a=1000.3 i b=1000.4. odstampati njihove vrednosti i vrednosts razlike c=b-a. Objasniti dobijene rezlutate.

Code:

    #include<stdio.h>
    main()  
        {
         float a=1000.3,b=1000.4,c;
         c=b-a;
         printf("%f%f%f",b,a,c);
         return 0;
        }


Sada pitanje je kako je racunar dosao do resenja?

[Ovu poruku je menjao filmil dana 13.12.2004. u 13:00 GMT+1]
 
Odgovor na temu

CimBac
Fax
Novi Sad

Član broj: 37332
Poruke: 157
*.nspoint.net.

Sajt: irrlicht.sourceforge.net


Profil

icon Re: Kako racunar racuna?13.12.2004. u 01:15 - pre 234 meseci
Iz kog aspekta?
 
Odgovor na temu

nnn
Tech Lead
Haxr.io
Beograd

Član broj: 16743
Poruke: 679
*.yubc.net.



+87 Profil

icon Re: Kako racunar racuna?13.12.2004. u 10:04 - pre 234 meseci
Vajda sta ce kompajler ispisati i kako je dosao do tog rezlutata. Zadatak bi trebao da se uradi u C ili na papiru, ali ja imam samo C++ i meni daje da su promenjive
a=1000.299988 i b=1000.400024 c=0.100037

Code:
// nnnn.cpp : Defines the entry point for the console application.
//

#include <stdio.h> // mod: uklonjeno nepotrebno windows zaglavlje

int main(int argc, char* argv[])
{
    float a=1000.4,b=1000.3,c;
    c=a-b;
    printf("%f      %f     %f",a,b,c);
    return 0;
}

Da li ce i u C biti ovakav isti rezlutat?
Zasto je dao priblizne vrednosti a ne tacne?

Meni je ovaj zadatak dala razredna da ga uradim za danas a ja iskreno nemam posma zasto je to tako.

[Ovu poruku je menjao filmil dana 13.12.2004. u 12:16 GMT+1]
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl.

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Kako racunar racuna?13.12.2004. u 11:09 - pre 234 meseci
Citat:
Da li ce i u C biti ovakav isti rezlutat?
Rezultat zavisi od standarda za floating point aritmetiku kog koristi runtime biblioteka. Jedan preporučeni standard je IEEE745.
Citat:
Zasto je dao priblizne vrednosti a ne tacne?
Ukratko razlog: aritmetika na računarima je uvek približna, dakle nikada ne možeš da dobiješ tačan rezultat. Pitanje je samo koliko je ta greška velika u odnosu na sam broj. Na primer:

Neka ti je dat broj . Računar mora da ga zapamti kao približan broj , gde je greška koja uvek postoji. (ovo je malo uprošćena analiza, a pravu analizu možeš da vidiš recimo ovde).

Nešto slično kao što jednu trećinu ne možeš tačno predstaviti konačnim brojem decimala. Možeš da staviš: npr 0.333, ali to nije tačna vrednost.

Ali, 1000.4 je „okrugao broj“, zašto tu ima problema? Pa zato što računar brojeve pamti u binarnom brojnom sistemu. U njemu, broj 1000.4 ne može da se zapiše sa konačnim brojem (binarnih) decimala. Računar odseče onaj „višak“ i zato kao posledicu dobiješ grešku zaokruživanja.

Primeti da je relativna greška () veoma mala.

Kada oduzmeš dva približna broja, greške zaokruživanja se sabiraju. Ako imaš dva bliska broja, može se desiti da šum usled greške „uguši“ koristan deo. Ovo je poznati fenomen malog efekta na velikom šumu.

Protiv ovog efekta se ništa ne može uraditi, tj. on je uvek prisutan. Algoritme treba praviti tako da se efekat greške može ograničiti.

Primer:

Neka su i dva tačna broja koja se u računaru predstave približnim brojevima i . Tada je:




Njihova razlika je približno:


Sad, ako je malo u odnosu na , možeš da dobiješ veliku relativnu grešku .

U ovom tvom slučaju se upravo to i desilo.


f
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: Kako racunar racuna?13.12.2004. u 11:16 - pre 234 meseci
Posto racunar predstavlja brojeve u binarnom zapisu, nece uvek uspeti da tvoj broj bude uvek predstavljen tacno, sto zavisi od toga koliko je bajtova odvojeno za prikaz realnih brojeva.
Ovo zavisi od kompajlera ali je uglavnom:
4 bajta za float (~7 tacnih cifara)
8 bajtova za double (~15 tacnih cifara)
Probaj da stavis za iste promenljive da budu tipa double i dobices bas ono sto si ocekivao (bar ako ne preteras sa brojem decimala u izlazu)
Code:
/* C Standardizovani komentari */
#include <stdio.h>
#include <stdlib.h>

int main(void){ /* uklonjeni nekorišćeni parametri */
    float a=1000.3,b=1000.4,c;
    double a1=1000.3,b1=1000.4,c1;
    c = b - a;
    c1 = b1 - a1;
    printf("float:\n");
   printf("%f %f %f \n",b,a,c);
   printf("\ndouble:\n");
   printf("%f %f %f \n",b1,a1,c1);
   printf("\ndouble sa 20 decimalnih mesta:\n");
   printf("b1 = %5.20f \na1 = %5.20f \nc1 = %5.20f \n",b1,a1,c1); /* probaj i ovo!! */
   /* mod: uklonjena zavisnost od windowsa: system("PAUSE");    */
   return 0;
}

Dobices nesto ovako:
================
float:
1000.400024 1000.299988 0.100037

double:
1000.400000 1000.300000 0.100000

double sa 20 decimalnih mesta:
b1 = 1000.40000000000000000000
a1 = 1000.30000000000000000000
c1 = 0.10000000000002274000
Mozda ce ti sada biti jasnije, ali je bitno da za realnu aritmetiku stvari ne stoje uvek isto kao na papiru.
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl.

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Kako racunar racuna?13.12.2004. u 12:20 - pre 234 meseci
Evo kako kod mene izgleda:

Code:
filip@cow:~
 $ gcc -Wall -o decimal decimal.c
 filip@cow:~
 $ ./decimal
 float:
 1000.400024 1000.299988 0.100037
 
 double:
 1000.400000 1000.300000 0.100000
 
 double sa 20 decimalnih mesta:
 b1 = 1000.39999999999997726263
 a1 = 1000.29999999999995452526
 c1 = 0.10000000000002273737
 filip@cow:~
 $
 


Očigledno zavisi od biblioteka.

f
 
Odgovor na temu

[es] :: C/C++ programiranje :: Kako računar računa?

[ Pregleda: 3950 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

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