J'essaie de trouver la plus grande racine cubique qui soit un nombre entier, c'est-à-dire moins de 12 000.
processing = True
n = 12000
while processing:
n -= 1
if n ** (1/3) == #checks to see if this has decimals or not
Je ne sais pas comment vérifier s'il s'agit d'un nombre entier ou non! Je pourrais le convertir en chaîne, puis utiliser l'indexation pour vérifier les valeurs finales et voir si elles sont nulles ou non, cela semble plutôt lourd. Existe-t-il un moyen plus simple?
python
floating-point
chopper draw lion4
la source
la source
Réponses:
Pour vérifier si une valeur flottante est un nombre entier, utilisez la
float.is_integer()
méthode :La méthode a été ajoutée au
float
type dans Python 2.6.Tenez compte du fait qu'en Python 2,
1/3
is0
(division au sol pour les opérandes entiers!), Et que l'arithmétique à virgule flottante peut être imprécise (afloat
est une approximation utilisant des fractions binaires, pas un nombre réel précis). Mais en ajustant un peu votre boucle, cela donne:ce qui signifie que tout ce qui dépasse 3 cubes (dont 10648) a été oublié en raison de l'imprécision susmentionnée:
Vous devez plutôt rechercher des nombres proches du nombre entier ou ne pas utiliser
float()
pour trouver votre numéro. Comme arrondir la racine cubique de12000
:Si vous utilisez Python 3.5 ou une version plus récente, vous pouvez utiliser la
math.isclose()
fonction pour voir si une valeur à virgule flottante se trouve dans une marge configurable:Pour les versions plus anciennes, l'implémentation naïve de cette fonction (ignorer la vérification des erreurs et ignorer l'infini et NaN) comme mentionné dans PEP485 :
la source
True
s'il n'y a pas de décimales du tout. Il peut y avoir un malentendu de la part du PO au sujet de l'arithmétique en virgule flottante et de la précision, bien sûr.1.0000000000000001
est affiché car1.0
, en 3, la représentation de chaîne la plus courte qui produit la même valeur est affichée.range(12000, -1, -1)
pourriez être (imo, plus proprement) réécrit commereversed(range(12000+1))
Nous pouvons utiliser l'opérateur modulo (%). Cela nous dit combien de restes nous avons lorsque nous divisons x par y - exprime comme
x % y
. Chaque nombre entier doit être divisé par 1, donc s'il y a un reste, il ne doit pas être un nombre entier.Cette fonction renverra un booléen
True
ouFalse
, selon qu'iln
s'agit d'un nombre entier.la source
Vous pouvez utiliser ceci:
la source
.is_integer()
continuant à fonctionner.is_integer
utilise une méthode similaire (o = (floor(x) == x) ? Py_True : Py_False;
). Mais je suis d'accord, il faut utiliseris_integer()
car c'est beaucoup plus clair.large_float == large_int
peut échouer même silarge_float == float(large_int)
.123456789012345678901234567890.0 != 123456789012345678901234567890
mais123456789012345678901234567890.0 == float(123456789012345678901234567890)
k = 123456789012345678901234567890.0
alorsk == int(k)
est vrai, ce qui est la bonne réponse.Vous n'avez pas besoin de boucler ou de vérifier quoi que ce soit. Prenez simplement une racine cubique de 12 000 et arrondissez-la:
la source
Vous pouvez utiliser une opération modulo pour cela.
la source
n
est 6.2, 6.0, 6.12312412, nous l'avons tous"We have a decimal number here!"
?Ne serait-il pas plus facile de tester les racines cubiques? Commencez avec 20 (20 ** 3 = 8000) et montez jusqu'à 30 (30 ** 3 = 27000). Ensuite, vous devez tester moins de 10 entiers.
la source
n**(1/3)
est entier. Par exemple sur mon ordinateur `10648 ** (1/3) = 21.99999999999999696 au lieu de22
: problème! Avec la méthode de cette réponse, il n'y a pas un tel problème. Je pense que c'est la seule solution correcte d'un point de vue mathématique (d'autres solutions sont correctes en Python).Que diriez-vous
la source
Les réponses ci-dessus fonctionnent pour de nombreux cas, mais elles en manquent. Considérer ce qui suit:
En utilisant cela comme référence, certaines des autres suggestions n'obtiennent pas le comportement que nous pourrions souhaiter:
Essayez plutôt:
maintenant on obtient:
isclose
est livré avec Python 3.5+ , et pour d'autres Python, vous pouvez utiliser cette définition essentiellement équivalente (comme mentionné dans le PEP correspondant )la source
math.fsum([0.1] * 10) == 1
Juste une info latérale,
is_integer
fait en interne:la source
Toutes les réponses sont bonnes mais une méthode de tir sûre serait
La fonction renvoie True si c'est un nombre entier sinon False .... Je sais que je suis un peu en retard mais voici une des méthodes intéressantes que j'ai faites ...
Edit: comme indiqué par le commentaire ci-dessous, un test équivalent moins cher serait:
la source
n % 1 == 0
. Dans ce cas, vous effectuez deux opérations, ce qui est plus cher pour un test équivalent moins cher.la source
Essayez d'utiliser:
Cela donnera beaucoup plus de précision que toute autre méthode.
la source
Vous pouvez utiliser la
round
fonction pour calculer la valeur.Oui en python comme beaucoup l'ont souligné lorsque nous calculons la valeur d'une racine de cube, cela vous donnera une sortie avec un peu d'erreur. Pour vérifier si la valeur est un nombre entier, vous pouvez utiliser la fonction suivante:
Mais rappelez-vous que cela
int(n)
équivaut àmath.floor
et à cause de cela, si vous trouvez le,int(41063625**(1.0/3.0))
vous obtiendrez 344 au lieu de 345.Soyez donc prudent lorsque vous utilisez des
int
racines cubiques.la source