» »

double

double

upirna ::

Kaj je v c++ double? V knjigi sem prebral, da je to realno število z dvojno natančnostjo, vendar kaj pa je to?

ElectricMan ::

Double: to je realno število z vejicami.

d-mon ::

double uporabi vedno, ko mislis uporabit float, pa bos na varni strani :)
Glej na to kot sodobni float.
[D-mon]

NoUse4AName ::

ce hoces imeti neko spremenljivko za na naprimer PI ali e, ki imata neskoncno stevilo decimalk jih v racunalniku lahko predstavis samo z nekim priblizkom, ki ima doloceno stevilo decimalk, float zasede manj prostora v pomnilniku kot double torej lahko drzi manj decimalk, za to je natancnost manjsa, ker je vecji priblizek. Ce delas nek manjsi program po tem ni problema ce uporabis double, ce pa je program vecji, pa bodi bolj pazljiv.

upirna ::

Spet v knjigi piše, da je char zankovni osnovni podatkovni tip. Zato sem naredil:

char a;
a=fdfdfd;

Pa mi ni hotu compile naredit. Probal sem s številkami, pa mi je izpisalo razne smajlije, pa srčke, črke... Kako torej določiš spremnljivki vrednost v znakih?

red ::

poizkusi z char* a = "abcd" oz char a[] = "abcd"

upirna ::

thank you :)

še eno: ne kapiram v čem je bstvo teh unsiged pa siged. Short pa long je zato, da je velikost večja ali manjša zakaj pa je torej unsiged pa siged?

Za pomoč se zahvaljujem!


p.s: oprostite ker vas nadlegujem s tako za vas bednimi vprašnjami8-)

Zgodovina sprememb…

  • spremenil: upirna ()

c3R4R ::

@upirna
kot v vseh programskih jezikih so spremenljivke tudi v C++ namenjene začasni hrambi različnih vrednosti med delovanjem programa. Tako imamo vedno možnost dostopa do podatkov in njihove obdelave. Kadar želimo ustvariti neko spremenjivko, moramo predvsem določiti tip podatkov, ki jih bo hranila. Če bi npr. potrebovali spremenljivko za hrambo manjših pozitivnih cilih števil, se torej odločimo za tip podatka unsigned short int!

za hrambo večjih podatkov uporabljamo float in double, čeprav zato porabimo več prostora

upirna ::

zakaj unsigned short int in ne samo short int? Saj velikost je ista!!!

c3R4R ::

velikost je ista... oba tipa podatkov sta velika 2 byta! razlika je v obsegu vrednosti, ki gre takole:
short int (manjša cela števila)- od -32768 do +32767 ->(obseg vrednosti)
unsigned short int (manjša pozitivna cela števila)- od 0 do 65535 ->(obseg vrednosti)

Zgodovina sprememb…

  • spremenil: c3R4R ()

rasta ::

int je velik 2 ali 4 bajte (ponavadi 4). se pravi, če je unsigned (nepredznačen) so možne vrednosti od 0 do 24-1, drugače pri signed pa od -22 do 22-1.
float hrani decimalko v 4 bajtih (32 bitov, 1 bit predznaka + 8 bitov odmika eksponenta + ostalo je mantisa), double (dvojni) pa v 4 bajtih (64 bitov), obstaja pa še extended (80 bitov), ki pa v c-ju ni standarden.

d-mon ::

Joj joj joj :)

Ce sem pravilno obvescen je trenutno racunalnik...kao RACUNALNIK...opremljen z 256MB rama ali vec.
Ne kompliciraj...uporabljaj double in long.

Iz mojih lastnih izkusenj ti povem, da je to the way to go.
Ce pogledas COM objekte in njegov _variant_t tip spremenljivke bos zasledil, da int ne obstaja in da float ne obstaja (ce pa ze obstaja pa basicu in drugim 'visjim' jezikom ne bo jasno kateri tip je to)...zato se drzi principa: double in long.

unsigned je predznacenje. Ali bos uporabil eno mesto v binarni kodi za + in - ali bo vedno +. Ce reces unsigned bos sel lahko veliko vec v + ampak ne mores iti pa v -.
Ce bos uporabljal long, teh problemov ne bos imel :)

In se to. Ni vsaka spremenljivka globalna ali staticna. Zato ne pobira rama skozi celotno izvajanje programa.

Ce bi imel funkcijo
void test()
{
long x;
}
Bi x zivel samo v tej funkciji.
Se bolj zanimivo je, ce:
for(int i=0;i<10;i++)
{
long *x;
x = new long;

delete x;
}
spremenljivka zivi samo med new in delete stavkom.
Seveda pa je to cista bedarija kar sem napisal, ker zivljenje spremenljivke x bi itak bilo samo do } (zaklepaja).

Se pravi gori napisano je isto kot ce bi rekel:
for(int i=0;i<10;i++)
{
long x;
}
Spremenljivka zivi samo v for zanki.

In zakaj bi potem gledal kateri tip uporabljas pri enostavnih tipih, ce raje pogledas kje ga rabis in koliko casa zelis da zivi.

Ta problem o katerem razpravljate tu pride v postev sele pri komplexnih tipih.
Samo...ce ze imas kompleksni tip (class, struct)...kako ga pomanjsas npr. tako kot int short??? Ne mores ga, ker je pac tak kot je...edina resitev ti je, da si ogledas zivljensko dobo spremenljivke (koliko casa jo rabis) in jo potem ubijes (new, delete ali pa deklaracija med {}).

Opazujte svoje programe (SVOJE...tiste, kjer uporabljate osnovne tipe in so kompleksni tudi vasi...in kjer ne uporabljate knjiznic za ne vem kaj delat - te ti daljsajo executable datoteko, ker je treba linkat veliko stvari (.lib)).
No se pravi...vasi programi...Opazujte zasedenost pomnilnika. Delajte strukture dolge npri long x[1000000].
Koliko rama kuris? 100MB? Malo morgen ene 2 mega max.

In ce ga 2 mb kuris, kaj se potem sploh ubadas s takimi patetikami kot je uporaba int ali long ali short.
To je ostalo iz stare sole (640k is enough for everyone).

A mislite, da bom reskiral pri kreiranju baze in dal za ID (autonumber) int in bo slo enkrat vse k hudicu, ko bom zafilal vse vrednosti. NE. Raje vzamem bigint in tega problema nimam vec. Ja je res, da bo namesto 4byte na disku zasedel 8bytov. O jojprejoj. Saj imam samo 100GB diska.
Verjemite mi pa to da ko bos enkrat delal z bazo veliko 100GB ali podobno velikostjo (kao...bo treba skrbeti za velikost), vam pa recem, da primarna briga ne bo dolizna ampak security in redundanca.

Se enkrat. Pozabi na osnovne tipe. Izberi tiste z najvecjim obsegom pa je.

Glede tabel in podobnih stvari, kjer se pa pokuri MALO vec rama....Nauci se uporabljat pointerje. Ko bos vedel kaj pointer je, bos tudi vedel kaj poceti z njim in kako si olajsati delo in sparati z ramom, ki ga imas samo 512MB I presume.

Koga zanima kaj je pointer?
[D-mon]

jlpktnst ::

Mi prosim se nekaj razložiš, moderni OSi vsi delajo lepo z pomnilinikom. A sploh še uporabljajo stack posebej (mislim da naj bi to bil memory pod 640 kb, če pa ni me pa ne linčat!), s tem mislim a sploh še recimo win2k ali pa linux loči lowmem od ostalega? Kje je tu poanta pointerjev? Vse kar znam je še "old-school".

kopernik ::

d-mon: Ce sem pravilno obvescen je trenutno racunalnik...kao RACUNALNIK...opremljen z 256MB rama ali vec.


Res je, da je danes racunalnik bolj zmogljiv kot v starih casih. Kar pa ne pomeni, da se lahko
razmetava s prostorom. Vedno je treba predpostaviti najslabsi mozni scenarij - ce lahko
naredis tak program, ki pokuri npr. 500k RAM-a namesto 2MB, je to vsekakor dobrodoslo.
Kajti lahko se namrec zgodi (OS so tako narejeni, da lahko hkrati zaganjajo vec programov),
da tvojemu programu na koncu zmanjka ravno tisti megabajt...in potem dobis out of memory
exception ali kaj podobnega. Zato velja - optimizacija uber alles.
To se posebej velja za produkcijske masine, kjer navadno tece cela mnozica procesov.
Takrat je optimizacija se posebej vazna - obvezno pazite na memory leake, ki se pri
single-user aplikacijah ne opazijo, ko je pa uporabnikov 500 in vec, je pa vsak bajt
pomemben.

Zato se nikakor ne morem strinjati s tem, da po defaultu vzames najvec kar je na
razpolago. To je napaka. Vedno razmisli, za koga programiras oz. kaj je ciljno okolje.
Najboljsi programi so tisti, ki so hitri in zavzamejo najmanj prostora.

Res pa je to, da je lazje vzeti vse kar mores in se vnaprej zavarujes pred neumnimi
napakami. Ampak s tem samo prikrivas slab design - boljsi je razmislek na zacetku, ker
je kasneje (ko npr. naraste stevilo uporabnikov) manj preglavic.

lp

d-mon ::

Se enkrat.
Ko enkrat delas take aplikacije bo zasedenost pomnilnika se vedno manj pomembna kot security in redundancy. Ker ram lahko dokupis, podatke pa ne mores kupit enkrat, kot ti jih hacker pobrise ali pa se v sistemu kaj crkne.
Tako, da optimizacija se vedno pride zadnja na vrsto.

POINTERJI:
Recimo imas tabelo:
CBigData mydata[10000000];
In nekaj delas nad temi podatki. Ti podatki ti v ramu zasedejo recimo 100MB (biti od slike al pa karkoli podobnega).
No in potem se odlocis, da bos delal na TEH podatkih ene kalkulacije. In te spremembe bos delal v neki drugi funkciji.
Ker zaradi optimizacije, da ne bo tvoj program vedno zasedal 100MB je spremenljivka mydata lokalna in zasede spomin samo takrat, ko jo rabis.
No 'predajanje' spremenljivke neki drugi funkciji poteka preko pointerja (by reference) in ne....hmm....brez pointerja (by value).
Ce bi prenesel tabelo by reference, jo preneses s pointerjem.
To naredis:
moja_func(CBigData *tmp) in zasedenost spomina se ti poveca samo za 4byte (naslov v ramu....32bit).
Ce bi prenasal by value (se napisat ne znam :)):
moja_func(CBigData tmp), bi zasedel tvoj program ze 200MB, ker bi u bistvu naredil kopijo obstojece tabele in bi manipuliral s kopijo.
Kar to pomeni je, ce bi naredil kaj sprememb v tabeli bi jih naredil v kopiji in se v originalu ne bi poznalo.
Seveda je ravno obratno pri prenosu by reference.

Ampak...to je osnovna uporaba pointerjev.

Veliko se pointerji uporabljajo, ko se dela z graficnim UI ali pa v Objektno orientiranem programiranju.

Recimo.
Imamo 2 dialoga.
En dialog lahko pozene drug dialog.
Prvi dialog je osnovni (parent) dialog, drugi je pa recimo za izbiro barv. Tisto barvo, ki jo izbremo v drugem dialogu se prvi dialog pobarva z njo.
Ker je OOP imamo 2 classa, po enega za vsak dialog.
V vsakem classu imamo spisane funkcije za manipulacijo z dialogoma.
Kako v drugem dialogu potem 'hendlamo' prvi dialog?
Ker moramo 'hendlat' instanco prvega dialoga, ki ze obstaja (ima naslov v ramu) moramo dobiti ta naslov. Delali bomo na tem naslovu (reference) in ne na kopiji (value).
Se pravi, predno prikazemo drugi dialog z barvam, posredujemo drugemu classu naslov prvega classa (dialoga).

COsnovniDlg dlg;

COsnovniDlg ima deklarirano spremenljivko (class) drugega dialoga:
CColorDlg clr;

In v CColorDlg imamo:
COsnovniDlg *parentDlg;

In preden prikazemo CColorDlg naredimo:
clr.parentDlg = this;

This je pa rezervirana beseda, ki vrne naslov classa v katerem je bila klicana.

Ker to ni prevec nazorno in mogoce s strani OOP malo nefleksibilno, se ponavadi naredi tako, da se poklice class starsa (inicializatorja classa CColorDlg).
V takem primeru deklaracijo COsnovniDlg *parentDlg; spustimo.
To se pa naredi takole (MS VC++)
COsnovniDlg *dlg = (COsnovniDlg *)GetParent(); //cast object

Kakor vidite, bi lahko to klical v neki funkciji v classu CColorDlg in bi ta pointer zivel (4byte) samo v tistem casu, ostali cas bi bil ram vedno sproscen.
Prednost te metode je pa to, da nimamo fizicno zapecene spremenljivke v deklaraciji classa. To pa pomeni to, da je CCOlorDlg lahko uporabljen tudi v drugem projektu.
Veckratno uporabnost classa zvecamo se tako, da bi recimo klicemo funkcijo v CColorDlg iz osnovnega dialoga tako, da ji podamo parameter s katerega dialoga trenutno klicemo funkcijo.
Ker je pa dialogov veliko (COsnovniDlg, CMyDlg,blalblaba)...morate poznati OOP in ce to poznate vidite da je vas dialog (COsnovniDlg) u bisvtu otrok (inheritance classov) CDialog classa in ta je otrok CWnd classa...se bolj podrobno nas ne zanima.
Recimo, da ne bi zeleli biti omejeni spreminjanju barv samo na dialoge, ampak bi zeleli spreminjati barvo se ostalim elementom (button, treecontrol...). Ce bi si zazeleli to bi morali uporabiti CWnd class, ce bi pa zeleli speminjati barvo samo dialogom, potem bi zadostoval CDialog class.
Vidite kako se po lestvici dvigujete in s tem manjsate moznosti za fleksibilnost. Ce bi namesto CDialog uporabili COsnovniDlg, bi lahko spreminjali barvo samo COsnovniDlg tipu dialoga.
Seveda ne moremo iti nekam v neskoncnost s tem, ker najbolj osnovni class iz katerega so izpeljani vsi ostali, se nima recimo niti podprtega spreminjanja barv, ker osnovni osnovni class ni bil namenjen za to.
Samo vsi objekti v windowsih so izpeljani iz CWnd (ta ze podpira spreminjanje barv) in je to najboljsa izbira za izpeljavo.

Vso to 'razsvetljenstvo' :) je pisano z mislimi na Visual C++ od Microsofta in s podporo OOPju (MFC).
Ce tega ne zelite uporabljati potem je na izbiro se Platform SDK in Win32 funkcije, kjer so vsi dialogi in elementi dialogov identificirani z
HWND (handle na window).
Funkcija je pa ::GetParent, ali samo GetParent, ce niste v classu, ki ze podpira GetParent.
HWND GetParent(
HWND hWnd // handle to child window
);

Ce se koga kaj zanima glede tega, lahko vprasa. Bom napisal.
[D-mon]

kopernik ::

To, da mora biti aplikacija varna je itak logicno. Ampak tukaj, kolikor vem, ne tece debata
o security problemih ipd. Ceprav res lahko nadgradis hardware, to vcasih ni tako enostavno.
Primer: kaka velika firma (npr. mobitel) ima serverje, vredne par milijonov evrov(po komadu). Ce tvoja
aplikacija res ni kaj posebnega in pomembnega, potem se bos moral ti prilagoditi ciljni
masini, ker oni te enostavno ne bodo upostevali. Security pa mora tako ali tako biti resen
z dostopnostjo (oz. nedostopnostjo) takih serverjev. Najveckrat(99%) se pride do zaupnih
podatkov zaradi insiderjev (oz. podkupljenih zaposlenih) na firmi.
Navadno je bolj pomembno, da je tvoja aplikacija robustna in stabilna
(oz. da ne poklekne ze pri 10 poizvedbah na sekundo). Zato je
optimizacija se kako pomembna. Ampak tu ne mislim le na long/int dileme ...

lp

c3R4R ::

kva se enim da pisat...:\

upirna ::

ne ga poslu8šat. Vi kar napišite, se vsaj kaj naučim.

kopernik ::

criLin15:
sorry, nisem zelel biti dolgocasen...:\

bom raje manj filozofiral...

lp

c3R4R ::

@jankoFer
to ni blo tebi namenjeno... ampak d-mon-u, ker ma ene dva ful, ful dolga posta.... sej nimam nč proti dolgimi posti sam dolgcajt mi postane k jih berem...
dejte raje zadet bistvo... potem bo veliko več slo-techarjev bralo vaše poste...

lp,

Imortales ::

Hja. Izibra tipa je odvisna od programa. Letos delamo na enih vajah program, ki mora prečitat okoli 300 datotek(slike 512x512), vsebina pa se vpiše v en seznam. Tip spremenljivke v katero se vsebina datotek prečita je short int, sama zadeva pa ram kar pošteno žere. Se pravi pri programih, ki radi paapjo pomnilnik se splača uporabit tipe, ki manj zasedajo.
To sporočilo se bo samo uničilo čez 5 sekund.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C++(bin file) vprašanje

Oddelek: Programiranje
121508 (1386) technolog
»

[Java] Deljenje in ostanek

Oddelek: Programiranje
143113 (2697) pr2501
»

[ C ] floating point not loaded !!?

Oddelek: Programiranje
111562 (1495) Fizikalko
»

tabele in kazalci v Cju

Oddelek: Programiranje
131524 (1355) Ezekiel
»

[C/C++] unsigned long lala = -1;

Oddelek: Programiranje
51175 (1134) Vesoljc

Več podobnih tem