如何在序言中将float转换为整数?
我尝试过:
?- integer(truncate(sqrt(9))).
false.
?- integer(round(sqrt(9))).
false.
您使用的谓词integer/1
为true iff,其参数为整数。由于项truncate(sqrt(9))
是not整数,因此谓词不存在not,因此该项失败。
至少有两种方法可以得到想要的东西:
您可以使用谓词(is)/2
在不同的数字表示形式之间进行转换。特别要检查算术功能 round
,truncate
和ceiling
。例如:
α-X是圆形的(sqrt(9))。X = 3。。例如:但是,请注意,使用浮点数总是严重问题
?-X是sqrt(2 ^ 10000)。错误:是/ 2:算术:评估错误:`float_overflow'还有其他一些问题,例如舍入错误和可能的下溢。
由于浮点数的固有缺点,我强烈建议您改用更多通用机制。例如,一些Prolog系统支持rational number和具有无限精度的整数,而浮点数始终限于机器精度。
如果需要整数
平方根,请使用例如有限域约束。有了约束,就足以说明整数X
表示正平方根的保持项:?-X * X#= 9,X#> = 0。X = 3。适用于较大的整数:此also
?-X * X#= 2 ^ 10000,X#> = 0。X = 1412467032 ...(省略1496个数字)请参见clpfd以获取更多信息。
许多Prolog系统提供了附加的可评估函数integer / 1,与可评估函数truncate / 1相比,它返回一个整数而不是浮点数。在ISO核心标准中找不到此功能。