浮点数 – 在prolog中将float转换为整数

前端之家收集整理的这篇文章主要介绍了浮点数 – 在prolog中将float转换为整数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何在prolog中将float转换为整数?

我试过了:

?- integer(truncate(sqrt(9))).
false.

?- integer(round(sqrt(9))).
false.

解决方法

如果其参数是整数,则使用的谓词整数/ 1为真.由于术语truncate(sqrt(9))不是整数,因此谓词不成立,因此该术语失败.

至少有两种方法可以满足您的需求:

解决方案1:快速而破碎

您可以使用谓词(is)/ 2进行不同数字表示之间的转换.特别是,检查算术函数round,truncate和ceiling.例如:

?- X is round(sqrt(9)).
X = 3.

但请注意,使用浮点数始终存在很大问题.例如:

?- X is sqrt(2^10000).
ERROR: is/2: Arithmetic: evaluation error: `float_overflow'

还有其他问题,例如舍入错误和可能的下溢.

解决方案2:快速而通用

由于浮点数的固有缺点,我强烈建议您使用更通用的机制.例如,几个Prolog系统支持具有无界精度的有理数和整数,而浮点数总是限于机器精度.

如果需要整数平方根,请使用例如有限域约束.对于约束,只需说明表示正平方根的整数X的含义:

?- X*X #= 9,X #>= 0.
X = 3.

这也适用于更大的整数:

?- X*X #= 2^10000,X #>= 0.
X = 1412467032...(1496 digits omitted)

有关更多信息,请参见clpfd.

猜你在找的CSS相关文章