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

 

 

Posted by Scripter
,