Comment faire pour convertir float en entier dans prolog?convertir float en entier dans prolog
J'ai essayé:
?- integer(truncate(sqrt(9))).
false.
?- integer(round(sqrt(9))).
false.
Comment faire pour convertir float en entier dans prolog?convertir float en entier dans prolog
J'ai essayé:
?- integer(truncate(sqrt(9))).
false.
?- integer(round(sqrt(9))).
false.
Le prédicat integer/1
que vous avez utilisé est vrai ssi son argument est un entier. Étant donné que le terme truncate(sqrt(9))
est pas un entier, le prédicat ne pas attente et donc ne pour ce terme .
Il y a au moins deux façons d'obtenir ce que vous voulez:
Vous pouvez utiliser le prédicat (is)/2
pour la conversion entre les différentes représentations numériques. En particulier, consultez les fonctions arithmétique round
, truncate
et ceiling
. Par exemple:
?- X is round(sqrt(9)). X = 3.
Cependant, notez que l'utilisation de nombres à virgule flottante est toujours très problématique . Par exemple:
?- X is sqrt(2^10000). ERROR: is/2: Arithmetic: evaluation error: `float_overflow'
Il existe également d'autres problèmes tels que des erreurs d'arrondi et un sous-dépassement possible.
En raison des lacunes inhérentes aux nombres à virgule flottante, je vous recommande fortement d'utiliser des mécanismes plus généraux au lieu. Par exemple, plusieurs systèmes Prolog prennent en charge les nombres rationnels et les entiers avec une précision illimitée, tandis que les flottants sont toujours limités à la précision de la machine.
Si vous avez besoin entier racines carrées, utilisez par exemple contraintes de domaine finis. Avec des contraintes, il suffit de dire ce que détient pour un entier X
qui indique la place positif racine:
?- X*X #= 9, X #>= 0. X = 3.
Cette aussi œuvres pour les entiers plus grands:
?- X*X #= 2^10000, X #>= 0. X = 1412467032...(1496 digits omitted)
Voir clpfd pour Plus d'information.