在序言中将浮点数转换为整数

问题描述 投票:7回答:2

如何在序言中将float转换为整数?

我尝试过:

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

?- integer(round(sqrt(9))).
false.
floating-point integer prolog clpfd
2个回答
16
投票

您使用的谓词integer/1为true iff,其参数为整数。由于项truncate(sqrt(9))not整数,因此谓词不存在not,因此该项失败

至少有两种方法可以得到想要的东西:

解决方案1:快速且损坏

您可以使用谓词(is)/2在不同的数字表示形式之间进行转换。特别要检查算术功能 roundtruncateceiling。例如:

α-X是圆形的(sqrt(9))。X = 3。

但是,请注意,使用浮点数总是严重问题

。例如:
?-X是sqrt(2 ^ 10000)。错误:是/ 2:算术:评估错误:`float_overflow'

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

解决方案2:快速而通用

由于浮点数的固有缺点,我强烈建议您改用更多通用机制。例如,一些Prolog系统支持rational number和具有无限精度的整数,而浮点数始终限于机器精度。

如果需要整数

平方根,请使用例如有限域约束。有了约束,就足以说明整数X表示正平方根的保持项:
?-X * X#= 9,X#> = 0。X = 3。

also

适用于较大的整数:
?-X * X#= 2 ^ 10000,X#> = 0。X = 1412467032 ...(省略1496个数字)

请参见以获取更多信息。


0
投票

许多Prolog系统提供了附加的可评估函数integer / 1,与可评估函数truncate / 1相比,它返回​​一个整数而不是浮点数。在ISO核心标准中找不到此功能。

© www.soinside.com 2019 - 2024. All rights reserved.