Python, plūdės diapazonas vertės priklauso nuo diegimo ir platformos. Python kalbos specifikacija to reikalauja tik slankusis kablelis skaičiai palaiko bent 1e-308 į 1e+308 su ne mažesniu tikslumu 53 bitai .
Praktiškai dauguma šiuolaikinių Python diegimų naudoja IEEE 754 slankiojo kablelio standartas, kuris suteikia maždaug 1.7e-308 į 1,7e+308 tikslumu 53 bitai . Šis diapazonas yra vienodas visose platformose ir palaikomas įmontuoto plūdinio tipo.
Tačiau svarbu pažymėti, kad slankiojo kablelio aritmetikoje gali atsirasti apvalinimo klaidų ir kitų netikslumo šaltinių, ypač atliekant operacijas su labai dideliais arba labai mažais skaičiais. Kai kuriais atvejais tai gali sukelti netikėtą elgesį ir klaidas.
Norint išvengti šių problemų, dažnai rekomenduojama naudoti dešimtainis arba fiksuotas taškas aritmetika dirbant su piniginėmis reikšmėmis ar kitomis didelio tikslumo reikalaujančiomis programomis. The dešimtainis modulis Python palaiko fiksuoto kablelio aritmetiką su konfigūruojamu tikslumu ir yra gera alternatyva slankiojo kablelio aritmetikai šioms programoms.
tigro ir liūto skirtumas
The IEEE 754 standartas apibrėžia slankiojo kablelio skaičių diapazoną ir tikslumą, naudojamą daugelyje šiuolaikinių programavimo kalbų, įskaitant Python. Standartas apibrėžia du pagrindinius slankiojo kablelio skaičių formatus:
Tai naudoja 32 bitai ir suteikia apytiksliai 7 po kablelio tikslumo skaitmenys.
Tai naudoja 64 bitai ir suteikia apytiksliai 16 dešimtųjų tikslumo skaitmenys.
Python naudoja dvigubas tikslumas slankiojo kablelio skaičiai pagal numatytuosius nustatymus, o tai reiškia, kad slankiųjų reikšmių diapazonas yra apytikslis 1.7e-308 į 1,7e+308 tikslumu 53 bitai . Šis diapazonas nustatomas pagal didžiausius ir mažiausius eksponentus, kuriuos galima pavaizduoti naudojant 11 bitų , kartu su didžiausiu ir mažiausiu reikšmingumu (t. y. skaičiaus trupmena), kuriuos galima pavaizduoti naudojant 52 bitai .
Faktinį slankiojo kablelio aritmetikos tikslumą gali paveikti daugelis veiksnių, įskaitant skaičių saugojimo atmintyje būdą, operacijų tvarką ir apvalinimo režimo pasirinkimą. Kai kuriais atvejais tai gali sukelti subtilių apvalinimo klaidų ir kitų netikslumų.
Norint išvengti šių problemų, dažnai rekomenduojama naudoti alternatyvius metodus dirbant su labai dideliais arba labai mažais skaičiais arba kai reikalingas didelis tikslumas. Pavyzdžiui:
- Naudokite fiksuoto taško aritmetika arba dešimtainė aritmetika , kuris suteikia fiksuotą tikslumo skaičių po kablelio ir leidžia išvengti apvalinimo klaidų.
- Naudokite savavališkas tikslumas bibliotekoms patinka 'mpmath' arba 'gmpy2' , kurios leidžia atlikti skaičiavimus labai tiksliai ir išvengti apvalinimo klaidų.
Vienas svarbus aspektas, į kurį reikia atkreipti dėmesį, yra tai, kad atlikdami aritmetines operacijas su slankiojo kablelio skaičiais Python, galite susidurti su netikėta elgsena dėl slankaus kablelio aritmetikos veikimo.
Kai kurios aritmetinės operacijos gali sukelti labai mažus arba labai didelius skaičius, kurių negalima tiksliai pavaizduoti naudojant slankiojo kablelio aritmetiką. Tokiais atvejais rezultatas gali būti suapvalinti arba sutrumpintas , o tai lemia netikėtą elgesį arba skaičiavimų netikslumus.
Slankaus kablelio aritmetika nėra asociatyvus , o tai reiškia, kad operacijų atlikimo tvarka gali turėti įtakos rezultatui. Pavyzdžiui, (a + b) + c gali neprilygti a + (b + c) dėl apvalinimo klaidų ir kitų netikslumo šaltinių.
Slankaus kablelio aritmetika taip pat ne paskirstymo , tai reiškia kad (a + b) * c gali neprilygti a * c + b * c dėl apvalinimo klaidų ir kitų netikslumo šaltinių. Siekiant sumažinti šių problemų poveikį, dažnai rekomenduojama naudoti matematikos modulį arba kitas skaitmenines bibliotekas, kurios teikia funkcijas, skirtas tiksliau ir patikimiau atlikti aritmetines operacijas su slankiojo kablelio skaičiais. Taip pat gera praktika yra vengti lyginti slankiojo kablelio skaičius lygybei, o vietoj to naudoti tolerancijos slenkstį arba kitus metodus, skirtus dviejų reikšmių skirtumui palyginti.
Pavyzdys:
Paimkime pavyzdį, kad parodytume, kaip slankiojo kablelio aritmetika gali sukelti netikėtą python elgesį:
a = 0.1 b = 0.2 c = 0.3 result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2)
Išvestis:
0.6000000000000001 0.6
Paaiškinimas:
Šiame pavyzdyje atliekame du skirtingus skaičiavimus naudodami tas pačias reikšmes a, b, ir c . Pirmajame skaičiavime pridedame a ir b pirma, tada pridėkite rezultatą prie c . Antrame skaičiavime pridedame b ir c pirma, tada pridėkite rezultatą prie a .
Galime tikėtis, kad du skaičiavimai duos tą patį rezultatą, nes jie naudoja tas pačias reikšmes a, b , ir c . Tačiau dėl slankiojo kablelio aritmetikos apribojimų šie du skaičiavimai duoda šiek tiek skirtingus rezultatus.
Pirmuoju skaičiavimu gaunamas rezultatas 0,6000000000000001 , o antrasis skaičiavimas duoda rezultatą 0.6 . Taip yra todėl, kad dėl apvalinimo klaidų ir kitų netikslumo šaltinių pirmojo skaičiavimo tarpiniai rezultatai šiek tiek skiriasi nuo tarpinių antrojo skaičiavimo rezultatų.
Norint išvengti šių problemų, dažnai rekomenduojama naudoti dešimtainis modulis ar kitus atlikimo būdus aritmetines operacijas įjungta slankusis kablelis skaičiai tikslesni ir patikimesni.
Pavyzdžiui:
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)
Išvestis:
0.6 0.6
Paaiškinimas:
Šiame pavyzdyje mes naudojame dešimtainis modulis kad atliktumėte tuos pačius skaičiavimus naudodami fiksuotas taškas aritmetika tikslumu 1 po kablelio. Tai leidžia mums išvengti apvalinimo klaidų ir kitų netikslumo šaltinių, kurie gali turėti įtakos slankusis kablelis aritmetika. Dėl to abu skaičiavimai duoda tą patį rezultatą 0.6 .