Разлика између лебдеће и двоструке - коју да користим?

(Напомена: Овај чланак претпоставља да читаоци знају о основама рачунарске науке)

Многи новопечени програмери / студенти који су уписани у рачунарске науке постављају често постављана питања која су релевантна за одређену област унутар рачунарске науке коју студирају. Већина почетних курсева започиње темама бројевног система који се користи у савременим рачунарима, укључујући и бинарни, децималан, октал и хексадецимални систем. Ово су формати бројева рачунара који су унутрашњи прикази нумеричких вредности у рачунарима (или калкулаторима и било којој другој врсти дигиталних рачунара). Ове вредности се чувају као „групирање битова“.

Као што знамо рачунари представљају податке у скуповима бинарних цифара (тј. У комбинацији и , као такав, 1111 представља 15 у децималном систему) има смисла подучавати о различитим форматима бројева који се користе за представљање динамичког распона вриједности, јер они чине основне блокове за обрачун / обраду бројева у било којој врсти операције. Једном када је систем бројева дефинисан у учионици (често лоше), ученици ће доћи у искушење да пређу на различите формате бројева унутар исте врсте (тј.., аритметика са зарезом) који имају одређену прецизност и распон броја. Стога су приморани да науче нијансе између појединих врста. Постоје две најчешће коришћене врсте података Пловак и Двокреветна, и док циљају исте потребе (тј., аритметика са зарезом), постоји прилично велика разлика у њиховој унутрашњој заступљености и укупном утицају на прорачун у програму. Жао је што многи програмери пропуштају нијансе између Флат и Доубле типова података, и на крају их злоупотребљавају на местима где их не би требало прво користити. Коначно резултира погрешним прорачунима у осталим деловима програма.

У овом чланку ћу вам рећи разлику између флоат и доубле код примјера кода у програмском језику Ц. Хајде да почнемо!

Флоат вс Доубле ... Који је договор?

Флоат и Доубле су репрезентација података која се користи за аритметичке операције с плутајућом тачком. Размислите о децималним бројевима које израчунавате у математици, као што су, 20.123, 16.23, 10.2, итд., то нису цели бројеви (тј., 2, 5, 15, итд.), па захтевају разматрање фракција у бинарном формату. Као резултирајући децимални бројеви (тј., 20.123, 16.23, итд.) се не могу лако представити нормалним бинарним форматом (тј., целим бројем). Главна разлика између Флоат и Доубле је у томе што су први прецизни (32-битни) подаци с помичним зарезом, док је други двоструко прецизни (64-битни) тип података с помичним зарезом. Доубле се назива "доубле" јер је у основи верзија двоструке прецизности Флоата. Ако израчунавате огроман износ (помислите на хиљаде 0 у броју), нетачности ће бити мање у Доубле-у и нећете изгубити много прецизности.

Боље је разрадити примјере кода. Следи рад на Флоат и Доубле кроз математичке функције дате на Ц језику:

#инцлуде

инт маин ()

флоат нум1 = 1.ф / 82;

флоат нум2 = 0;

за (инт и = 0; и < 738; ++i)

нум2 + = нум1;

принтф ("%. 7г \ н", број 2);

дупли број3 = 1,0 / 82;

дупли број4 = 0;

за (инт и = 0; и < 738; ++i)

нум4 + = нум3;

принтф („%. 15г \ н“, број4);

гетцхар ();

Штампа следеће:

9.000031

8.99999999999983

Овде можете видети да мала разлика у прецизности Флоат-а и Доубле-а даје потпуно другачији одговор, мада се чини да је Доубле тачнији од Флоат-а.

Слиједи примјер функције скрт () у Ц:

#инцлуде

#инцлуде

инт маин ()

флоат нум1 = скрт (2382719676512365.1230112312312312);

доубле нум2 = скрт (2382719676512365.1230112312312312);

принтф („% ф \ н“, број1);

принтф („% ф \ н“, број2);

гетцхар ();

Даје следећи излаз:

48813108.000000

48813109.678778

Овде можете видети да је одговор у Доубле-у бољи прецизност.

Све у свему, за аритметику с помичним зарезом боље је користити Доубле, јер неколико стандардних математичких функција на Ц раде на Доубле-у, а савремени рачунари су изузетно брзи и ефикасни за двоструко рачунање с помичним зарезом. То доводи до смањења потребе за коришћењем Флоат-а, осим ако не требате да радите на пуно бројева с помичном тачком (мислите на велике низове са хиљадама 0 у бројевима) или ако радите на систему који не подржава двоструку функцију - прецизна плутајућа тачка, јер многи ГПУ-ови, уређаји са малим напајањем и одређене платформе (АРМ Цортек-М2, Цортек-М4 итд.) још не подржавају Доубле, тада би требало да користите Флоат. Поред тога, једна ствар коју треба запамтити је да одређени ГПУ-ови / ЦПУ-ови боље / ефикасније раде у Флоат обради, као у прорачуну вектора / матрикса, тако да ћете можда требати да погледате приручник / документацију за хардвер како бисте боље одлучили који ћете користити за одређену машину.

Ретко је разлог да користите Флоат уместо Доубле у коду који циља модерне рачунаре. Додатна прецизност Доубле-а смањује, али не елиминише, могућност заокруживања грешака или друге непрецизности које могу проузроковати проблеме у другим деловима програма. Многе математичке функције или оператори претварају и враћају Доубле, тако да вам не треба бацати бројеве на Флоат јер би то могло изгубити прецизност. За детаљну анализу аритметике са плутајућом тачком, топло препоручујем да прочитате овај сјајан чланак (хттп://доцс.орацле.цом/цд/Е19957-01/806-3568/нцг_голдберг.хтмл).

Резиме

Дакле ... укратко:

Места на којима треба да користите Флоат:

  • Ако циљате хардвер где је једнострука прецизност бржа од двоструке прецизности.
  • Ваша апликација користи аритметику с помичним зарезом, попут хиљада бројева са хиљадама 0.
  • Радите на врло ниском нивоу оптимизације. На примјер, користите посебне ЦПУ упуте (тј. ССЕ, ССЕ2, АВКС, итд.) Које раде на више бројева / низова / вектора одједном..

Закључак

У овом чланку сам нагласио разлику између Флоат и Доубле, и који треба да се користи на одређеним местима. Свакако, боље је Доубле користити на већини места слепо, посебно ако циљате савремене рачунаре, јер су шансе за ниску ефикасност услед коришћења двоструке аритметике с помичним зарезом мало вероватне. Ако имате било каквих питања, можете то питати у одељку за коментаре испод!