summaryrefslogtreecommitdiffstats
path: root/otherlibs/num/ratio.ml
diff options
context:
space:
mode:
authorDamien Doligez <damien.doligez-inria.fr>2010-01-22 12:48:24 +0000
committerDamien Doligez <damien.doligez-inria.fr>2010-01-22 12:48:24 +0000
commit04b1656222698bd7e92f213e9a718b7a4185643a (patch)
tree6186d1ba1e00adb1232908f95cb92c299902a943 /otherlibs/num/ratio.ml
parentbdc0fadee2dc9669818955486b4c3497016edda5 (diff)
clean up spaces and tabs
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@9547 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'otherlibs/num/ratio.ml')
-rw-r--r--otherlibs/num/ratio.ml184
1 files changed, 92 insertions, 92 deletions
diff --git a/otherlibs/num/ratio.ml b/otherlibs/num/ratio.ml
index e587efe3e..7885df15d 100644
--- a/otherlibs/num/ratio.ml
+++ b/otherlibs/num/ratio.ml
@@ -17,18 +17,18 @@ open Big_int
open Arith_flags
(* Definition of the type ratio :
- Conventions :
- - the denominator is always a positive number
- - the sign of n/0 is the sign of n
-These convention is automatically respected when a ratio is created with
+ Conventions :
+ - the denominator is always a positive number
+ - the sign of n/0 is the sign of n
+These convention is automatically respected when a ratio is created with
the create_ratio primitive
*)
-type ratio = { mutable numerator : big_int;
- mutable denominator : big_int;
+type ratio = { mutable numerator : big_int;
+ mutable denominator : big_int;
mutable normalized : bool}
-let failwith_zero name =
+let failwith_zero name =
let s = "infinite or undefined rational number" in
failwith (if String.length name = 0 then s else name ^ " " ^ s)
@@ -37,18 +37,18 @@ and denominator_ratio r = r.denominator
let null_denominator r = sign_big_int r.denominator = 0
-let verify_null_denominator r =
+let verify_null_denominator r =
if sign_big_int r.denominator = 0
then (if !error_when_null_denominator_flag
then (failwith_zero "")
else true)
else false
-let sign_ratio r = sign_big_int r.numerator
+let sign_ratio r = sign_big_int r.numerator
(* Physical normalization of rational numbers *)
(* 1/0, 0/0 and -1/0 are the normalized forms for n/0 numbers *)
-let normalize_ratio r =
+let normalize_ratio r =
if r.normalized then r
else if verify_null_denominator r then begin
r.numerator <- big_int_of_int (sign_big_int r.numerator);
@@ -56,12 +56,12 @@ let normalize_ratio r =
r
end else begin
let p = gcd_big_int r.numerator r.denominator in
- if eq_big_int p unit_big_int
+ if eq_big_int p unit_big_int
then begin
r.normalized <- true; r
end else begin
- r.numerator <- div_big_int (r.numerator) p;
- r.denominator <- div_big_int (r.denominator) p;
+ r.numerator <- div_big_int (r.numerator) p;
+ r.denominator <- div_big_int (r.denominator) p;
r.normalized <- true; r
end
end
@@ -73,24 +73,24 @@ let cautious_normalize_ratio_when_printing r =
if (!normalize_ratio_when_printing_flag) then (normalize_ratio r) else r
let create_ratio bi1 bi2 =
- match sign_big_int bi2 with
+ match sign_big_int bi2 with
-1 -> cautious_normalize_ratio
- { numerator = minus_big_int bi1;
+ { numerator = minus_big_int bi1;
denominator = minus_big_int bi2;
normalized = false }
- | 0 -> if !error_when_null_denominator_flag
+ | 0 -> if !error_when_null_denominator_flag
then (failwith_zero "create_ratio")
- else cautious_normalize_ratio
+ else cautious_normalize_ratio
{ numerator = bi1; denominator = bi2; normalized = false }
- | _ -> cautious_normalize_ratio
+ | _ -> cautious_normalize_ratio
{ numerator = bi1; denominator = bi2; normalized = false }
let create_normalized_ratio bi1 bi2 =
match sign_big_int bi2 with
- -1 -> { numerator = minus_big_int bi1;
- denominator = minus_big_int bi2;
+ -1 -> { numerator = minus_big_int bi1;
+ denominator = minus_big_int bi2;
normalized = true }
-| 0 -> if !error_when_null_denominator_flag
+| 0 -> if !error_when_null_denominator_flag
then failwith_zero "create_normalized_ratio"
else { numerator = bi1; denominator = bi2; normalized = true }
| _ -> { numerator = bi1; denominator = bi2; normalized = true }
@@ -99,10 +99,10 @@ let is_normalized_ratio r = r.normalized
let report_sign_ratio r bi =
if sign_ratio r = -1
- then minus_big_int bi
+ then minus_big_int bi
else bi
-let abs_ratio r =
+let abs_ratio r =
{ numerator = abs_big_int r.numerator;
denominator = r.denominator;
normalized = r.normalized }
@@ -114,17 +114,17 @@ let is_integer_ratio r =
let add_ratio r1 r2 =
if !normalize_ratio_flag then begin
- let p = gcd_big_int ((normalize_ratio r1).denominator)
+ let p = gcd_big_int ((normalize_ratio r1).denominator)
((normalize_ratio r2).denominator) in
- if eq_big_int p unit_big_int then
- {numerator = add_big_int (mult_big_int (r1.numerator) r2.denominator)
+ if eq_big_int p unit_big_int then
+ {numerator = add_big_int (mult_big_int (r1.numerator) r2.denominator)
(mult_big_int (r2.numerator) r1.denominator);
denominator = mult_big_int (r1.denominator) r2.denominator;
normalized = true}
else begin
let d1 = div_big_int (r1.denominator) p
and d2 = div_big_int (r2.denominator) p in
- let n = add_big_int (mult_big_int (r1.numerator) d2)
+ let n = add_big_int (mult_big_int (r1.numerator) d2)
(mult_big_int d1 r2.numerator) in
let p' = gcd_big_int n p in
{ numerator = div_big_int n p';
@@ -132,7 +132,7 @@ let add_ratio r1 r2 =
normalized = true }
end
end else
- { numerator = add_big_int (mult_big_int (r1.numerator) r2.denominator)
+ { numerator = add_big_int (mult_big_int (r1.numerator) r2.denominator)
(mult_big_int (r1.denominator) r2.numerator);
denominator = mult_big_int (r1.denominator) r2.denominator;
normalized = false }
@@ -142,13 +142,13 @@ let minus_ratio r =
denominator = r.denominator;
normalized = r.normalized }
-let add_int_ratio i r =
+let add_int_ratio i r =
ignore (cautious_normalize_ratio r);
{ numerator = add_big_int (mult_int_big_int i r.denominator) r.numerator;
denominator = r.denominator;
normalized = r.normalized }
-let add_big_int_ratio bi r =
+let add_big_int_ratio bi r =
ignore (cautious_normalize_ratio r);
{ numerator = add_big_int (mult_big_int bi r.denominator) r.numerator ;
denominator = r.denominator;
@@ -158,15 +158,15 @@ let sub_ratio r1 r2 = add_ratio r1 (minus_ratio r2)
let mult_ratio r1 r2 =
if !normalize_ratio_flag then begin
- let p1 = gcd_big_int ((normalize_ratio r1).numerator)
- ((normalize_ratio r2).denominator)
+ let p1 = gcd_big_int ((normalize_ratio r1).numerator)
+ ((normalize_ratio r2).denominator)
and p2 = gcd_big_int (r2.numerator) r1.denominator in
- let (n1, d2) =
- if eq_big_int p1 unit_big_int
+ let (n1, d2) =
+ if eq_big_int p1 unit_big_int
then (r1.numerator, r2.denominator)
else (div_big_int (r1.numerator) p1, div_big_int (r2.denominator) p1)
and (n2, d1) =
- if eq_big_int p2 unit_big_int
+ if eq_big_int p2 unit_big_int
then (r2.numerator, r1.denominator)
else (div_big_int r2.numerator p2, div_big_int r1.denominator p2) in
{ numerator = mult_big_int n1 n2;
@@ -177,15 +177,15 @@ let mult_ratio r1 r2 =
denominator = mult_big_int (r1.denominator) r2.denominator;
normalized = false }
-let mult_int_ratio i r =
+let mult_int_ratio i r =
if !normalize_ratio_flag then
begin
let p = gcd_big_int ((normalize_ratio r).denominator) (big_int_of_int i) in
- if eq_big_int p unit_big_int
+ if eq_big_int p unit_big_int
then { numerator = mult_big_int (big_int_of_int i) r.numerator;
denominator = r.denominator;
normalized = true }
- else { numerator = mult_big_int (div_big_int (big_int_of_int i) p)
+ else { numerator = mult_big_int (div_big_int (big_int_of_int i) p)
r.numerator;
denominator = div_big_int (r.denominator) p;
normalized = true }
@@ -195,8 +195,8 @@ let mult_int_ratio i r =
denominator = r.denominator;
normalized = false }
-let mult_big_int_ratio bi r =
- if !normalize_ratio_flag then
+let mult_big_int_ratio bi r =
+ if !normalize_ratio_flag then
begin
let p = gcd_big_int ((normalize_ratio r).denominator) bi in
if eq_big_int p unit_big_int
@@ -221,24 +221,24 @@ let square_ratio r =
let inverse_ratio r =
if !error_when_null_denominator_flag && (sign_big_int r.numerator) = 0
then failwith_zero "inverse_ratio"
- else {numerator = report_sign_ratio r r.denominator;
- denominator = abs_big_int r.numerator;
+ else {numerator = report_sign_ratio r r.denominator;
+ denominator = abs_big_int r.numerator;
normalized = r.normalized}
-let div_ratio r1 r2 =
+let div_ratio r1 r2 =
mult_ratio r1 (inverse_ratio r2)
(* Integer part of a rational number *)
(* Odd function *)
-let integer_ratio r =
+let integer_ratio r =
if null_denominator r then failwith_zero "integer_ratio"
else if sign_ratio r = 0 then zero_big_int
- else report_sign_ratio r (div_big_int (abs_big_int r.numerator)
+ else report_sign_ratio r (div_big_int (abs_big_int r.numerator)
(abs_big_int r.denominator))
(* Floor of a rational number *)
(* Always less or equal to r *)
-let floor_ratio r =
+let floor_ratio r =
ignore (verify_null_denominator r);
div_big_int (r.numerator) r.denominator
@@ -248,17 +248,17 @@ let round_ratio r =
ignore (verify_null_denominator r);
let abs_num = abs_big_int r.numerator in
let bi = div_big_int abs_num r.denominator in
- report_sign_ratio r
- (if sign_big_int
- (sub_big_int
- (mult_int_big_int
- 2
- (sub_big_int abs_num (mult_big_int (r.denominator) bi)))
+ report_sign_ratio r
+ (if sign_big_int
+ (sub_big_int
+ (mult_int_big_int
+ 2
+ (sub_big_int abs_num (mult_big_int (r.denominator) bi)))
r.denominator) = -1
then bi
else succ_big_int bi)
-let ceiling_ratio r =
+let ceiling_ratio r =
if (is_integer_ratio r)
then r.numerator
else succ_big_int (floor_ratio r)
@@ -266,33 +266,33 @@ let ceiling_ratio r =
(* Comparison operators on rational numbers *)
let eq_ratio r1 r2 =
- ignore (normalize_ratio r1);
+ ignore (normalize_ratio r1);
ignore (normalize_ratio r2);
eq_big_int (r1.numerator) r2.numerator &&
- eq_big_int (r1.denominator) r2.denominator
+ eq_big_int (r1.denominator) r2.denominator
let compare_ratio r1 r2 =
if verify_null_denominator r1 then
let sign_num_r1 = sign_big_int r1.numerator in
if (verify_null_denominator r2)
- then
+ then
let sign_num_r2 = sign_big_int r2.numerator in
- if sign_num_r1 = 1 && sign_num_r2 = -1 then 1
+ if sign_num_r1 = 1 && sign_num_r2 = -1 then 1
else if sign_num_r1 = -1 && sign_num_r2 = 1 then -1
else 0
else sign_num_r1
else if verify_null_denominator r2 then
-(sign_big_int r2.numerator)
- else match compare_int (sign_big_int r1.numerator)
+ else match compare_int (sign_big_int r1.numerator)
(sign_big_int r2.numerator) with
1 -> 1
| -1 -> -1
- | _ -> if eq_big_int (r1.denominator) r2.denominator
+ | _ -> if eq_big_int (r1.denominator) r2.denominator
then compare_big_int (r1.numerator) r2.numerator
- else compare_big_int
- (mult_big_int (r1.numerator) r2.denominator)
+ else compare_big_int
+ (mult_big_int (r1.numerator) r2.denominator)
(mult_big_int (r1.denominator) r2.numerator)
-
+
let lt_ratio r1 r2 = compare_ratio r1 r2 < 0
and le_ratio r1 r2 = compare_ratio r1 r2 <= 0
@@ -319,18 +319,18 @@ and ge_big_int_ratio bi r = compare_big_int_ratio bi r >= 0
(* Coercions *)
(* Coercions with type int *)
-let int_of_ratio r =
+let int_of_ratio r =
if ((is_integer_ratio r) && (is_int_big_int r.numerator))
then (int_of_big_int r.numerator)
else failwith "integer argument required"
and ratio_of_int i =
- { numerator = big_int_of_int i;
+ { numerator = big_int_of_int i;
denominator = unit_big_int;
normalized = true }
(* Coercions with type nat *)
-let ratio_of_nat nat =
+let ratio_of_nat nat =
{ numerator = big_int_of_nat nat;
denominator = unit_big_int;
normalized = true }
@@ -344,27 +344,27 @@ and nat_of_ratio r =
else failwith "nat_of_ratio"
(* Coercions with type big_int *)
-let ratio_of_big_int bi =
+let ratio_of_big_int bi =
{ numerator = bi; denominator = unit_big_int; normalized = true }
and big_int_of_ratio r =
ignore (normalize_ratio r);
- if is_integer_ratio r
+ if is_integer_ratio r
then r.numerator
else failwith "big_int_of_ratio"
-let div_int_ratio i r =
+let div_int_ratio i r =
ignore (verify_null_denominator r);
mult_int_ratio i (inverse_ratio r)
-let div_ratio_int r i =
+let div_ratio_int r i =
div_ratio r (ratio_of_int i)
-let div_big_int_ratio bi r =
+let div_big_int_ratio bi r =
ignore (verify_null_denominator r);
mult_big_int_ratio bi (inverse_ratio r)
-let div_ratio_big_int r bi =
+let div_ratio_big_int r bi =
div_ratio r (ratio_of_big_int bi)
(* Functions on type string *)
@@ -422,14 +422,14 @@ let approx_ratio_fix n r =
(* Don't need to normalize *)
if (null_denominator r) then failwith_zero "approx_ratio_fix"
else
- let sign_r = sign_ratio r in
+ let sign_r = sign_ratio r in
if sign_r = 0
then "+0" (* r = 0 *)
else
- (* r.numerator and r.denominator are not null numbers
+ (* r.numerator and r.denominator are not null numbers
s1 contains one more digit than desired for the round off operation *)
if n >= 0 then begin
- let s1 =
+ let s1 =
string_of_nat
(nat_of_big_int
(div_big_int
@@ -464,7 +464,7 @@ let approx_ratio_fix n r =
(* Dubious; what is this code supposed to do? *)
let s = string_of_big_int
(div_big_int
- (abs_big_int r.numerator)
+ (abs_big_int r.numerator)
(base_power_big_int
10 (-n) r.denominator)) in
let len = succ (String.length s) in
@@ -475,13 +475,13 @@ let approx_ratio_fix n r =
end
(* Number of digits of the decimal representation of an int *)
-let num_decimal_digits_int n =
+let num_decimal_digits_int n =
String.length (string_of_int n)
(* Approximation with floating decimal point *)
(* This is an odd function and the last digit is round off *)
(* Format (+/-)(0. n_first_digits e msd)/(1. n_zeros e (msd+1) *)
-let approx_ratio_exp n r =
+let approx_ratio_exp n r =
(* Don't need to normalize *)
if (null_denominator r) then failwith_zero "approx_ratio_exp"
else if n <= 0 then invalid_arg "approx_ratio_exp"
@@ -493,22 +493,22 @@ let approx_ratio_exp n r =
let s = String.make (n + 5) '0' in
(String.blit "+0." 0 s 0 3);
(String.blit "e0" 0 s !i 2); s
- else
+ else
let msd = msd_ratio (abs_ratio r) in
let k = n - msd in
- let s =
+ let s =
(let nat = nat_of_big_int
(if k < 0
- then
- div_big_int (abs_big_int r.numerator)
- (base_power_big_int 10 (- k)
+ then
+ div_big_int (abs_big_int r.numerator)
+ (base_power_big_int 10 (- k)
r.denominator)
- else
+ else
div_big_int (base_power_big_int
10 k (abs_big_int r.numerator))
r.denominator) in
string_of_nat nat) in
- if (round_futur_last_digit s 0 (String.length s))
+ if (round_futur_last_digit s 0 (String.length s))
then
let m = num_decimal_digits_int (succ msd) in
let str = String.make (n + m + 4) '0' in
@@ -516,8 +516,8 @@ let approx_ratio_exp n r =
String.set str !i ('e');
incr i;
(if m = 0
- then String.set str !i '0'
- else String.blit (string_of_int (succ msd)) 0 str !i m);
+ then String.set str !i '0'
+ else String.blit (string_of_int (succ msd)) 0 str !i m);
str
else
let m = num_decimal_digits_int (succ msd)
@@ -533,14 +533,14 @@ let approx_ratio_exp n r =
(* String approximation of a rational with a fixed number of significant *)
(* digits printed *)
-let float_of_rational_string r =
+let float_of_rational_string r =
let s = approx_ratio_exp !floating_precision r in
if String.get s 0 = '+'
then (String.sub s 1 (pred (String.length s)))
else s
(* Coercions with type string *)
-let string_of_ratio r =
+let string_of_ratio r =
ignore (cautious_normalize_ratio_when_printing r);
if !approx_printing_flag
then float_of_rational_string r
@@ -566,10 +566,10 @@ let float_of_ratio r =
(* XL: suppression de ratio_of_float *)
-let power_ratio_positive_int r n =
- create_ratio (power_big_int_positive_int (r.numerator) n)
+let power_ratio_positive_int r n =
+ create_ratio (power_big_int_positive_int (r.numerator) n)
(power_big_int_positive_int (r.denominator) n)
-let power_ratio_positive_big_int r bi =
- create_ratio (power_big_int_positive_big_int (r.numerator) bi)
+let power_ratio_positive_big_int r bi =
+ create_ratio (power_big_int_positive_big_int (r.numerator) bi)
(power_big_int_positive_big_int (r.denominator) bi)