logo

Obseg float v pythonu

V Pythonu je obseg plovca vrednosti so odvisne od izvedbe in platforme. Specifikacija jezika Python zahteva le to plavajoča vejica številke podpirajo vsaj 1e-308 do 1e+308 z natančnostjo najmanj 53 bitov .

V praksi večina sodobnih izvedb Pythona uporablja IEEE 754 standard s plavajočo vejico, ki zagotavlja obseg približno 1.7e-308 do 1,7e+308 z natančnostjo 53 bitov . Ta razpon je enak na vseh platformah in ga podpira plavajoči vgrajeni tip.

Vendar je pomembno upoštevati, da je aritmetika s plavajočo vejico podvržena napakam pri zaokroževanju in drugim virom netočnosti, zlasti pri izvajanju operacij na zelo velikih ali zelo majhnih številih. V nekaterih primerih lahko povzroči nepričakovano vedenje in napake.

Da bi se izognili tem težavam, se pogosto priporoča uporaba decimalno oz fiksna točka aritmetiko pri delu z denarnimi vrednostmi ali drugimi aplikacijami, ki zahtevajo visoko natančnost. The decimalni modul v Pythonu nudi podporo za aritmetiko s fiksno vejico z nastavljivo natančnostjo in je dobra alternativa aritmetiki s plavajočo vejico za te aplikacije.

python kača proti anakondi

The IEEE 754 standard določa obseg in natančnost števil s plavajočo vejico, ki jih uporablja večina sodobnih programskih jezikov, vključno s Pythonom. Standard določa dva osnovna formata za števila s plavajočo vejico:

    Format z enojno natančnostjo

Uporablja se 32 bitov in zagotavlja približno 7 decimalka številke natančnosti.

    Format dvojne natančnosti

Uporablja se 64 bitov in zagotavlja približno 16 decimalka številke natančnosti.

Python uporablja dvojna natančnost privzeto števila s plavajočo vejico, kar pomeni, da je obseg vrednosti s plavajočo vejico približno 1.7e-308 do 1,7e+308 z natančnostjo 53 bitov . Ta obseg je določen z največjim in najmanjšim eksponentom, ki ju je mogoče predstaviti z uporabo 11 bitov , v kombinaciji z največjim in najmanjšim signifikandom (tj. ulomkom števila), ki ga je mogoče predstaviti z uporabo 52 bitov .

Na dejansko natančnost aritmetike s plavajočo vejico lahko vpliva veliko dejavnikov, vključno z načinom, kako so števila shranjena v pomnilniku, vrstnim redom operacij in izbiro načina zaokroževanja. V nekaterih primerih lahko povzroči subtilne napake pri zaokroževanju in druge vire nenatančnosti.

Da bi se izognili tem težavam, se pogosto priporoča uporaba alternativnih pristopov pri delu z zelo velikimi ali zelo majhnimi številkami ali kadar je potrebna visoka natančnost. Na primer:

  1. Uporaba aritmetika s fiksno vejico oz decimalna aritmetika , ki zagotavlja fiksno število decimalnih mest natančnosti in preprečuje napake pri zaokroževanju.
  2. Uporaba poljubna natančnost knjižnice kot 'mpmath' oz 'gmpy2' , ki vam omogočajo zelo natančno izračune in se izognete napakam pri zaokroževanju.

Pomemben vidik, ki ga je treba upoštevati, je, da lahko pri izvajanju aritmetičnih operacij s števili s plavajočo vejico v Pythonu naletite na nepričakovano vedenje zaradi načina delovanja aritmetike s plavajočo vejico.

Nekatere aritmetične operacije lahko povzročijo zelo majhna ali zelo velika števila, ki jih ni mogoče natančno predstaviti z uporabo aritmetike s plavajočo vejico. V teh primerih je lahko rezultat zaokrožen oz okrnjena , kar vodi do nepričakovanega vedenja ali netočnosti v vaših izračunih.

Aritmetika s plavajočo vejico ni asociativno , kar pomeni, da lahko vrstni red, v katerem izvajate operacije, vpliva na rezultat. na primer (a + b) + c morda ni enako a + (b + c) zaradi napak pri zaokroževanju in drugih virov netočnosti.

Aritmetika s plavajočo vejico prav tako ni razdelilni , kar pomeni, da (a + b) * c morda ni enako a * c + b * c zaradi napak pri zaokroževanju in drugih virov netočnosti. Da bi zmanjšali vpliv teh težav, se pogosto priporoča uporaba matematičnih modulov ali drugih numeričnih knjižnic, ki zagotavljajo funkcije za izvajanje aritmetičnih operacij s števili s plavajočo vejico na natančnejši in zanesljivejši način. Prav tako je dobra praksa, da se izognete primerjanju števil s plavajočo vejico za enakost in namesto tega uporabite tolerančni prag ali druge metode za primerjavo velikosti razlike med dvema vrednostma.

primer:

Vzemimo primer, da pokažemo, kako aritmetika s plavajočo vejico lahko povzroči nepričakovano vedenje v pythonu:

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

Izhod:

 0.6000000000000001 0.6 

Pojasnilo:

V tem primeru izvajamo dva različna izračuna z istimi vrednostmi a, b, in c . Pri prvem izračunu dodamo a in b najprej in nato dodajte rezultat c . Pri drugem izračunu dodamo b in c najprej in nato dodajte rezultat a .

Lahko pričakujemo, da bosta oba izračuna dala enak rezultat, saj uporabljata enake vrednosti a, b , in c . Vendar pa zaradi omejitev aritmetike s plavajočo vejico oba izračuna dajeta nekoliko drugačne rezultate.

Prvi izračun daje rezultat 0,60000000000000001 , medtem ko drugi izračun ustvari rezultat 0,6 . To je zato, ker se vmesni rezultati prvega izračuna nekoliko razlikujejo od vmesnih rezultatov drugega izračuna zaradi napak pri zaokroževanju in drugih virov netočnosti.

Da bi se izognili tem težavam, se pogosto priporoča uporaba decimalni modul ali druge metode za izvajanje aritmetične operacije na plavajoča vejica številke na bolj natančen in zanesljiv način.

Na primer:

 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) 

Izhod:

 0.6 0.6 

Pojasnilo:

V tem primeru uporabljamo decimalni modul za izvedbo enakih izračunov z uporabo fiksna točka aritmetika z natančnostjo 1 decimalno mesto. Omogoča nam, da se izognemo napakam pri zaokroževanju in drugim virom netočnosti, ki lahko vplivajo plavajoča vejica aritmetika. Kot rezultat, oba izračuna dajeta enak rezultat 0,6 .