logo

Опсег флоат-а у Питхон-у

У Питхон-у, опсег пловка вредности зависе од имплементације и платформе. Спецификација језика Питхон захтева само то флоатинг-поинт бројеви подржавају барем 1е-308 до 1е+308 са прецизношћу од најмање 53 бита .

У пракси, већина савремених Питхон имплементација користи ИЕЕЕ 754 стандард са помичним зарезом, који обезбеђује опсег од приближно 1.7е-308 до 1.7е+308 са прецизношћу од 53 бита . Овај опсег је исти на свим платформама и подржава га уграђени тип флоат.

Међутим, важно је напоменути да је аритметика са покретним зарезом подложна грешкама заокруживања и другим изворима непрецизности, посебно када се извршавају операције на веома великим или веома малим бројевима. То може довести до неочекиваног понашања и грешака у неким случајевима.

Да бисте избегли ове проблеме, често се препоручује употреба децималан или фиксна тачка аритметику када радите са новчаним вредностима или другим апликацијама које захтевају високу прецизност. Тхе децимални модул у Питхон-у пружа подршку за аритметику фиксне тачке са прецизношћу која се може конфигурисати и добра је алтернатива аритметици са покретним зарезом за ове апликације.

композитни кључ примарног кључа

Тхе ИЕЕЕ 754 стандард дефинише опсег и прецизност бројева са покретним зарезом које користи већина модерних програмских језика, укључујући Питхон. Стандард дефинише два основна формата за бројеве са покретним зарезом:

    Формат једне прецизности

Користи 32 бита и пружа приближно 7 децимални цифре прецизности.

    Формат двоструке прецизности

Користи 64 бита и пружа приближно 16 децималних цифре прецизности.

Питхон користи двострука прецизност бројеви са помичним зарезом по подразумеваној вредности, што значи да је опсег вредности са покретним зарезом приближно 1.7е-308 до 1.7е+308 са прецизношћу од 53 бита . Овај опсег је одређен максималним и минималним експонентима који се могу представити помоћу 11 бита , у комбинацији са максималним и минималним знаковима (тј. разломком броја) који се могу представити помоћу 52 бита .

На стварну прецизност аритметике са покретним зарезом може утицати много фактора, укључујући начин на који се бројеви чувају у меморији, редослед операција и избор начина заокруживања. То може довести до суптилних грешака заокруживања и других извора непрецизности у неким случајевима.

Да би се избегли ови проблеми, често се препоручује коришћење алтернативних приступа када се ради са веома великим или веома малим бројевима, или када је потребна висока прецизност. На пример:

  1. Користите аритметика фиксне тачке или децимална аритметика , који обезбеђује фиксни број децималних места прецизности и избегава грешке заокруживања.
  2. Користите произвољно-прецизност библиотеке попут 'мпматх' или 'гмпи2' , који вам омогућавају да извршите прорачуне са веома високом прецизношћу и избегавате грешке заокруживања.

Један важан аспект који треба напоменути је да када изводите аритметичке операције над бројевима са покретним зарезом у Питхон-у, можете наићи на неочекивано понашање због начина на који функционише аритметика са покретним зарезом.

Неке аритметичке операције могу резултирати веома малим или веома великим бројевима који се не могу прецизно представити помоћу аритметике са покретним зарезом. У овим случајевима резултат може бити заокружено или скраћено , што доводи до неочекиваног понашања или нетачности у вашим прорачунима.

Аритметика са помичним зарезом није асоцијативну , што значи да редослед којим обављате операције може утицати на резултат. На пример, (а + б) + ц не може бити једнака а + (б + ц) због грешака заокруживања и других извора непрецизности.

Аритметика са помичним зарезом такође није дистрибутивна , што значи да (а + б) * ц не може бити једнака а * ц + б * ц због грешака заокруживања и других извора непрецизности. Да би се смањио утицај ових проблема, често се препоручује коришћење математичког модула или других нумеричких библиотека које пружају функције за извођење аритметичких операција над бројевима са покретним зарезом на прецизнији и поузданији начин. Такође је добра пракса избегавати упоређивање бројева са покретним зарезом ради једнакости, и уместо тога користити праг толеранције или друге методе за поређење величине разлике између две вредности.

Пример:

Узмимо пример да покажемо како аритметика са покретним зарезом може довести до неочекиваног понашања у Питхон-у:

 a = 0.1 b = 0.2 c = 0.3 result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2) 

Излаз:

 0.6000000000000001 0.6 

Објашњење:

У овом примеру изводимо два различита прорачуна користећи исте вредности од а, б, и ц . У првом прорачуну додајемо а и б прво, а затим додајте резултат у ц . У другом прорачуну додајемо б и ц прво, а затим додајте резултат у а .

Можемо очекивати да ће два прорачуна дати исти резултат, пошто користе исте вредности од а, б , и ц . Међутим, због ограничења аритметике са покретним зарезом, ова два прорачуна дају мало различите резултате.

Прво израчунавање даје резултат од 0,60000000000000001 , док други прорачун даје резултат од 0.6 . То је зато што се средњи резултати првог прорачуна мало разликују од међурезултата другог прорачуна, због грешака заокруживања и других извора непрецизности.

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

На пример:

 import decimal a = decimal.Decimal('0.1') b = decimal.Decimal('0.2') c = decimal.Decimal('0.3') result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2) 

Излаз:

 0.6 0.6 

Објашњење:

У овом примеру користимо децимални модул да изврши исте прорачуне користећи фиксна тачка аритметика са прецизношћу од 1 децималног места. Омогућава нам да избегнемо грешке заокруживања и друге изворе непрецизности на које може утицати флоатинг-поинт аритметика. Као резултат, оба прорачуна дају исти резултат од 0.6 .