Alguém pode explicar isso (direto dos documentos - ênfase minha):
math.ceil (x) Retorna o teto de x como um ponto flutuante , o menor valor inteiro maior ou igual a x.
math.floor (x) Retorna o piso de x como um ponto flutuante , o maior valor inteiro menor ou igual a x.
Por que .ceil
e .floor
return flutuam quando, por definição, deveriam calcular números inteiros?
EDITAR:
Bem, isso tem alguns muito bons argumentos a respeito de por que eles devem retornar carros alegóricos, e eu estava apenas se acostumando com a idéia, quando @jcollado apontou que eles de fato fazer ints retorno em Python 3 ...
int(floor(n))
.Respostas:
O intervalo de números de ponto flutuante geralmente excede o intervalo de números inteiros. Ao retornar um valor de ponto flutuante, as funções podem retornar um valor sensível para valores de entrada que estão fora do intervalo representável de números inteiros.
Considere: Se
floor()
retornou um número inteiro, o que devefloor(1.0e30)
retornar?Agora, enquanto os números inteiros do Python agora são precisão arbitrária, nem sempre foi assim. As funções padrão da biblioteca são invólucros finos em torno das funções equivalentes da biblioteca C.
fonte
floor(float("inf"))
ouceil(float("nan"))
.Como apontado por outras respostas, em python eles retornam flutuadores provavelmente por razões históricas para evitar problemas de estouro. No entanto, eles retornam números inteiros no python 3.
Você pode encontrar mais informações no PEP 3141 .
fonte
float("inf")
oufloat("nan")
, receberá umaOverflowError
exceção.numpy.floor
e deceil
retorno (<class 'numpy.float64'>)float("inf")
não produz uma exceção no Python 2.7 ou 3A fonte de sua confusão é evidente em seu comentário:
O ponto das operações de teto e piso é arredondar os dados de ponto flutuante para valores integrais . Não para fazer uma conversão de tipo. Usuários que precisam obter números inteiros valores podem fazer uma conversão explícita após a operação.
Observe que não seria possível implementar uma rodada para o valor integral como trivial se tudo que você tivesse disponível fosse uma operação de teto ou flutuação que retornasse um número inteiro. Você precisaria primeiro verificar se a entrada está dentro do intervalo inteiro representável e depois chamar a função; você precisaria lidar com NaN e infinitos em um caminho de código separado.
Além disso, você deve ter versões de teto e piso que retornam números de ponto flutuante se desejar estar em conformidade com a IEEE 754 .
fonte
Como a biblioteca de matemática do python é um invólucro fino em torno da biblioteca de matemática C que retorna valores flutuantes.
fonte
Antes do Python 2.4, um número inteiro não podia conter toda a gama de números reais truncados.
http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers
fonte
Como o intervalo para flutuadores é maior que o de números inteiros - retornar um número inteiro pode estourar
fonte
Esta é uma questão muito interessante! Como um flutuador requer alguns bits para armazenar o expoente (=
bits_for_exponent
) qualquer número de ponto flutuante maior que2**(float_size - bits_for_exponent)
sempre será um valor integral! No outro extremo, um flutuador com um expoente negativo dará um de1
,0
ou-1
. Isso torna discutível o intervalo inteiro versus o intervalo flutuante flutuante, porque essas funções retornam simplesmente o número original sempre que o número estiver fora do intervalo do tipo inteiro. As funções python são invólucros daC
função e, portanto, é realmente uma deficiência dasC
funções nas quais elas deveriam ter retornado um número inteiro e forçado o programador a fazer o intervalo /NaN
/Inf
check antes de chamar Ceil / Floor.Portanto, a resposta lógica é a única vez em que essas funções são úteis, elas retornariam um valor dentro do intervalo inteiro e, portanto, o fato de retornarem uma flutuação é um erro e você é muito inteligente para perceber isso!
fonte
Talvez porque outras línguas façam isso também, seja um comportamento geralmente aceito. (Por boas razões, como mostrado nas outras respostas)
fonte