Противоречивые значения для одного и того же вычисления в python

#python #numpy #numbers

#python #numpy #числа

Вопрос:

Рассмотрим следующие два результата

 import numpy as np

(1/21) * np.log( (1/21) / (3/21) * (3/21))
  

что приводит к

-0.14497725893921062

и то же вычисление следующим образом

 import numpy as np

x  = 0.14285714285714285
y  = 0.14285714285714285
xy   = 0.047619047619047616

xy * np.log(xy / (x * y))
  

что приводит к

0.040347517161295414

Оба вычисления одинаковы, но в результатах так много пробелов. В чем здесь проблема?

И какой из них рекомендуется, если это не субъективный вопрос?

Комментарии:

1. Это может помочь вам понять, как Python управляет числами.

2. @hanugm вы пропускаете две скобки в первом уравнении ((3/21) * (3/21))

Ответ №1:

Поскольку умножение и деление имеют одинаковый приоритет в Python, а Python считывает их слева направо.

например:

 x, y, z = 2, 4, 8
  

это совершенно разные:

 x / y * z == x / (y * z)
>>>False
  

левая сторона равна 4.0, а правая сторона равна 0.0625

ps:

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