logo

Raspon float-a u pythonu

U Pythonu, raspon plovka vrijednosti ovise o implementaciji i platformi. Specifikacija jezika Python zahtijeva samo to pokretni zarez barem brojevi podržavaju 1e-308 do 1e+308 s preciznošću od najmanje 53 bita .

U praksi većina modernih implementacija Pythona koristi IEEE 754 standard s pomičnim zarezom, koji pruža raspon od približno 1.7e-308 do 1.7e+308 s preciznošću od 53 bita . Ovaj raspon je isti na svim platformama i podržava ga plutajući ugrađeni tip.

Međutim, važno je napomenuti da je aritmetika s pomičnim zarezom podložna pogreškama zaokruživanja i drugim izvorima nepreciznosti, posebno kada se izvode operacije na vrlo velikim ili vrlo malim brojevima. U nekim slučajevima to može dovesti do neočekivanog ponašanja i pogrešaka.

Kako biste izbjegli ove probleme, često se preporučuje korištenje decimal ili fiksna točka aritmetiku pri radu s novčanim vrijednostima ili drugim aplikacijama koje zahtijevaju visoku preciznost. The decimalni modul u Pythonu pruža podršku za aritmetiku s fiksnim zarezom s konfigurabilnom preciznošću i dobra je alternativa aritmetici s pomičnim zarezom za ove aplikacije.

pretvaranje niza u json u Javi

The IEEE 754 standard definira raspon i preciznost brojeva s pomičnim zarezom koje koristi većina modernih programskih jezika, uključujući Python. Standard definira dva osnovna formata za brojeve s pomičnim zarezom:

    Format jednostruke preciznosti

Koristi se 32 bita i pruža približno 7 decimala znamenke preciznosti.

    Format dvostruke preciznosti

Koristi se 64 bita i pruža približno 16 decimala znamenke preciznosti.

Python koristi dvostruka preciznost prema zadanim postavkama brojevi s pomičnim zarezom, što znači da je raspon vrijednosti s pomičnim zarezom približno 1.7e-308 do 1.7e+308 s preciznošću od 53 bita . Ovaj raspon je određen maksimalnim i minimalnim eksponentima koji se mogu prikazati pomoću 11 bita , u kombinaciji s maksimalnim i minimalnim signifikandima (tj. razlomkom broja) koji se mogu predstaviti pomoću 52 bita .

Na stvarnu preciznost aritmetike s pomičnim zarezom mogu utjecati mnogi čimbenici, uključujući način na koji su brojevi pohranjeni u memoriji, redoslijed operacija i izbor načina zaokruživanja. To može dovesti do suptilnih pogrešaka zaokruživanja i drugih izvora nepreciznosti u nekim slučajevima.

Kako bi se izbjegli ti problemi, često se preporučuje korištenje alternativnih pristupa kada se radi s vrlo velikim ili vrlo malim brojevima ili kada je potrebna velika preciznost. Na primjer:

  1. Koristiti aritmetika fiksne točke ili decimalna aritmetika , koji daje fiksni broj decimalnih mjesta točnosti i izbjegava pogreške zaokruživanja.
  2. Koristiti arbitrarno-preciznost knjižnice poput 'mpmath' ili 'gmpy2' , koji vam omogućuju izvođenje izračuna s vrlo visokom preciznošću i izbjegavanje pogrešaka zaokruživanja.

Jedan važan aspekt koji treba imati na umu je da kada izvodite aritmetičke operacije na brojevima s pomičnim zarezom u Pythonu, možete naići na neko neočekivano ponašanje zbog načina na koji funkcionira aritmetika s pomičnim zarezom.

Neke aritmetičke operacije mogu rezultirati vrlo malim ili vrlo velikim brojevima koji se ne mogu precizno prikazati pomoću aritmetike s pomičnim zarezom. U tim slučajevima rezultat može biti zaobljena ili krnji , što dovodi do neočekivanog ponašanja ili netočnosti u vašim izračunima.

Aritmetika s pomičnim zarezom nije asocijativni , što znači da redoslijed kojim izvodite operacije može utjecati na rezultat. Na primjer, (a + b) + c ne mora biti jednako a + (b + c) zbog pogrešaka zaokruživanja i drugih izvora nepreciznosti.

Aritmetika s pomičnim zarezom također nije distributivni , što znači da (a + b) * c ne mora biti jednako a * c + b * c zbog pogrešaka zaokruživanja i drugih izvora nepreciznosti. Kako bi se smanjio utjecaj ovih problema, često se preporučuje korištenje matematičkog modula ili drugih numeričkih biblioteka koje pružaju funkcije za izvođenje aritmetičkih operacija na brojevima s pomičnim zarezom na precizniji i pouzdaniji način. Također je dobra praksa izbjegavati usporedbu brojeva s pomičnim zarezom radi jednakosti i umjesto toga koristiti prag tolerancije ili druge metode za usporedbu veličine razlike između dviju vrijednosti.

Primjer:

Uzmimo primjer da pokažemo kako aritmetika s pomičnim zarezom može dovesti do neočekivanog ponašanja u pythonu:

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

Izlaz:

 0.6000000000000001 0.6 

Obrazloženje:

U ovom primjeru izvodimo dva različita izračuna koristeći iste vrijednosti a, b, i c . U prvom izračunu zbrajamo a i b prvo, a zatim dodajte rezultat c . U drugom izračunu zbrajamo b i c prvo, a zatim dodajte rezultat a .

Možemo očekivati ​​da će dva izračuna dati isti rezultat budući da koriste iste vrijednosti a, b , i c . Međutim, zbog ograničenja aritmetike s pomičnim zarezom, dva izračuna daju malo drugačije rezultate.

Prvi izračun daje rezultat 0,6000000000000001 , dok drugi izračun daje rezultat od 0.6 . To je zato što se međurezultati prvog izračuna malo razlikuju od međurezultata drugog izračuna, zbog pogrešaka zaokruživanja i drugih izvora nepreciznosti.

Kako biste izbjegli ove probleme, često se preporučuje korištenje decimalni modul ili druge metode za izvođenje aritmetičke operacije na pokretni zarez brojeve na precizniji i pouzdaniji način.

Na primjer:

 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) 

Izlaz:

 0.6 0.6 

Obrazloženje:

U ovom primjeru koristimo decimalni modul za izvođenje istih izračuna koristeći fiksna točka aritmetika s preciznošću od 1 decimalno mjesto. Omogućuje nam izbjegavanje pogrešaka zaokruživanja i drugih izvora nepreciznosti koji mogu utjecati pokretni zarez aritmetika. Kao rezultat toga, oba izračuna daju isti rezultat 0.6 .