2014-09-25 2 views
1

я столкнулся с любопытным вопросом как в Python 2 и Python 3.Почему Python берет навсегда оценку 1 ** 4 ** 4 ** 4 ** 4?

>>> 1**4**4**4 
1L 
which seems fine, but when I do this: 
>>> 1**4**4**4**4 

это поражающая процессор и никогда не заканчивается.

Почему?

Я также запустил их, чтобы увидеть, было ли это что-то с функцией власти или с оператором **, и это, кажется, просто оператор **.

>>> (((((1**4)**4)**4)**4)**4) 
1 
>>> pow(pow(pow(pow(pow(pow(1,4),4),4),4),4),4) 
1 
>>> pow(pow(pow(pow(pow(pow(1.0,4),4),4),4),4),4) 
1.0 
>>> pow(pow(pow(pow(pow(pow(1L,4),4),4),4),4),4) 
1L 
>>> 1L**4**4**4 
1L 

Я также попробовал другой язык, и это похоже на Python.

Почему он не может оценить это в микросекундах? Может кто-нибудь объяснить, что он делает с процессорным временем?

Есть ли что-то неинтуитивное в отношении порядка операций, которые я не понимаю?

+0

Еще одна вещь, которую следует отметить, заключается в том, что оптимизатор глазок будет предварительно вычислять самый правый '4 ** 4', поэтому сравнение между« 1 ** 4 ** 256' и «1 ** 4 ** 4 * * 256'. – roippi

+0

А, ок. Я подумал, что это так. Спасибо всем. –

ответ

2

Математически экспоненцирование является правильной ассоциативным, так

1**4**4**4**4 

не то же самый, как

(((((1**4)**4)**4)**4)**4) 
6

С оператором **, обязательные правила таковы, что в заключённых в скобках выражений правых сначала оценивается сторона.

Вашего 1 ** 4 ** 4 ** 4 ** 4 оцениваются в следующем порядке:

1 ** (4 ** (4 ** (4 ** 4))) 

и она производит и выделение памяти для огромного числа по праву, который принимает все время:

>>> 4 ** 4 ** 4 
13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096L 
>>> 4 ** 4 ** 4 ** 4 
# ... wait a long time as Python allocates GBs of memory ... 

Цитируя ** documentation:

Таким образом, в несравненной последовательности мощности г унарные операторы, операторы вычисляются справа налево

2

Потому что это не делает

(((((1**4)**4)**4)**4)**4) 

Это делает

1**(4**(4**(4**(4**4)))) 

Обратите внимание, что последний должен вычислить ОГРОМНОЕ число прежде чем просто поднять 1 к этому результату.

0

правая ассоциативность:

>>> 2 ** 2 ** 3 
256 
>>> 
0

Это медленно, потому что он должен оценить 4**4**4**4, что делает умножение, чтобы получить точный результат.

(Не забывайте, что возведение в степень является правоассоциативной.)

P.S.4**4**4 - 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096, поэтому вычисление 4**4**4**4 путем умножения займет очень и очень долгое время.

Смежные вопросы