Я хотел бы понять, почему что-то происходит. Мне нужно было реализовать целочисленный квадратный корень в Python (isqrt(64) = 8 = isqrt(80)). Я убедился, что наивный подход:
def isqrt(n):
return int(math.sqrt(n))
должен был время от времени терпеть неудачу, когда переданное n является квадратным числом, предполагая, что Python преобразует в числа с плавающей запятой, а затем выполняет вычисление квадратного корня для чисел с плавающей запятой. Например, вызывая isqrt(13*13), я ожидал, что после преобразования в числа с плавающей запятой и вычисления sqrt можно получить что-то вроде 12,999999843, что после приведения к целому числу даст нам 12.
Но я выполнял большие циклы тестирования значений, больших и малых, и всегда получал правильный результат. Казалось бы, нет необходимости реализовывать специальный квадратный корень для целых чисел, в конце концов!
Непонимание беспокоит меня так же сильно, как когда что-то, что должно было работать, терпит неудачу. Почему это происходит?
Есть еще один вопрос, касающийся целочисленного квадратного корня в python: целочисленный квадратный корень в python
В определенной там функции isqrt() к n добавляется +0,5, что, я думаю, было включено именно для решения проблемы, о которой я упоминал, которую я ожидал, но не могу найти в конкретном случае.
РЕДАКТИРОВАТЬ: забыл указать, я использую Python 2.7
math.sqrt(5) == 2.23606797749979
, поэтому результатыsqrt
всегда с плавающей запятой, даже для небольших целочисленных аргументов. Но я думаю, что это изменилось в Python 3. Python имеет динамическую типизацию, поэтому в принципе может изменять тип результата по мере необходимости, давая целочисленный результат (включая большие целые числа), где аргумент является целым числом, если это то, что решает власть. Это имеет большой смысл, но я не проверял (поэтому комментарий не отвечает). - person Steve314   schedule 21.01.2016math.sqrt()
напрямую перенаправляется (помимо магии обработки комплексных чисел) соответствующей функции вlibm
(обратите внимание, чтоDecimal.sqrt()
отличается). Неудивительно, что чистая версия C ведет себя так же. - person dhke   schedule 21.01.2016