Wie konvertiert man Float zu Integer in Prolog?Convert Float zu Integer in Prolog
Ich habe versucht:
?- integer(truncate(sqrt(9))).
false.
?- integer(round(sqrt(9))).
false.
Wie konvertiert man Float zu Integer in Prolog?Convert Float zu Integer in Prolog
Ich habe versucht:
?- integer(truncate(sqrt(9))).
false.
?- integer(round(sqrt(9))).
false.
Das Prädikat integer/1
, die Sie iff ihr Argument eine ganze Zahl ist, ist wahr verwendet. Da der Begriff truncate(sqrt(9))
nicht eine ganze Zahl ist, hat das Prädikat nicht halten und daher nicht für diesen Begriff.
Es gibt mindestens zwei Möglichkeiten, zu bekommen, was Sie wollen:
Sie das Prädikat (is)/2
für die Konvertierung zwischen verschiedenen Zahlendarstellungen verwenden können. Insbesondere die Arithmetik Funktionenround
, truncate
und ceiling
überprüfen. Zum Beispiel:
?- X is round(sqrt(9)). X = 3.
Beachten Sie jedoch, dass Gleitkommazahlen mit immer höchst problematisch. Zum Beispiel:
?- X is sqrt(2^10000). ERROR: is/2: Arithmetic: evaluation error: `float_overflow'
Es gibt auch andere Probleme wie Rundungsfehler und möglichen Unterlauf.
Aufgrund der inhärenten Mängel von Gleitkommazahlen, empfehle ich Ihnen allgemeinere Mechanismen stattdessen verwenden. Zum Beispiel unterstützen mehrere Prolog-Systeme rationale Zahlen und ganze Zahlen mit unbegrenzter Genauigkeit, während Floats immer auf Maschinengenauigkeit beschränkt sind.
Wenn Sie integer Quadratwurzeln müssen, verwenden Sie beispielsweise endlichen Bereich Einschränkungen. Mit Einschränkungen genügt es zu sagen, was für eine ganze Zahl X
hält, die die positive quadratische Wurzel bezeichnet:
?- X*X #= 9, X #>= 0. X = 3.
Diese auch Werke für größere Zahlen:
?- X*X #= 2^10000, X #>= 0. X = 1412467032...(1496 digits omitted)
Siehe clpfd für Mehr Informationen.