Estou tentando encontrar a maior raiz do cubo que é um número inteiro, que é menor que 12.000.
processing = True
n = 12000
while processing:
n -= 1
if n ** (1/3) == #checks to see if this has decimals or not
Não sei como verificar se é um número inteiro ou não! Eu poderia convertê-lo em uma string e usar a indexação para verificar os valores finais e verificar se eles são zero ou não, o que parece bastante complicado. Existe uma maneira mais simples?
python
floating-point
helicóptero desenhar lion4
fonte
fonte
Respostas:
Para verificar se um valor flutuante é um número inteiro, use o
float.is_integer()
método :O método foi adicionado ao
float
tipo no Python 2.6.Leve em consideração que no Python 2,
1/3
é0
(divisão do piso para operandos inteiros!) E que a aritmética de ponto flutuante pode ser imprecisa (afloat
é uma aproximação usando frações binárias, não um número real preciso). Mas ajustar um pouco o loop, isso dá:o que significa que qualquer coisa acima de 3 em cubos (incluindo 10648) foi perdida devido à imprecisão acima mencionada:
Você precisaria procurar números próximos ao número inteiro ou não usar
float()
para encontrar seu número. Como arredondar a raiz do cubo de12000
:Se você estiver usando o Python 3.5 ou mais recente, poderá usar a
math.isclose()
função para verificar se um valor de ponto flutuante está dentro de uma margem configurável:Para versões mais antigas, a implementação ingênua dessa função (ignorando a verificação de erros e ignorando o infinito e o NaN), conforme mencionado em PEP485 :
fonte
True
se não houver decimais. Pode haver um mal-entendido por parte do OP sobre aritmética e precisão de ponto flutuante, é claro.1.0000000000000001
é exibido como1.0
, em 3, a representação de string mais curta que produz o mesmo valor é mostrada.range(12000, -1, -1)
poderia ser (imo, mais limpa) reescrita comoreversed(range(12000+1))
Podemos usar o operador modulo (%). Isso nos diz quantos restos temos quando dividimos x por y - expressa como
x % y
. Cada número inteiro deve ser dividido por 1; portanto, se houver um restante, ele não deve ser um número inteiro.Esta função retornará um valor booleano
True
ouFalse
, dependendo sen
é um número inteiro.fonte
Você poderia usar isto:
fonte
.is_integer()
continua a funcionar.is_integer
usa um método semelhante (o = (floor(x) == x) ? Py_True : Py_False;
). Mas eu concordo, deve-se usaris_integer()
, pois é muito mais claro.large_float == large_int
pode falhar mesmo selarge_float == float(large_int)
.123456789012345678901234567890.0 != 123456789012345678901234567890
mas123456789012345678901234567890.0 == float(123456789012345678901234567890)
k = 123456789012345678901234567890.0
entãok == int(k)
é True, que é a resposta correta.Você não precisa fazer loop ou verificar nada. Basta pegar uma raiz cúbica de 12.000 e arredondar para baixo:
fonte
Você pode usar uma operação de módulo para isso.
fonte
n
é 6.2, 6.0, 6.12312412, todos nós temos"We have a decimal number here!"
?Não seria mais fácil testar as raízes do cubo? Comece com 20 (20 ** 3 = 8000) e suba para 30 (30 ** 3 = 27000). Então você tem que testar menos de 10 números inteiros.
fonte
n**(1/3)
é inteiro. Por exemplo, no meu computador, `10648 ** (1/3) = 21,999999999999996` em vez de22
: problem! Com o método desta resposta, não existe esse problema. Penso que esta é a única solução correta do ponto de vista matemático (outras soluções são corretas em Python).E se
fonte
As respostas acima funcionam para muitos casos, mas eles perdem alguns. Considere o seguinte:
Usando isso como referência, algumas das outras sugestões não obtêm o comportamento que podemos desejar:
Em vez disso, tente:
agora temos:
isclose
vem com o Python 3.5+ e, para outros Python, você pode usar essa definição basicamente equivalente (conforme mencionado no PEP correspondente )fonte
math.fsum([0.1] * 10) == 1
Apenas uma informação lateral,
is_integer
está fazendo internamente:fonte
Todas as respostas são boas, mas um método seguro de fogo seria
A função retorna True se for um número inteiro False .... Eu sei que estou um pouco atrasada, mas aqui está um dos métodos interessantes que eu criei ...
Edit: como declarado no comentário abaixo, um teste equivalente mais barato seria:
fonte
n % 1 == 0
. Nesse caso, você está realizando duas operações que são mais caras para um teste equivalente mais barato.fonte
Tente usar:
Isso dará muito mais precisão do que qualquer outro método.
fonte
Você pode usar a
round
função para calcular o valor.Sim, em python, como muitos apontaram quando calculamos o valor de uma raiz de cubo, ele fornecerá uma saída com um pouco de erro. Para verificar se o valor é um número inteiro, você pode usar a seguinte função:
Mas lembre-se de que isso
int(n)
é equivalentemath.floor
e, por isso, se você encontrar o resultadoint(41063625**(1.0/3.0))
, receberá 344 em vez de 345.Portanto, tenha cuidado ao usar as
int
raízes do cubo.fonte