Ошибка при использовании math.atan в Python! - PullRequest
0 голосов
/ 14 июня 2009

Когда я делаю 1/2 в Python, почему он дает мне ноль? Даже если я приведу это к float(1/2), я все равно получу ноль. Зачем? И как мне это обойти?

Когда я даю arctan(1/2), я получаю 0 в качестве ответа, но когда я даю arctan(.5), я получаю правильный ответ!

Ответы [ 9 ]

7 голосов
/ 14 июня 2009

Поскольку Python 2.x использует целочисленное деление для целых чисел, поэтому:

1/2 == 0

оценивается как True.

Вы хотите сделать:

1.0/2

или сделать

from __future__ import division
6 голосов
/ 14 июня 2009

Во-первых, 1/2 - целочисленное деление. До Python 3.0.

>>> 1/2
0
>>> 1.0/2.0
0.5
>>> 

Во-вторых, используйте math.atan2 для такого рода вещей.

>>> math.atan2(1,2)
0.46364760900080609
>>> math.atan(.5)
0.46364760900080609
3 голосов
/ 14 июня 2009
atan(float(1)/2)

Если вы делаете:

atan(float(1/2))

в Python 2.x, но без:

from __future__ import division

1/2 вычисляется сначала как 0, затем 0 преобразуется в число с плавающей точкой, затем вызывается atan (0.0). Это изменяется в Python 3, который использует деление с плавающей точкой по умолчанию даже для целых чисел. Короткое портативное решение - это то, что я впервые дал.

2 голосов
/ 14 июня 2009

Из стандарта:

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

2 голосов
/ 14 июня 2009
float(1)/float(2)

Если вы разделите int / int, вы получите int, поэтому float (0) все равно даст вам 0.0

1 голос
/ 14 июня 2009

Если 1/2 == 0, то значение float (1/2) будет равно 0.0. Если вы заставите его плавать после того, как он будет усечен, он все равно будет усечен.

Есть несколько вариантов:

  • Добавьте следующий импорт: from __future__ import division. Это заставит оператор / разделить «правильно» в этом модуле. Вы можете использовать //, если вам нужно усеченное деление.
  • Привести любой из операндов в число с плавающей точкой. например: float(1)/2
  • Если вы на самом деле используете константы, просто добавьте десятичную точку вместо использования float (), например: 1.0/2 или 1/2.0 или 1.0/2.0
1 голос
/ 14 июня 2009

В Python деление целых чисел дает целое число - 0 в этом случае.

Есть два возможных решения. Один состоит в том, чтобы заставить их плавать: 1/2. (обратите внимание на конечную точку) или float (1) /2.

Другой способ - использовать «из future import Division» вверху кода и использовать необходимое поведение.

python -c 'из в будущем деление импорта; математика импорта; печать math.atan (1/2)' дает правильное значение 0,463647609001

1 голос
/ 14 июня 2009

У вашего принуждения нет шансов, потому что ответ уже равен нулю, прежде чем вы дадите его всплыть.

Попробуйте 1./2

1 голос
/ 14 июня 2009

Поскольку эти ответы подразумевают, 1/2 не возвращает то, что вы ожидаете. Возвращает ноль, потому что 1 и 2 являются целыми числами (целочисленное деление приводит к округлению чисел в меньшую сторону). Кстати, Python 3 меняет это поведение.

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