2011-03-01 5 views
0

Je crée un simple programme PHP qui effectue une action si (et seulement si) trois nombres aléatoires sont calculés en nombre entier. Les nombres aléatoires sont tous des entiers, créés avec la fonction rand(). Sans entrer dans les détails spécifiques du calcul, l'important (en termes de mon problème) est qu'il inclut la prise d'une racine carrée. N'étant pas un codeur PHP très expérimenté, la seule fonction racine carrée que je connaisse est sqrt(). Le problème est que sqrt() renvoie un float, même si l'entrée est un entier et que la sortie est exacte. J'ai brièvement pensé à convertir la sortie en nombre entier (en utilisant quelque chose comme intval(), mais cela ne fonctionnera pas car cela convertira toutes les sorties en entiers, ce qui rend le test inutile! Des idées sur la façon de faire cela? Merci .,php sqrt fonction qui renvoie un nombre entier?

+1

Vérifiez simplement si 'floor ($ num) == $ num'? Ou suis-je manquer quelque chose ... –

+2

Votre problème est un peu confus. –

+1

@Brad: Bonne réflexion en principe, mais '==' pour les flotteurs est presque toujours (lire: toujours) une mauvaise idée. Comparez en utilisant un delta. Voir par exemple http://stackoverflow.com/questions/4682889/is-floating-point-ever-ok – sleske

Répondre

4

Si vous voulez juste pour déterminer si elle est un carré parfait, déterminer exactement si le

intval(result) * intval(result) == originalValue 

Je ne sais pas la version php de ces fonctions, mais peut-être que vous faites? :)

+0

+1 Bonne idée. Notez que cela échouera probablement si 'value 'est un float (pas clair dans la question), car vous ne pouvez pas comparer les floats avec' == '(dans n'importe quelle langue). – sleske

+0

Oui, j'aime celui-ci. Cela fonctionnera car la valeur d'origine est un nombre entier. Merci! – Bill

3

C'est un problème commun lorsque vous travaillez avec virgule flottante Il suffit de vérifier que le flotteur vous obtenez est très proche d'un entier, cela se fait en vérifiant que la partie décimale est très faible:

if (abs(round(f)-f))<delta) 
    # do stuff 

deltadelta Ici, delta est une petite constante, telle que 0,0001, dont la valeur dépend de la proximité de votre résultat avec un nombre entier. Cela dépendra de vos calculs.

+0

C'est aussi une bonne idée (très "Calculusesque"!). Un bon truc à savoir. Je dois penser à quelle précision serait nécessaire ... – Bill

+0

@Bill: Merci. En fait, c'est plus l'analyse numérique que le calcul. Et oui, déterminer la précision est la partie difficile ... c'est ce que les gens qui font de l'analyse numérique passent parfois des années à déterminer ... – sleske

0

Quelque chose dans le sens de if($result % 1.0 == 0) pourrait fonctionner, mais je n'ai pas la capacité de le tester maintenant.

+0

Cela semble fonctionner, même si je ne suis pas sûr des problèmes à virgule flottante signalés par Sleske. – Bill

+0

-1 Cela ne fonctionne pas. L'opérateur '%' de PHP ne fonctionne qu'avec des entiers. Ainsi '$ resultat% 1.0' retournera 0 pour n'importe quelle entrée. Vous voulez la fonction 'fmod' (module point flottant).Mais même alors, vous ne devriez pas comparer le résultat en utilisant '==', car cela n'est presque jamais sûr pour les nombres fp. Voir par exemple http://stackoverflow.com/questions/4682889/is-floating-point-ever-ok – sleske

0

$result % 1e9 retournera une partie entière de $ result (pour les négatifs il trouvera le plafond du résultat). Mais c'est un hack, donc vous pourriez l'utiliser seulement pour le plaisir.

https://repl.it/Chqm/1

0

Cette connaissance est de la programmation dans une autre langue, mais avez-vous essayé de multiplier l'expression par 1. par exemple si vous avez besoin pour obtenir l'entier de quelque chose comme a = 3,45 * 8;

faites ceci a = 3,45 * 8 * 1;

Questions connexes