Почему операции Python math.ceil () и math.floor () возвращают числа с плавающей точкой вместо целых чисел? - PullRequest
160 голосов
/ 21 декабря 2011

Может кто-нибудь объяснить это (прямо из документов - выделение мое):

math.ceil (x) Вернуть потолок x как число с плавающей запятой , наименьшее целое число значение, большее или равное x.

math.floor (x) Возвращает пол x как число с плавающей точкой , наибольшее целое число значение меньше или равно x.

Почему .ceil и .floor возвращают числа с плавающей точкой, когда ониопределение должно вычислять целые числа?


РЕДАКТИРОВАТЬ:

Ну, у этого есть несколько очень хороших аргументов относительно того, почему они должны возвращать float,и я только привыкал к этой идее, когда @ jcollado указали, что на самом деле do возвращают целые числа в Python 3 ...

Ответы [ 8 ]

95 голосов
/ 21 декабря 2011

Диапазон чисел с плавающей запятой обычно превышает диапазон целых чисел.Возвращая значение с плавающей запятой, функции могут возвращать разумное значение для входных значений, которые находятся за пределами представимого диапазона целых чисел.

Учтите: если floor() вернул целое число, что должно floor(1.0e30) вернуть?

Теперь, хотя целые числа Python теперь имеют произвольную точность, так было не всегда.Стандартные библиотечные функции - это тонкие обертки вокруг эквивалентных библиотечных функций C.

91 голосов
/ 21 декабря 2011

Как указывают другие ответы, в python они возвращают числа с плавающей точкой, вероятно, по историческим причинам, чтобы предотвратить проблемы переполнения.Однако они возвращают целые числа в python 3.

>>> import math
>>> type(math.floor(3.1))
<class 'int'>
>>> type(math.ceil(3.1))
<class 'int'>

Более подробную информацию вы можете найти в PEP 3141 .

17 голосов
/ 21 декабря 2011

Поскольку математическая библиотека python является тонкой оболочкой для математической библиотеки C, которая возвращает значения с плавающей точкой.

16 голосов
/ 21 декабря 2011

Источник вашего замешательства очевиден в вашем комментарии:

Весь смысл операций ceil / floor - преобразовать числа с плавающей точкой в ​​целые числа!

Целью операций ceil и floor является округление данных с плавающей запятой до целых значений . Не делать преобразование типов. Пользователи, которым нужно получить значения integer , могут выполнить явное преобразование после операции.

Обратите внимание, что было бы невозможно реализовать округление до целочисленного значения, как тривиально, если бы у вас была только операция ceil или float, которая возвращала целое число. Вам необходимо сначала проверить, что вход находится в пределах представимого целочисленного диапазона, а затем вызвать функцию; вам нужно обрабатывать NaN и бесконечности в отдельном пути кода.

Кроме того, у вас должны быть версии ceil и floor, которые возвращают числа с плавающей запятой, если вы хотите соответствовать IEEE 754 .

5 голосов
/ 21 декабря 2011

До Python 2.4 целое число не могло содержать полный диапазон усеченных действительных чисел.

http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers

4 голосов
/ 10 июня 2012

Это очень интересный вопрос! Поскольку для значения с плавающей запятой требуется несколько бит для хранения показателя степени (= bits_for_exponent), любое число с плавающей запятой, большее, чем 2**(float_size - bits_for_exponent), всегда будет целым значением! С другой стороны, число с плавающей точкой с отрицательным показателем даст один из 1, 0 или -1. Это делает обсуждение целочисленного диапазона против плавающего диапазона moot, потому что эти функции будут просто возвращать исходное число всякий раз, когда число находится вне диапазона целочисленного типа. Функции python являются обертками для функции C, так что это действительно недостаток функций C, в которых они должны были вернуть целое число и вынудить программиста выполнить проверку диапазона / NaN / Inf перед вызовом CEIL / этаж.

Таким образом, логический ответ - единственный раз, когда эти функции полезны, они возвращают значение в целочисленном диапазоне, и поэтому тот факт, что они возвращают число с плавающей запятой, является ошибкой , и вы очень умны для реализации этого!

4 голосов
/ 21 декабря 2011

Поскольку диапазон для чисел с плавающей запятой больше диапазона целых чисел - возврат целого числа может переполнить

1 голос
/ 21 декабря 2011

Может быть, потому что это делают и другие языки, так что это общепринятое поведение.(По уважительным причинам, как показано в других ответах)

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