Расчет взаимных расчетов: n ** (- 1) или (1 / n)? - PullRequest
1 голос
/ 26 сентября 2011

В исходном коде random.py есть следующее определение константы:

BPF = 53        # Number of bits in a float
RECIP_BPF = 2**-BPF

Я не специалист по математике, но разве это не более читабельно, чтобы инвертировать BPF, поместив над ним 1?

Или в умножении есть что-то более удобное, чем деление в программировании?


Nevermind.

Чтобы очистить мой вопрос, я нашел это:

«На многих машинах, особенно на тех, у которых нет аппаратной поддержки деления, деление является более медленной операцией, чем умножение, поэтому этот подход может привести к значительному ускорению. Первый шаг относительно медленный, но его необходимо выполнить только один раз».

http://en.wikipedia.org/wiki/Multiplicative_inverse

Ответы [ 3 ]

3 голосов
/ 26 сентября 2011

RECIP_BPF, несмотря на название, не равно 1 / BPF. Это 1 / (2 ^ BPF). Я не могу говорить за всех, но мне легче читать как 2**-BPF, чем как 1.0/2**BPF.

Обратите внимание, что скорость умножения и деления здесь не имеет значения; в частности, поскольку они являются константами, компилятору или интерпретатору необходимо оценить их только один раз (а компилятор может сделать это даже во время компиляции). Более того, поскольку это точные степени двойки, существуют прямые способы получения результата без умножения или деления, используя тот факт, что с плавающей точкой используется двоичное кодирование.

1 голос
/ 26 сентября 2011

Способность к восстановлению субъективна. Тем не менее, лично я нахожу 2**-BPF легче читать, чем 1.0/2**BPF (с круглыми скобками или без них 2**BFP).

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

1 голос
/ 26 сентября 2011

«2 ** - BPF» означает 2, повышенные до мощности -BPF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...