Может кто-нибудь объяснить это (прямо из документов - выделение мое):
math.ceil (x) Возвращает потолок x в виде числа с плавающей точкой , наименьшее целочисленное значение, большее или равное x.
math.floor (x) Возвращает пол x как число с плавающей запятой , наибольшее целочисленное значение меньше или равно x.
Зачем .ceil
и .floor
возвращать числа с плавающей точкой, если они по определению должны вычислять целые числа?
РЕДАКТИРОВАТЬ:
Ну это имеет очень хорошие аргументы, почему они должны возвращаться поплавки, и я просто привыкнуть к идее, когда @jcollado отметил, что они на самом деле делают возвращение РАСЧ в Python 3 ...
int(floor(n))
.Ответы:
Диапазон чисел с плавающей запятой обычно превышает диапазон целых чисел. Возвращая значение с плавающей запятой, функции могут возвращать разумное значение для входных значений, которые находятся за пределами представимого диапазона целых чисел.
Подумайте: если
floor()
возвращается целое число, что должноfloor(1.0e30)
возвращаться?Теперь, хотя целые числа Python теперь имеют произвольную точность, так было не всегда. Стандартные библиотечные функции - это тонкие обертки вокруг эквивалентных библиотечных функций.
источник
floor(float("inf"))
илиceil(float("nan"))
.Как указывают другие ответы, в python они возвращают числа с плавающей точкой, вероятно, по историческим причинам, чтобы предотвратить проблемы переполнения. Тем не менее, они возвращают целые числа в Python 3.
Вы можете найти больше информации в PEP 3141 .
источник
float("inf")
илиfloat("nan")
, вы получитеOverflowError
исключение.numpy.floor
иceil
обратные числа с плавающей точкой (<class 'numpy.float64'>)float("inf")
не создает исключение в Python 2.7 или 3Источник вашего замешательства очевиден в вашем комментарии:
Целью операций ceil и floor является округление данных с плавающей запятой до целых значений . Не делать преобразование типов. Пользователи, которым необходимо получить целочисленные значения, могут выполнить явное преобразование после операции.
Обратите внимание, что было бы невозможно реализовать округление до целочисленного значения, как тривиально, если бы у вас была только операция ceil или float, которая возвращала целое число. Вам нужно сначала проверить, что вход находится в пределах представимого целочисленного диапазона, а затем вызвать функцию; вам нужно обрабатывать NaN и бесконечности в отдельном пути кода.
Кроме того, у вас должны быть версии ceil и floor, которые возвращают числа с плавающей запятой, если вы хотите соответствовать IEEE 754 .
источник
Потому что математическая библиотека python является тонкой оболочкой для математической библиотеки C, которая возвращает значения с плавающей точкой.
источник
До Python 2.4 целое число не могло содержать полный диапазон усеченных действительных чисел.
http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers
источник
Поскольку диапазон для чисел с плавающей запятой больше, чем у целых чисел - возврат целого числа может привести к переполнению
источник
Это очень интересный вопрос! Поскольку для числа с плавающей запятой требуется несколько бит для хранения показателя степени (=
bits_for_exponent
), любое число с плавающей запятой, большее, чем2**(float_size - bits_for_exponent)
всегда, будет целым значением! С другой стороны, число с плавающей точкой с отрицательным показателем даст один из1
,0
или-1
. Это делает обсуждение вопроса о целочисленном диапазоне и диапазоне с плавающей запятой спорным, поскольку эти функции будут просто возвращать исходное число всякий раз, когда число выходит за пределы диапазона целочисленного типа. Функции python являются обертками дляC
функции, и это действительно недостатокC
функций, в которых они должны были вернуть целое число и заставить программиста выполнить проверку диапазона /NaN
/Inf
перед вызовом ceil / floor.Таким образом, логический ответ - единственный раз, когда эти функции полезны, они возвращают значение в целочисленном диапазоне, и поэтому тот факт, что они возвращают число с плавающей запятой, является ошибкой, и вы очень разумны для реализации этого!
источник
Может быть, потому что это делают и другие языки, поэтому это общепринятое поведение. (По уважительным причинам, как показано в других ответах)
источник