logo

Zasięg float w Pythonie

W Pythonie zasięg pływaka wartości zależą od implementacji i platformy. Specyfikacja języka Python tego wymaga zmiennoprzecinkowy przynajmniej liczby obsługują 1e-308 Do 1e+308 z dokładnością co najmniej 53 bity .

W praktyce większość nowoczesnych implementacji Pythona korzysta z IEEE754 standard zmiennoprzecinkowy, który zapewnia zakres w przybliżeniu 1.7e-308 Do 1.7e+308 z dokładnością 53 bity . Ten zakres jest taki sam na wszystkich platformach i jest obsługiwany przez wbudowany typ float.

Należy jednak pamiętać, że arytmetyka zmiennoprzecinkowa jest obarczona błędami zaokrągleń i innymi źródłami niedokładności, szczególnie podczas wykonywania operacji na bardzo dużych lub bardzo małych liczbach. W niektórych przypadkach może to prowadzić do nieoczekiwanych zachowań i błędów.

Aby uniknąć tych problemów, często zaleca się użycie dziesiętny Lub punkt stały arytmetyka podczas pracy z wartościami pieniężnymi lub w innych zastosowaniach wymagających dużej precyzji. The moduł dziesiętny w Pythonie zapewnia obsługę arytmetyki stałoprzecinkowej z konfigurowalną precyzją i jest dobrą alternatywą dla arytmetyki zmiennoprzecinkowej w tych zastosowaniach.

jaka jest różnica między megabajtem a gigabajtem

The IEEE754 standard określa zakres i precyzję liczb zmiennoprzecinkowych używanych przez większość współczesnych języków programowania, w tym Python. Norma definiuje dwa podstawowe formaty liczb zmiennoprzecinkowych:

    Format o pojedynczej precyzji

To używa 32 bity i zapewnia około 7 dziesiętnych cyfry precyzji.

    Format podwójnej precyzji

To używa 64 bity i zapewnia około 16 dziesiętnych cyfry precyzji.

Używa Pythona podwójna precyzja domyślnie liczby zmiennoprzecinkowe, co oznacza, że ​​zakres wartości zmiennoprzecinkowych jest przybliżony 1.7e-308 Do 1.7e+308 z dokładnością 53 bity . Zakres ten jest określony przez maksymalne i minimalne wykładniki, które można przedstawić za pomocą 11 bitów , w połączeniu z maksymalnymi i minimalnymi znacznikami (tj. częścią ułamkową liczby), które można przedstawić za pomocą 52 bity .

Na rzeczywistą precyzję arytmetyki zmiennoprzecinkowej może mieć wpływ wiele czynników, w tym sposób przechowywania liczb w pamięci, kolejność operacji i wybór trybu zaokrąglania. W niektórych przypadkach może to prowadzić do subtelnych błędów zaokrągleń i innych źródeł niedokładności.

Aby uniknąć tych problemów, często zaleca się stosowanie alternatywnych podejść podczas pracy z bardzo dużymi lub bardzo małymi liczbami lub gdy wymagana jest duża precyzja. Na przykład:

  1. Używać arytmetyka stałoprzecinkowa Lub arytmetyka dziesiętna , co zapewnia stałą liczbę miejsc po przecinku i pozwala uniknąć błędów zaokrągleń.
  2. Używać dowolna precyzja biblioteki takie jak „mpmatematyka” Lub „gmpy2” , które pozwalają na wykonanie obliczeń z bardzo dużą precyzją i uniknięcie błędów zaokrągleń.

Należy pamiętać, że podczas wykonywania operacji arytmetycznych na liczbach zmiennoprzecinkowych w Pythonie możesz napotkać nieoczekiwane zachowanie ze względu na sposób działania arytmetyki zmiennoprzecinkowej.

Niektóre operacje arytmetyczne mogą skutkować powstaniem bardzo małych lub bardzo dużych liczb, których nie można dokładnie przedstawić za pomocą arytmetyki zmiennoprzecinkowej. W takich przypadkach wynik może być bułczasty Lub kadłubowy , co prowadzi do nieoczekiwanego zachowania lub niedokładności w obliczeniach.

Arytmetyka zmiennoprzecinkowa nie jest asocjacyjny , co oznacza, że ​​kolejność wykonywania operacji może mieć wpływ na wynik. Na przykład, (a + b) + do może nie być równy za + (b + c) ze względu na błędy zaokrągleń i inne źródła niedokładności.

Arytmetyka zmiennoprzecinkowa również nie dystrybucyjny , co oznacza że (a + b) * c może nie być równy a * do + b * c ze względu na błędy zaokrągleń i inne źródła niedokładności. Aby zminimalizować wpływ tych problemów, często zaleca się użycie modułu matematycznego lub innych bibliotek numerycznych, które udostępniają funkcje umożliwiające wykonywanie operacji arytmetycznych na liczbach zmiennoprzecinkowych w bardziej precyzyjny i niezawodny sposób. Dobrą praktyką jest również unikanie porównywania liczb zmiennoprzecinkowych pod kątem równości i zamiast tego stosowanie progu tolerancji lub innych metod porównywania wielkości różnicy między dwiema wartościami.

Przykład:

Weźmy przykład, aby pokazać, jak to zrobić arytmetyka zmiennoprzecinkowa może prowadzić do nieoczekiwanego zachowania w Pythonie:

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

Wyjście:

 0.6000000000000001 0.6 

Wyjaśnienie:

W tym przykładzie wykonujemy dwa różne obliczenia, używając tych samych wartości a, b, I C . W pierwszym obliczeniu dodajemy A I B najpierw, a następnie dodaj wynik do C . W drugim obliczeniu dodajemy B I C najpierw, a następnie dodaj wynik do A .

Można się spodziewać, że te dwa obliczenia dadzą ten sam wynik, ponieważ wykorzystują te same wartości a, b , I C . Jednak ze względu na ograniczenia arytmetyki zmiennoprzecinkowej te dwa obliczenia dają nieco inne wyniki.

Pierwsze obliczenie daje wynik 0,600000000000001 , podczas gdy drugie obliczenie daje wynik 0,6 . Dzieje się tak dlatego, że pośrednie wyniki pierwszego obliczenia nieznacznie różnią się od pośrednich wyników drugiego obliczenia, ze względu na błędy zaokrągleń i inne źródła niedokładności.

Aby uniknąć tych problemów, często zaleca się użycie moduł dziesiętny lub inne metody wykonania działania arytmetyczne NA zmiennoprzecinkowy liczby w sposób bardziej precyzyjny i niezawodny.

Na przykład:

 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) 

Wyjście:

 0.6 0.6 

Wyjaśnienie:

W tym przykładzie używamy moduł dziesiętny wykonać te same obliczenia za pomocą punkt stały arytmetyka z dokładnością do 1 miejsce po przecinku. Pozwala nam to uniknąć błędów zaokrągleń i innych źródeł niedokładności, które mogą mieć wpływ zmiennoprzecinkowy arytmetyka. W rezultacie oba obliczenia dają ten sam wynik 0,6 .