Wpis z mikrobloga

Sytuacja 1:
Uruchamiam na chwilę nieskończoną pętlę w której pewną liczbę a przy każdym obrocie zwiększam dwukrotnie, po czym zatrzymuję proces poprzez ctr+c.
http://imgur.com/b558a5M
Pętla obróciła mi się 515537 razy. Wyświetlam liczbę a; jest ona w choooy duża.
Pytam o typ liczby a.
http://imgur.com/VyeOmCs
Zwraca mi int.

Pytanie 1:
Jak Python traktuje tak dużą liczbę? Dlaczego zwraca mi int? Gdzie się kończy zakres inta? Jak python wykonuje działania na tak dużej liczbie? Czy tak samo jak na „normalnych” liczbach (np x=31129)?

Sytuacja 2:
a jest tą ogromną liczbą
wpisuję

a**a

teoretycznie komputer próbuje podnieść ją do potęgi a. Zużycie procesora i zapełnienie pomięci RAM rośnie błyskawicznie. Zabijam proces idle3. Shell się zamyka. Zużycie procesora i RAMu WCIĄŻ ROŚNIE. Ram się kończy, komputer się zawiesza, muszę twardo resetować.

Pytanie 2:
Co Python próbował zrobić z liczbą a? Próbował ją podnieść do potęgi a tak jak każdą inną liczbę, aż zabrakło RAMu? Dlaczego zabicie procesu nie przerwało działania programu?

#python #programowanie
  • 10
  • Odpowiedz
@Romantyczny_widelec
1) Python gdy mu się przepełni int, float czy coś innego "emuluje sobie większe liczby" co oczywiście jest dużo wolniejsze niż liczenie na klasycznych zmiennych. Więc teoretycznie python może liczyć do nieskończoności. (czyli tyle na ile pamięci starczy)
2) Po części związane z 1 pyt. python sobie alokuje pamięć na daną zmienną, I gdy ta pamięć jest niewystarczająca to musi zaalokować więcej pamięci (w praktyce jest to 2x więcej, ale
  • Odpowiedz
@Angsoc: Swoją drogą mnie ciekawi mnie, że Python jest tak zajebisty, a nie mogą sobie poradzić z prostą reprezentacją liczb w komputerze. Najprostrzy przykład:

>>> 2.2 * 3.0
6.6000000000000005
>>>
  • Odpowiedz
@benwatkins Ja nie uważam, że Python jest takie zajebisty bo nie programuje w nim, więc nie wiem. Z obliczeniami na duzych liczbach trzeba kombinować, jakieś limity są przecież - tak samo jak z typem rzeczywistym, który nie jest dokładny i w niektórych zastosowaniach trzeba go unikać

To nie jest kwestia języka tylko komputera
  • Odpowiedz
Jak Python traktuje tak dużą liczbę? Dlaczego zwraca mi int? Gdzie się kończy zakres inta?


@Romantyczny_widelec: sys.maxint zwraca maksymalnego możliwego inta. Liczby całkowite powyżej tej liczby są automatycznie zamieniane na long, np.

In [8]: sys.maxint+1
  • Odpowiedz
jak python jest tak zajebisty to czego nie może sobie z tym z jakiś sposób poradzić?


@benwatkins: może nie chcą sobie z tym radzić, bo byłoby to niezgodne z teorią i działaniem liczb zmiennoprzecinkowych, a idąc dalej: jeszcze bardziej nieprzewidywalne dla nowych programistów (tych prawdziwych którzy wiedzą o liczbach zmiennoprzecinkowych).
  • Odpowiedz