Sophie

Sophie

distrib > Fedora > 16 > i386 > by-pkgid > 6ee88d560297f893c9cd4a461d21a500 > files > 5

ocaml-mlgmpidl-1.1-7.fc15.src.rpm

open Format;;

(* Minor test from each of the GMP, MPFR modules*)

(* Mpz - integer functions *)

let a = Mpz.init_set_si 2 in
let b = Mpz.init_set_si 3 in
let c = Mpz.init () in
Mpz.add c a b;
Mpz.print std_formatter c;
print_newline ();;

(* Mpq - rational functions *)

let a = Mpq.init () in
let b = Mpq.init () in
let c = Mpq.init () in
let num = Mpz.init () in
Mpq.set_si a 2 3;
Mpq.set_si b 3 4;
Mpq.mul c a b;
Mpq.print std_formatter c; (* We get 1/2 -> appears to "auto-canonicalize"... even internally? *)
print_newline ();
Mpq.get_num num c;
Mpz.print std_formatter num; (* And we get 1 here too... *)
print_newline ();;

(* Mpf - multiprecision floating-point *)

let a = Mpf.init () in
let b = Mpf.init () in
let c = Mpf.init () in
Mpf.set_si a 2;
Mpf.set_si b 3;
Mpf.div c a b;
printf "%.3f" (Mpf.get_d c);
print_newline();;

(* Mpfr - multiprecision floating-point w/rounding *)
(* MPFR library, not GMP library *)

(* Create binary string from floating point number less than 1 *)
(* Use this to test the rounding of Mpfr - the printing function
    they have wasn't working as expected *)
let mpfr_to_bin_str x =
  let (_,one) = Mpfr.init_set_si 1 Mpfr.Near in
  let rec mpfr_to_bin_str_helper x s =
    if Mpfr.cmp_si x 0 = 0 then
      s
    else
      let sp = if Mpfr.cmp_si x 1 >= 0 then
	(let _ = Mpfr.sub x x one Mpfr.Near in "1")
      else
        "0"
      in
      let _ = Mpfr.mul_2si x x 1 Mpfr.Near in
      mpfr_to_bin_str_helper x (s ^ sp) in
  mpfr_to_bin_str_helper x "";;

let a = Mpfr.init() in
let b = Mpfr.init() in
let c = Mpfr.init2 3 in
let _ = Mpfr.set_si a 6875 Mpfr.Near in (* 6875/10000 = 0.1011 in base 2 *)
let _ = Mpfr.set_si b 10000 Mpfr.Near in
let _ = Mpfr.div c a b Mpfr.Near in (* Should round to 0.1100 in precision three *)
print_string (mpfr_to_bin_str c);
print_newline();
let _ = Mpfr.div c a b Mpfr.Down in (* Should round to 0.1010 in precision three *)
print_string (mpfr_to_bin_str c);;