Python - операции Java Math дают разные результаты

Как отметил @FelixKling, наиболее вероятным сценарием является то, что узлы, которые вы ищете, еще не существуют.

Однако современные методы разработки часто могут манипулировать элементами документа за пределами дерева документов либо с DocumentFragments, либо просто отсоединением / повторным подключением текущих элементов напрямую. Такие методы могут использоваться как часть шаблонов JavaScript или для предотвращения чрезмерных операций перерисовки / переплавки, в то время как элементы, о которых идет речь, сильно изменяются.

Аналогично, новая функциональность «Теневой DOM» развертывается в современных браузерах позволяет элементам быть частью документа, но не обрабатываться запросом document.getElementById и всеми его методами sibling (querySelector и т. д.). Это делается для инкапсуляции функциональных возможностей и, в частности, скрыть его.

Опять же, скорее всего, элемент, который вы ищете, просто (пока) в документе, и вы должны сделать, как предлагает Феликс , Тем не менее, вы также должны знать, что это все чаще является не единственной причиной того, что элемент может быть необоснованным (временно или постоянно).

1
задан retatu 24 January 2019 в 15:54
поделиться

1 ответ

Когда вы делаете

int(math.pow(14764352724, 6))

, вы получаете большое число, возведенное в степень, но используя метод с плавающей запятой, даже если аргументы являются целыми числами. Преобразование в целое число теряет точность (исходный результат - число с плавающей точкой: 1.0358251994780843e+61)

Когда вы делаете

14764352724**6

, вы получаете большое число, возведенное в степень с использованием двоичного кода метод power , использующий только целочисленное умножение.

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

>>> int(math.pow(14764352724,6))
10358251994780842724998096890217137953445700726699419360034816   # wrong
>>> 14764352724**6
10358251994780842575401275783021915748383652186833068257611776   # correct

Давайте попробуем разобрать функции ** и math.pow:

import dis,math

def test(n):
    return n ** 3

def test2(n):
    return math.pow(n,3)

dis.dis(test)
dis.dis(test2)

output

  4           0 LOAD_FAST                0 (n)
              3 LOAD_CONST               1 (3)
              6 BINARY_POWER
              7 RETURN_VALUE

  7           0 LOAD_GLOBAL              0 (math)
              3 LOAD_ATTR                1 (pow)
              6 LOAD_FAST                0 (n)
              9 LOAD_CONST               1 (3)
             12 CALL_FUNCTION            2 (2 positional, 0 keyword pair)
             15 RETURN_VALUE

Как видите, функции не эквивалентны. BINARY_POWER вызывается в первом случае. Эта функция имеет шанс выполнить точное целочисленное умножение , когда параметры целые :

BINARY_POWER ()

Реализует TOS = TOS1 ** TOS

< / blockquote>

Двоичная мощность выдает то же значение, что и math.pow, когда параметры не все целочисленные:

>>> 14764352724**6.0
1.0358251994780843e+61
>>> int(14764352724**6.0)
10358251994780842724998096890217137953445700726699419360034816

Примечание: что, вероятно, добавляет к путанице встроенную [ 1111] метод, который отличается от math.pow (и переопределяется последним при использовании from math import pow), но эквивалентен оператору ** при использовании без аргумента по модулю:

pow (x, y [, z])

Вернуть x в степень y; если присутствует z, вернуть x в степень y по модулю z (вычисляется более эффективно, чем pow (x, y)% z). Форма двух аргументов pow (x, y) эквивалентна использованию степенного оператора : x ** y.

0
ответ дан Jean-François Fabre 24 January 2019 в 15:54
поделиться