浮点数 – 在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常用的排序方式权重分配 排序方式: 1、按类型 ...
原文:https://www.cnblogs.com/wenruo/p/9732704.html 先上...
css属性:word-wrap:break-word; 与 word-break:break-all 的...
https://destiny001.gitee.io/color/
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML...
css之background的cover和contain的缩放背景图 对于这两个属...