OCaml 언어에서 쓸 수 있는 bigint 타입은 Big_Int 모듈의 것과 Num 모듈의 것 두 가지 종류가 있다. Num 모듈의 것은 유리수 계산에도 쓸 수 있는 타입이지만 그 대신 속도가 느리고, Big_int 모듈의 것은 사칙연산자 마저도 정의 되어 있지 않아 사용하는데는 불편하지만 다소 더 빠르다. 그래도 Java 언어의 java.math.BigInteger 보다는 많이 느리다.
OCaml 언어의 타입 체크는 C 언어나 Java 언어 보다도 훨씬 엄격하며, int, int32, int64 간의 오토박싱, 언박싱은 아예 지원되지 않으며 항상 명시적인 타입 변환을 해주어야 한다.
사칙 연산 기호 마저도
int 타입이면 + - * /
float 타입이면 +. -. *. /.
Num.Int 또는 Num.Ratio 타입이면 +/ -/ */ //
처럼 서로 다르게 사용하며, 크기 비교 연산자도
int 타입이면 = < > <= >=
float 타입이면 =. <. >. <= . >=.
Num.Int 또는 Num.Rat 타입이면 =/ </ >/ <=/ >=/
처럼 서로 다르게 사용한다.
1) 대화형 도구 ocaml 명령으로 Big_int 모듈을 사용하는 예
명령 프롬프트> ocaml nums.cma
Objective Caml version 3.12.1
# 100L ;;
- : int64 = 100L
# 100l ;;
- : int32 = 100l
# 100 ;;
- : int = 100
# let a = 100L ;;
val a : int64 = 100L
# let b = Int64.to_int a ;;
val b : int = 100
# let c = Big_int.big_int_of_int b ;;
val c : Big_int.big_int = <abstr>
# string_of_big_int c ;;
Characters 0-17:
string_of_big_int c ;;
^^^^^^^^^^^^^^^^^
Error: Unbound value string_of_big_int
# Big_int.string_of_big_int c ;;
- : string = "100"
# Big_int.int_of_big_int c ;;
- : int = 100
# Big_int.power_big_int_positive_int c 5 ;;
- : Big_int.big_int = <abstr>
# Big_int.string_of_big_int (Big_int.power_big_int_positive_int c 5) ;;
- : string = "10000000000"
# Big_int.int64_of_big_int (Big_int.power_big_int_positive_int c 5) ;;
- : int64 = 10000000000L
# Big_int.int32_of_big_int (Big_int.power_big_int_positive_int c 5) ;;
Exception: Failure "nativeint_of_big_int".
# Big_int.int_of_big_int (Big_int.power_big_int_positive_int c 5) ;;
Exception: Failure "int_of_big_int".
# open Big_int ;;
# a ;;
- : int64 = 100L
# b ;;
- : int = 100
# let c = big_int_of_int b ;;
val c : Big_int.big_int = <abstr>
# string_of_big_int c ;;
- : string = "100"
# int64_of_big_int c ;;
- : int64 = 100L
# int32_of_big_int c ;;
- : int32 = 100l
# int_of_big_int c ;;
- : int = 100
# power_big_int_positive_int c 5 ;;
- : Big_int.big_int = <abstr>
# string_of_big_int (power_big_int_positive_int c 5) ;;
- : string = "10000000000"
# int64_of_big_int (power_big_int_positive_int c 5) ;;
- : int64 = 10000000000L
# int32_of_big_int (power_big_int_positive_int c 5) ;;
Exception: Failure "nativeint_of_big_int".
# int_of_big_int (power_big_int_positive_int c 5) ;;
Exception: Failure "int_of_big_int".
# #quit;;
2) 대화형 도구 ocaml 명령으로 Num 모듈을 사용하는 예
명령 프롬프트> ocaml nums.cma
Objective Caml version 3.12.1
# let a = 100L ;;
val a : int64 = 100L
# let b = Int64.to_int a ;;
val b : int = 100
# let c = Num.num_of_int b ;;
val c : Num.num = Num.Int 100
# string_of_num c ;;
Characters 0-13:
string_of_num c ;;
^^^^^^^^^^^^^
Error: Unbound value string_of_num
# Num.string_of_num c ;;
- : string = "100"
# int_of_num c ;;
Characters 0-10:
int_of_num c ;;
^^^^^^^^^^
Error: Unbound value int_of_num
# Num.int_of_num c ;;
- : int = 100
# Int32.of_int (Num.int_of_num c) ;;
- : int32 = 100l
# Int64.of_int (Num.int_of_num c) ;;
- : int64 = 100L
# c **/ (Num.num_of_int 5) ;;
Characters 2-5:
c **/ (Num.num_of_int 5) ;;
^^^
Error: Unbound value **/
# Num.string_of_num (Num.power_num c (Num.num_of_int 5)) ;;
- : string = "10000000000"
# Int64.of_string (Num.string_of_num (Num.power_num c (Num.num_of_int 5)) ) ;;
- : int64 = 10000000000L
# Int32.of_string (Num.string_of_num (Num.power_num c (Num.num_of_int 5)) ) ;;
Exception: Failure "int_of_string".
# Int.of_string (Num.string_of_num (Num.power_num c (Num.num_of_int 5)) ) ;;
Characters 0-13:
Int.of_string (Num.string_of_num (Num.power_num c (Num.num_of_int 5)) ) ;;
^^^^^^^^^^^^^
Error: Unbound module Int
# open Num ;;
# a ;;
- : int64 = 100L
# b ;;
- : int = 100
# let c = num_of_int b ;;
val c : Num.num = Int 100
# string_of_num c ;;
- : string = "100"
# int_of_num c ;;
- : int = 100
# Int64.of_int (int_of_num c) ;;
- : int64 = 100L
# Int32.of_int (int_of_num c) ;;
- : int32 = 100l
# c **/ (num_of_int 5) ;;
- : Num.num = Big_int <abstr>
# string_of_num (c **/ (num_of_int 5)) ;;
- : string = "10000000000"
# Int64.of_string (string_of_num (c **/ (num_of_int 5))) ;;
- : int64 = 10000000000L
# power_num c (num_of_int 5) ;;
- : Num.num = Big_int <abstr>
# string_of_num( power_num c (num_of_int 5)) ;;
- : string = "10000000000"
# Int64.of_string (string_of_num( power_num c (num_of_int 5))) ;;
- : int64 = 10000000000L
# #quit ;;
3) 대화형 도구 ocaml 명령으로 Num 모듈의 Int 타입과 Ratio 타입을 구별하는 예
명령 프롬프트> ocaml nums.cma
Objective Caml version 3.12.1
# open Num ;;
# let a = num_of_int 5 ;;
val a : Num.num = Int 5
# let b = num_of_string "1/5" ;;
val b : Num.num = Ratio <abstr>
# let is_ratio = function
| Num.Ratio _ -> true
| _ -> false ;;
val is_ratio : Num.num -> bool = <fun>
# is_ratio b ;;
- : bool = true
# is_ratio a ;;
- : bool = false
# let is_num_int = function
| Num.Int _ -> true
| _ -> false ;;
val is_num_int : Num.num -> bool = <fun>
# is_num_int b ;;
- : bool = false
# is_num_int a ;;
- : bool = true
# a +/ b ;;
- : Num.num = Ratio <abstr>
# string_of_num (a +/ b ) ;;
- : string = "26/5"
# string_of_num (a */ b ) ;;
- : string = "1"
# string_of_num (a -/ b ) ;;
- : string = "24/5"
# string_of_num (a // b ) ;;
- : string = "25"
# a ==/ b ;; (* 비교 연산자 오류 *)
Characters 2-5:
a ==/ b ;;
^^^
Error: Unbound value ==/
# b >= a ;; (* 비교 연산자 오류 *)
- : bool = true
# string_of_num (b -/ a ) ;;
- : string = "-24/5"
# a =/ b ;; (* 비교 연산자 정상 *)
- : bool = false
# a </ b ;; (* 비교 연산자 정상 *)
- : bool = false
# a <=/ b ;; (* 비교 연산자 정상 *)
- : bool = false
# a >=/ b ;; (* 비교 연산자 정상 *)
- : bool = true
# a >/ b ;; (* 비교 연산자 정상 *)
- : bool = true
# #quit ;;
'프로그래밍 > OCaml' 카테고리의 다른 글
OCaml 언어로 평방근, 입방근, n제곱근 구하는 함수를 구현하고 테스트하기 (0) | 2013.02.06 |
---|---|
30000! 빨리 계산하기 with OCaml (0) | 2013.02.06 |
Pollard's rho method 소개: 정수의 인수분해(factorizing integers) with OCaml (0) | 2013.02.02 |
스트링 리스트에서 스트링 찾기(find) with OCaml (0) | 2013.02.02 |
스트링 배열 정렬(sorting)하기 with OCaml (0) | 2013.02.02 |