Как преобразовать float в integer в пролог?преобразовать float в integer в пролог
Я пробовал:
?- integer(truncate(sqrt(9))).
false.
?- integer(round(sqrt(9))).
false.
Как преобразовать float в integer в пролог?преобразовать float в integer в пролог
Я пробовал:
?- integer(truncate(sqrt(9))).
false.
?- integer(round(sqrt(9))).
false.
Предикат integer/1
, который вы использовали верно тогда и только тогда ее аргумент является целым числом. Поскольку термин truncate(sqrt(9))
является не целого числа, предикат делает не захвата и поэтому терпит неудачу для этого срока.
Есть по крайней мере два способ, чтобы получить то, что вы хотите:
Вы можете использовать предикат (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'
Есть также другие проблемы, такие как ошибки округления и возможное недополнение.
Из-за присущие им недостатки чисел с плавающей точкой, я настоятельно рекомендую вам использовать более общих механизмы вместо этого. Например, несколько систем Prolog поддерживают рациональные номера и целые числа с неограниченной точностью, тогда как поплавки всегда ограничены точностью машины.
Если вам нужно целое квадратные корни, использовать, например конечных ограничений домена. С ограничениями, достаточно сказать, что имеет для целого X
, обозначающего положительный квадратный корень:
?- X*X #= 9, X #>= 0. X = 3.
Это также работает для больших целых чисел:
?- X*X #= 2^10000, X #>= 0. X = 1412467032...(1496 digits omitted)
См clpfd для больше информации.