biblioteca - math gcd python



Por que as operações math.ceil() e math.floor() do Python retornam floats ao invés de inteiros? (6)

Alguém pode explicar isso (direto dos docs - ênfase minha):

math.ceil (x) Retorna o teto de x como um float , o menor valor inteiro maior ou igual a x.

math.floor (x) Retorna o piso de x como um float , o maior valor inteiro menor ou igual a x.

Por que .ceil e .floor retornam floats quando são, por definição, calculados inteiros?

EDITAR:

Bem, isso tem alguns argumentos muito bons a respeito de porque eles deveriam retornar floats, e eu estava me acostumando com a idéia, quando @jcollado apontou que eles de fato retornam ints em Python 3 ...


A fonte da sua confusão é evidente em seu comentário:

O ponto principal das operações de ceil / floor é converter floats em inteiros!

O ponto das operações ceil e floor é arredondar os dados de ponto flutuante para valores integrais . Não fazer uma conversão de tipo. Os usuários que precisam obter valores inteiros podem fazer uma conversão explícita após a operação.

Note que não seria possível implementar uma rodada para o valor integral como trivialmente se tudo que você tinha disponível fosse uma operação ceil ou float que retornasse um inteiro. Você precisaria primeiro checar se a entrada está dentro do intervalo inteiro representável, então chamar a função; você precisaria manipular NaN e infinitos em um caminho de código separado.

Além disso, você deve ter versões de ceil e floor que retornem números de ponto flutuante se você quiser estar em conformidade com o IEEE 754 .



Esta é uma questão muito interessante! Como float requer alguns bits para armazenar o expoente (= bits_for_exponent ) qualquer número de ponto flutuante maior que 2**(float_size - bits_for_exponent) será sempre um valor integral! No outro extremo, um float com um expoente negativo dará um de 1 , 0 ou -1 . Isso faz com que a discussão do intervalo inteiro versus o intervalo de flutuação seja irrelevante, porque essas funções simplesmente retornarão o número original sempre que o número estiver fora do intervalo do tipo inteiro. As funções python são invólucros da função C e, portanto, é realmente uma deficiência das funções C , onde deveriam ter retornado um inteiro e forçado o programador a fazer a verificação de intervalo / NaN / Inf antes de chamar ceil / floor.

Assim, a resposta lógica é a única vez que essas funções são úteis, elas retornariam um valor dentro do intervalo de inteiros e, portanto, o fato de elas retornarem um float é um erro e você é muito esperto para perceber isso!


O intervalo de números de ponto flutuante geralmente excede o intervalo de inteiros. Ao retornar um valor de ponto flutuante, as funções podem retornar um valor sensato para valores de entrada que estão fora do intervalo representável de números inteiros.

Considere: Se floor() retornou um inteiro, o que o floor(1.0e30) retornar?

Agora, enquanto os números inteiros do Python são agora de precisão arbitrária, nem sempre foi assim. As funções de biblioteca padrão são wrappers finos em torno das funções da biblioteca C equivalentes.


Porque o intervalo para floats é maior que o de inteiros - retornando um inteiro poderia estouro


Talvez porque outras linguagens façam isso também, então é um comportamento geralmente aceito. (Por boas razões, como mostrado nas outras respostas)





math