Реални бројеви¶
У приручнику Увод у програмирање у програмском језику C# погледајте поглавља 2.1 и 2.2 (стране 15-21).
Историјски најстарија и највише коришћена врста података који се користе у рачунару су бројеви. Постоји више различитих начина представљања бројева у рачунару, па зато имамо и више типова бројчаних података. Не само то, у многим језицима постоји неколико типова који служе само за представљање целих бројева и неколико типова за представљање реалних бројева. Тиме нам је омогућена рационалнија употреба рачунара, јер избором типа утичемо на брзину и прецизност рачунања и заузеће меморије (неки типови података омогућавају брже, а неки прецизније рачунање; за неке је портебно мање, а за неке више меморије).
Типови реалних бројева:
За рачунање са реалним бројевима (као што је речено у приручнику), користе се три типа податка: float, double и decimal. Сваки од тих типова на нешто другачији начин представља реалне бројеве у рачунару. Ти начини представљања се разликују по томе колико места у меморији рачунара заузимају за један реалан број, колико брзо изводе рачунске операције над тим бројевима, колико велике бројеве могу да представе и колико прецизно могу да их представе. Захваљујући томе, сваки од ових типова је погоднији од осталих за одређену намену.
Тип float
је најкомпактнији од наведених - потребна су само 4 бајта за запис реалног броја у овом формату, али овај формат садржи само 6 до 7 значајних цифара. Обично се користи када у програму користимо много реалних бројева и желимо да рачунања са њима буду што бржа а довољна је ограничена тачност. Типична таква ситуација су трансформације слике, односно разни проблеми рачунарске графике.
Један податак типа double
заузима 8 бајтова, а садржи 16 до 17 значајних цифара. Рачунарска меморија је током низа година постајала све јефтинија и доступнија у великим количинама, па је тип double временом постао тип опште намене, што значи да је он начешће у употреби у разним проблемима у којима се користе реални бројеви. Због тога ћемо ми скоро искључиво користити овај тип за представљање реалних бројва.
Тип decimal
заузима чак 16 бајтова за један податак и садржи 28 до 29 значајних цифара. Типична упортеба овог типа је у финансијским израчунавањима, јер је овај тип додатно прилагођен да се избегну грешке заокруживања, какве нису допуштене у рачунању са новцем.
Шта су значајне цифре?
Значајне цифре су оне које остају када из записа неког броја изоставимо водеће и завршне нуле.
У експоненцијалном запису броја значајне цифре не могу да се изоставе (без заокруживања, односно губитка тачности), а остале могу. Пошто рачунари у суштини баратају експоненцијалним записима реалних бројева, прецизност записа се изражава бројем значајних цифара а не бројем децимала. Ево неколико примера:
¶ број
значајне цифре
број значајних цифара
експоненцијални запис
\(3~000\)
\(3\)
1
\(3 \cdot 10^3\)
\(210\)
\(21\)
2
\(2.1 \cdot 10^2\)
\(27~004\)
\(27004\)
5
\(2.7004 \cdot 10^4\)
\(570.001\)
\(570001\)
6
\(5.70001 \cdot 10^2\)
\(0.01\)
\(1\)
1
\(1 \cdot 10^{-2}\)
\(0.000~030~8\)
\(308\)
3
\(3.08 \cdot 10^{-5}\)
Записивање реалних бројева¶
Начин записивања реалних бројева је скоро сасвим исти без обзира на коришћени тип. Постоје следећи делови у запису реалног броја:
Знак (плус или минус). Знак није обавезан, а ако се не наведе подразумева се плус.
Целобројни део, представљен низом цифара.
Децимална тачка и разломљени део. Ако је разломљени део нула, онда тачка и разломљени део могу да се изоставе.
Слово E или e и експонент, који је означен или неозначен цео број. Ако је експонент нула, овај део (заједно са словом e) такође може да се изостави.
Као што је објашњено у приручнику, експоненти нам и у програмирању (као и у математици) омогућавају скраћени запис бројева са малим бројем значајних цифара. На пример 1e6
значи \(1 \cdot {10}^6 = 1~000~000\), а -2.7e-9
значи \(-2.7 \cdot {10}^{-9} = -0.0000000027\).
Можда сте на калкулаторима видели и записе попут .23
или -.51
. Запис .23
има исто значење као \(0.23\), а запис -.51
исто као \(-0.51\). Другим речима, када је целобројни део једнак 0 и постоји разломљени део, онда се та нула (која представља цели део) може изоставити и тиме уштедети једно место у приказу. Овакав начин писања је распрострањен на енглеском говорном подручју, па је усвојен и у програмским језицима.
Када се узме у обзир све речено, видимо да се једна иста вредност може записати на више начина. На пример, вредност 3 може да се смести у променљиву x типа double на било који од следећих начина:
x = 3;
x = 3.0;
x = +3;
x = +3.0;
x = 3e0;
x = 3.0e0;
x = +3e0;
x = +3.0e0;
x = 3E0;
x = 3.0E0;
x = +3E0;
x = +3.0E0;
x = 0.3e1;
x = .3e1;
x = +0.3e1;
x = +.3e1;
x = 0.03e2;
као и на многе друге. Сви ови „људски” записи се своде на један исти бинарни код, односно машински запис броја 3 као податка типа double. Наравно, број 3 се као податак неког другог типа, на пример float интерно записује (кодира) другачије.
Из овог примера се види да реални бројеви не морају да имају разломљени део, тј. и вредности које су целобројне (у математичком смислу) се могу сместити у променљиву типа double. Када у програмирању кажемо за неку вредност да је реална, то се односи на начин представљања (један од три поменута типа, а подразумева се double), а не на постојање разломљеног дела.
Операције са реалним бројевима¶
Поновимо укратко најважније чињенице.
Основне операције се означавају овим симболима: +
(сабирање), -
(одузимање), *
(множење) и /
(дељење).
Множење и дељење имају међусобно исти приоритет, а редослед рачунања је слева на десно (каже се да су оператори *
и /
лево асоцијативни). Зато, на пример израз 200/4/2
има вредност 25 (а не 100), а израз 200/4*2
има вредност 100 (а не 25).
Сабирање и одузимање такође имају међусобно исти приоритет, али нижи од приоритета множења и дељења (као и у математици). Оператори +
и -
су такође лево асоцијативни, па је нпр. вредност израза 10-4+2
једнака 8.
Заграде се користе на исти начин као у математици. На пример, израз (3+2)*4
има вредност 20, а израз 3+2*4
има вредност 11.
Краћи запис при додељивању у неким ситуацијама
У алгоритмима често вредност неке величине мењамо користећи претходну вредност те величине. На пример, променљиву zbir повећавамо за вредност променљиве broj. У таквим ситуацијама, уобичајени запис
zbir = zbir + broj;
можемо да скратимо овако:
zbir += broj;
Слично важи и за остале операције, а не само за сабирање. Тако уместо x = x - y;
можемо да пишемо x -= y;
, уместо x = x * y;
можемо да пишемо x *= y;
итд.
Додатно, када желимо да вредност неке променљиве x увећамо за 1, осим x = x + 1;
и x += 1;
можемо да пишемо и x++;
.
Слично томе, када желимо да вредност неке променљиве x умањимо за 1, осим x = x - 1;
и x -= 1;
можемо да пишемо и x--;
.
Математичке функције¶
У програмима се могу користити математичке функције као што су Math.Sqrt (квадратни корен), Math.Abs (апсолутна вредност), Math.Min (мањи од два броја) и Math.Max (већи од два броја). Још неке математичке функције су наведене у приручнику, мада их нећемо користити у овом курсу.
Ако још нисте, проучите примере записивања израза дате у приручнику. Нарочито обратите пажњу на то да су при записивању неких израза у прoграмима неопходне заграде иако у математичком запису тих израза нема заграда. На пример:
Израз \(a \over {b-c}\) се у програмирању записује као
a / (b - c)
, а не каоa / b-c
Израз \(a \over {b \over c}\) се у програмирању записује као
a / (b / c)
, а не каоa/b/c
Израз \(\sqrt{|x| + 1}\) се у програмирању записује као
Math.Sqrt(Math.Abs(x)+1)
итд.
Следи квиз у коме ћете потврдити да умете правилно да читате и записујете математичке изразе на језику C#, а затим и задаци у којима ћете такве изразе употребити у програмима.