PROLOG-如何舍入浮点数的小数?

时间:2018-10-25 01:06:55

标签: floating-point prolog prolog-toplevel

我在知识库中有这一行:

height(Hipot,Y) :- Y is sin(pi/6)*Hipot.

计算直角三角形的其中一根导管。

向Prolog询问Y(即导管)的值时,我得到了一个不正确的数字:

?- height(1,Y).
Y = 0.49999999999999994.

但实际值为1/2,因此应输出0.5。我猜这是由于使用了pi而引起的,但是我想继续使用它,那么如何将Y舍入到0.5?

3 个答案:

答案 0 :(得分:4)

一种简单的解决方案是使用 format/2 来以给定的“精度” 输出数字。例如:

?- height(1,Y), format("~2f", [Y]).
0.50
Y = 0.49999999999999994.

请注意,浮点数将始终导致此类问题,我建议尽可能使用例如有理数

答案 1 :(得分:3)

我也在尝试学习序言。内置的舍入函数仅舍入到最接近的整数,因此我定义了一条规则,将其扩展为舍入到一定位数:

round(X,Y,D) :- Z is X * 10^D, round(Z, ZA), Y is ZA / 10^D

我不确定它是否是惯用的,但它似乎可行:

?- round(5.5555, Y, 2).
Y = 5.56.

答案 2 :(得分:0)

通过使用format / 3,您可以输出到参数:

format(atom(A), '~2f', [Y]), writeln(A).