PROLOG - Как округлить десятичные числа с плавающей запятой? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть эта строка в базе знаний:

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

, которая вычисляет один из катетов прямоугольного треугольника.

При запросе у Пролога значения Y, чтоэто катет, я получаю неточное число:

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

Но реальное значение равно 1/2, поэтому он должен вывести 0,5.Я предполагаю, что неточность из-за использования pi, но я хочу продолжать использовать его, так как я могу округлить Y до 0,5?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Одним из простых решений является использование format/2 до вывода числа с заданной «точностью».Например:

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

Обратите внимание, что поплавки будут постоянно приводить к таким проблемам, и, где это возможно, я рекомендую использовать, например, вместо рациональные числа .

0 голосов
/ 25 октября 2018

Я тоже пытаюсь выучить пролог.Встроенная функция округления идет только до ближайшего целого числа, поэтому я определил правило, которое расширяет его до округления до определенного числа цифр:

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.
...