logo

Pludiņa diapazons pitonā

Programmā Python, pludiņa diapazons vērtības ir atkarīgas no ieviešanas un platformas. Python valodas specifikācija to prasa tikai peldošā komata cipari atbalsta vismaz 1e-308 uz 1e+308 ar precizitāti vismaz 53 biti .

Praksē lielākā daļa mūsdienu Python implementāciju izmanto IEEE 754 peldošā komata standarts, kas nodrošina aptuveni diapazonu 1.7e-308 uz 1.7e+308 ar precizitāti 53 biti . Šis diapazons ir vienāds visās platformās, un to atbalsta iebūvētais pludiņš.

Tomēr ir svarīgi atzīmēt, ka peldošā komata aritmētika ir pakļauta noapaļošanas kļūdām un citiem neprecizitātes avotiem, īpaši, veicot darbības ar ļoti lieliem vai ļoti maziem skaitļiem. Dažos gadījumos tas var izraisīt neparedzētu uzvedību un kļūdas.

Lai izvairītos no šīm problēmām, to bieži ieteicams izmantot decimālzīme vai fiksēts punkts aritmētika, strādājot ar naudas vērtībām vai citām lietojumprogrammām, kurām nepieciešama augsta precizitāte. The decimālais modulis Python nodrošina atbalstu fiksētā komata aritmētikai ar konfigurējamu precizitāti un ir laba alternatīva peldošā komata aritmētikai šīm lietojumprogrammām.

'eulera numurs java'

The IEEE 754 standarts nosaka peldošā komata skaitļu diapazonu un precizitāti, ko izmanto lielākā daļa mūsdienu programmēšanas valodu, tostarp Python. Standarts nosaka divus peldošā komata skaitļu pamatformātus:

    Vienas precizitātes formāts

Tā izmanto 32 biti un nodrošina aptuveni 7 decimālzīmes precizitātes cipari.

    Divkāršas precizitātes formāts

Tā izmanto 64 biti un nodrošina aptuveni 16 decimālzīmes precizitātes cipari.

Python izmanto dubultā precizitāte pēc noklusējuma peldošā komata skaitļi, kas nozīmē, ka peldošo vērtību diapazons ir aptuveni 1.7e-308 uz 1.7e+308 ar precizitāti 53 biti . Šo diapazonu nosaka maksimālais un minimālais eksponents, ko var attēlot, izmantojot 11 biti , apvienojumā ar maksimālo un minimālo nozīmību (t.i., skaitļa daļu), ko var attēlot, izmantojot 52 biti .

Peldošā komata aritmētikas faktisko precizitāti var ietekmēt daudzi faktori, tostarp veids, kā skaitļi tiek saglabāti atmiņā, darbību secība un noapaļošanas režīma izvēle. Dažos gadījumos tas var izraisīt smalkas noapaļošanas kļūdas un citus neprecizitātes avotus.

Lai izvairītos no šīm problēmām, bieži tiek ieteikts izmantot alternatīvas pieejas, strādājot ar ļoti lieliem vai ļoti maziem skaitļiem vai ja nepieciešama augsta precizitāte. Piemēram:

  1. Izmantot fiksēta punkta aritmētika vai decimālā aritmētika , kas nodrošina fiksētu precizitātes zīmju skaitu aiz komata un novērš noapaļošanas kļūdas.
  2. Izmantot patvaļīga precizitāte bibliotēkām patīk 'mpmath' vai 'gmpy2' , kas ļauj veikt aprēķinus ar ļoti augstu precizitāti un izvairīties no noapaļošanas kļūdām.

Viens svarīgs aspekts, kas jāņem vērā, ir tas, ka, veicot aritmētiskās darbības ar peldošā komata skaitļiem programmā Python, varat saskarties ar kādu negaidītu darbību peldošā komata aritmētikas darbības dēļ.

Dažas aritmētiskās darbības var radīt ļoti mazus vai ļoti lielus skaitļus, kurus nevar precīzi attēlot, izmantojot peldošā komata aritmētiku. Šajos gadījumos rezultāts var būt noapaļots vai saīsināts , izraisot negaidītu rīcību vai neprecizitātes jūsu aprēķinos.

Peldošā komata aritmētika nav asociatīvs , kas nozīmē, ka secība, kādā veicat darbības, var ietekmēt rezultātu. Piemēram, (a + b) + c var nebūt vienāds ar a + (b + c) noapaļošanas kļūdu un citu neprecizitātes avotu dēļ.

Peldošā komata aritmētika arī nav sadales , kas nozīmē, ka (a + b) * c var nebūt vienāds ar a * c + b * c noapaļošanas kļūdu un citu neprecizitātes avotu dēļ. Lai mazinātu šo problēmu ietekmi, bieži tiek ieteikts izmantot matemātikas moduli vai citas skaitliskās bibliotēkas, kas nodrošina funkcijas, lai precīzāk un uzticamāk veiktu aritmētiskās darbības ar peldošā komata skaitļiem. Laba prakse ir arī izvairīties no peldošā komata skaitļu salīdzināšanas vienlīdzības nolūkos un tā vietā izmantot pielaides slieksni vai citas metodes, lai salīdzinātu starpības lielumu starp divām vērtībām.

Piemērs:

Ņemsim piemēru, lai parādītu, kā peldošā komata aritmētika var izraisīt neparedzētu python uzvedību:

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

Izvade:

 0.6000000000000001 0.6 

Paskaidrojums:

Šajā piemērā mēs veicam divus dažādus aprēķinus, izmantojot vienas un tās pašas vērtības a, b, un c . Pirmajā aprēķinā mēs pievienojam a un b vispirms un pēc tam pievienojiet rezultātu c . Otrajā aprēķinā mēs pievienojam b un c vispirms un pēc tam pievienojiet rezultātu a .

Mēs varētu sagaidīt, ka abi aprēķini dos vienu un to pašu rezultātu, jo tajos tiek izmantotas vienas un tās pašas vērtības a, b , un c . Tomēr peldošā komata aritmētikas ierobežojumu dēļ abi aprēķini rada nedaudz atšķirīgus rezultātus.

Pirmais aprēķins rada rezultātu 0,60000000000000001 , savukārt otrais aprēķins rada rezultātu 0.6 . Tas ir tāpēc, ka pirmā aprēķina starprezultāti nedaudz atšķiras no otrā aprēķina starprezultātiem noapaļošanas kļūdu un citu neprecizitātes avotu dēļ.

Lai izvairītos no šīm problēmām, bieži ir ieteicams izmantot decimālais modulis vai citas izpildes metodes aritmētiskās darbības ieslēgts peldošā komata skaitļus precīzāk un uzticamāk.

Piemēram:

 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) 

Izvade:

 0.6 0.6 

Paskaidrojums:

Šajā piemērā mēs izmantojam decimālais modulis lai veiktu tos pašus aprēķinus, izmantojot fiksēts punkts aritmētiku ar precizitāti 1 decimālzīme. Tas ļauj mums izvairīties no noapaļošanas kļūdām un citiem neprecizitātes avotiem, kas var ietekmēt peldošā komata aritmētika. Rezultātā abi aprēķini rada vienu un to pašu rezultātu 0.6 .