2013-05-07 2 views

ответ

13

Одним из способов является

int(math.sqrt(x)) ** 2 == x 
7

Поскольку Math.sqrt всегда возвращает число с плавающей точкой, вы можете использовать встроенный в is_integer метод

def is_square(x): 
    answer = math.sqrt(x) 
    return answer.is_integer() 

это вернет True если x квадратное и False если это не

>>> is_square(25) 
True 
>>> is_square(14) 
False 
+0

Hm. Видя, что числа с плавающей запятой неточны, может случиться так, что sqrt() квадратного числа не будет целым числом из-за ошибок округления во время вычисления? Это сделает ответ @ larsmans лучше. – millimoose

+0

- это действительная точка, хотя я только что запустил цикл for, который будет распечатывать все допустимые квадраты до 100 000 с помощью этого метода, и он не пропустил один. –

+0

Целые числа точно представлены в плавающей точке (они имеют все нули после точки). Я не уверен, гарантирован ли «sqrt», чтобы сохранить это. –

1

:

math.sqrt(nodes) == int(math.sqrt(nodes)) 
+0

это не сработает, из-за неточности поплавков. Если разница между 'math.sqrt (nodes)' и 'int (math.sqrt (nodes))' больше, чем 'sys.float_info.epsilon', тогда вам не повезло. – MattDMo

+0

Вы имеете в виду _smaller_ чем 'sys.float_info.epsilon'? в противном случае я смущен ... –

+0

Larger. Если разница больше, чем epsilon, система считает их не равными, а выражение возвращает «False». – MattDMo

Смежные вопросы