работа экспоненциального оператора ** в Python - PullRequest
0 голосов
/ 21 ноября 2018

Я запускаю скрипт на python, где вычисляю следующее:

t - 2 ** (j - 1) * l

Где t = 302536, j = 6, l = 0.

Это возвращает мне 302536 (t), я не могу понять как.По моему мнению, результат должен был быть 302535 (t - 1).

2 ** (j - 1) * l приводит к 0, что, по моему мнению, должно было привести к 1, поскольку (j - 1) * l приводит к 0.

Как это вычисляется?

1 Ответ

0 голосов
/ 21 ноября 2018

Единственное, что связывает сильнее, чем сила, это скобки.Python (и любой другой язык, который изначально поддерживает оператор power, который я видел) следует арифметическому соглашению, так что вам не нужно запоминать различные наборы конфликтующих правил.Ваша операция может быть явно переписана следующим образом:

t - ((2 ** (j - 1)) * l)

Как вы указали, установка l = 0 отбрасывает большую часть вычислений.Просто он отбрасывает все, кроме t.

Вы можете сделать такие вещи явными, используя функциональную форму оператора power.Любой из следующих импортов будет работать для приведенного ниже примера:

from math import pow
from operator import pow
from operator import __pow__ as pow
from numpy import pow

Похоже, вы хотели / ожидали

t - pow(2, (j - 1) * l)

Но вместо этого получили

t - pow(2, j - 1) * l
...