PROLOG - 如何舍入浮点数的小数?
PROLOG - How to round decimals of floating point numbers?
我在知识库中有这一行:
height(Hipot,Y) :- Y is sin(pi/6)*Hipot.
计算直角三角形的直角之一。
当向 Prolog 询问 Y
的值时,即 cathetus,我得到一个不准确的数字:
?- height(1,Y).
Y = 0.49999999999999994.
但实际值为1/2,所以应该输出0.5。我猜不准确是因为使用了 pi
,但我想继续使用它,所以如何将 Y
舍入到 0.5?
我也在努力学习序言。内置的舍入函数只求最接近的整数,所以我定义了一个规则,将其扩展为舍入到一定位数:
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.
一个直接的解决方案是使用format/2
来输出具有给定"precision"的数字.例如:
?- height(1,Y), format("~2f", [Y]).
0.50
Y = 0.49999999999999994.
请注意,浮点数总是会导致此类问题,因此我建议尽可能使用 有理数。
通过使用format/3你可以输出到一个参数:
format(atom(A), '~2f', [Y]), writeln(A).
我在知识库中有这一行:
height(Hipot,Y) :- Y is sin(pi/6)*Hipot.
计算直角三角形的直角之一。
当向 Prolog 询问 Y
的值时,即 cathetus,我得到一个不准确的数字:
?- height(1,Y).
Y = 0.49999999999999994.
但实际值为1/2,所以应该输出0.5。我猜不准确是因为使用了 pi
,但我想继续使用它,所以如何将 Y
舍入到 0.5?
我也在努力学习序言。内置的舍入函数只求最接近的整数,所以我定义了一个规则,将其扩展为舍入到一定位数:
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.
一个直接的解决方案是使用format/2
来输出具有给定"precision"的数字.例如:
?- height(1,Y), format("~2f", [Y]). 0.50 Y = 0.49999999999999994.
请注意,浮点数总是会导致此类问题,因此我建议尽可能使用 有理数。
通过使用format/3你可以输出到一个参数:
format(atom(A), '~2f', [Y]), writeln(A).