x를 표준 언어 ML에서 17의 거듭 제곱으로 계산하는 간단한 절차를 작성하려고합니다. 나는 "도움 절차"로 그것을하기로되어 있습니다 :SML 오버플로 : 지수 입력 절차
fun help (y:int) = y * y * y * y;
fun power17 (x:int) = help (help (help (help (x)))) * x;
이것은 오버 플로우를 유발합니다. 누군가가 왜 그렇게하는지 말해 줄 수 있습니까?
x를 표준 언어 ML에서 17의 거듭 제곱으로 계산하는 간단한 절차를 작성하려고합니다. 나는 "도움 절차"로 그것을하기로되어 있습니다 :SML 오버플로 : 지수 입력 절차
fun help (y:int) = y * y * y * y;
fun power17 (x:int) = help (help (help (help (x)))) * x;
이것은 오버 플로우를 유발합니다. 누군가가 왜 그렇게하는지 말해 줄 수 있습니까?
정수 오버플로가 발생합니다. 코드를 작동 시키려면 을 사용해야합니다.
fun help (y: LargeInt.int) = y * y * y * y;
fun power17 (x: int) =
let
val x' = Int.toLarge x
in
help (help (help (help (x')))) * x'
end;
한가지 더, 그 코드는 대신이 x ** 257
을하고있어, x ** 17
을 계산하지 않습니다.
fun power17 (x:int) = (help (help x)) * x;
귀하의 기능을 평가 (17)의 힘을 계산하지 않습니다 :
당신은 두 번 help
를 호출해야합니다
fun power17 x = help x * help x * help x * help x * x
:
power17 2 ~> help (help (help (help x))) * 2
~> help (help (help (2 * 2 * 2 * 2))) * 2 (* that's 2^5 *)
~> help (help (help (8))) * 2
~> help (help (8 * 8 * 8 * 8)) * 2 (* that's 2^13 *)
~> help (help (4096)) * 2
~> help (4096 * 4096 * 4096 * 4096) * 2 (* that's 2^49 *)
~> raise Overflow (* most SML compilers have 32-bit ints *)
아마도 당신이 쓰는 의미
이것은 재귀를위한 이상적인 경우 인 것처럼 들린다 :
fun power (x, 0) = 1
| power (x, n) = x * power (x, n-1)
fun power17 x = power (x, 17)