diff options
author | Damien Doligez <damien.doligez-inria.fr> | 2010-01-22 12:48:24 +0000 |
---|---|---|
committer | Damien Doligez <damien.doligez-inria.fr> | 2010-01-22 12:48:24 +0000 |
commit | 04b1656222698bd7e92f213e9a718b7a4185643a (patch) | |
tree | 6186d1ba1e00adb1232908f95cb92c299902a943 /otherlibs/num/ratio.ml | |
parent | bdc0fadee2dc9669818955486b4c3497016edda5 (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.ml | 184 |
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) |