2017-02-20 3 views
0

Предположим, что я рассматриваю M=N**2, где N - целое число. Похоже, что numpy.sqrt(M) возвращает float (на самом деле numpy.float64).Безопасность принятия `int (numpy.sqrt (N))`

Я мог представить, что может быть случай, когда он возвращает, скажем, N-10**(-16) из-за проблем с числовой точностью, и в этом случае int(numpy.sqrt(M)) будет N-1.

Тем не менее, в моих тестах есть N==numpy.sqrt(M), возвращающий True, так что похоже, что этого приближения не происходит.

Можно ли считать, что int(numpy.sqrt(M)) действительно точна, когда M - идеальный квадрат? Если да, то для бонуса, что происходит в фоновом режиме, что заставляет его работать?

+1

Нет, если это float64, это будет правильно примерно ~ 20 мест, которые * много *, но не идеальный. Есть способы взять int sqrt ... –

+0

См. Http://stackoverflow.com/questions/15390858/weird-behaviour-of-np-sqrt-for-large-integers и http://stackoverflow.com/questions/15390807/integer-square-root-in-python – kennytm

ответ

0

Чтобы не пропустить целое на 1E-15, вы можете использовать:

int(numpy.sqrt(M)+0.5) 

или

int(round(numpy.sqrt(M))) 
+0

Или более явно: 'int (round (np.sqrt (M))) –

+0

@RobertKern Спасибо. Я всегда задаюсь вопросом, почему 'round()' не возвращает целое число. –

+1

Задержка от C. Существуют интегральные значения 'double', которые не могут быть представлены ни одним из целых типов C. Python 3.что исправлено. –

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