프롤로그에서 float를 정수로 변환하는 방법은 무엇입니까? 프롤로그에서 부동 소수점을 정수로 변환
내가 시도 : 당신이 사용integer/1
이 참
?- integer(truncate(sqrt(9))).
false.
?- integer(round(sqrt(9))).
false.
프롤로그에서 float를 정수로 변환하는 방법은 무엇입니까? 프롤로그에서 부동 소수점을 정수로 변환
내가 시도 : 당신이 사용integer/1
이 참
?- integer(truncate(sqrt(9))).
false.
?- integer(round(sqrt(9))).
false.
술어 IFF 인수는 정수입니다. 용어 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 #= 9, X #>= 0. X = 3.
또한이 작품 :
?- X*X #= 2^10000, X #>= 0. X = 1412467032...(1496 digits omitted)
가 clpfd를 참조 제약, 그것은 가 긍정적 인 정사각형 루트를 나타냅니다 정수 X
에 대한을 보유하고 어떤 상태로 충분하다 자세한 정보.