Commit 5cd265a6f079ac6dc6853c776e7ab04416b96bea
1 parent
fef11669
Add sqrt approximation for fractionals
Showing
2 changed files
with
34 additions
and
0 deletions
... | ... | @@ -62,6 +62,33 @@ impl Fractional { |
62 | 62 | pub fn denominator(self) -> i64 { |
63 | 63 | self.1 |
64 | 64 | } |
65 | + | |
66 | + pub fn sqrt(self) -> Self { | |
67 | + // find the sqrt of x in O(log x/2). | |
68 | + fn floor_sqrt(x :i64) -> i64 { | |
69 | + fn inner(l :i64, h :i64, x :i64) -> i64 { | |
70 | + if l > h { | |
71 | + l - 1 | |
72 | + } else { | |
73 | + let m = (l + h) / 2; | |
74 | + match x.cmp(&(m * m)) { | |
75 | + Ordering::Equal => m, | |
76 | + Ordering::Less => inner(l, m, x), | |
77 | + Ordering::Greater => inner(m + 1, h, x), | |
78 | + } | |
79 | + } | |
80 | + } | |
81 | + | |
82 | + match x.cmp(&0) { | |
83 | + Ordering::Equal => 0, | |
84 | + Ordering::Less => -inner(1, -x / 2, -x), | |
85 | + Ordering::Greater => inner(1, x / 2, x), | |
86 | + } | |
87 | + } | |
88 | + | |
89 | + let Fractional(n, d) = self; | |
90 | + Fractional(floor_sqrt(n), floor_sqrt(d)).reduce() | |
91 | + } | |
65 | 92 | } |
66 | 93 | |
67 | 94 | impl fmt::Display for Fractional { | ... | ... |
... | ... | @@ -45,12 +45,19 @@ fn main() { |
45 | 45 | let d :f64 = c.try_into().unwrap(); |
46 | 46 | let e :f64 = Fractional::try_into(c).unwrap(); |
47 | 47 | |
48 | + let f = Fractional(9, 4); | |
49 | + let g = Fractional(-9, 4); | |
50 | + | |
48 | 51 | println!(" [i32] : {:?}" , a); |
49 | 52 | println!(" [Fractional] : {:?}" , b); |
50 | 53 | println!(" mean of [i32] : {}" , c); |
51 | 54 | println!(" as f64 : {}" , d); |
52 | 55 | println!(" and as f64 : {}" , e); |
53 | 56 | println!(" again as f64 : {}" , TryInto::<f64>::try_into(c).unwrap()); |
57 | + println!(" sqrt f : {}" , f.sqrt()); | |
58 | + println!(" sqrt f as f64 : {}" , TryInto::<f64>::try_into(f.sqrt()).unwrap()); | |
59 | + println!(" sqrt g : {}" , g.sqrt()); | |
60 | + println!(" sqrt g as f64 : {}" , TryInto::<f64>::try_into(g.sqrt()).unwrap()); | |
54 | 61 | println!(" Rust π : {}" , FPI); |
55 | 62 | println!(" π : {} {}" , TryInto::<f64>::try_into(PI).unwrap(), PI); |
56 | 63 | println!(" π as tuple : {:?}" , TryInto::<(i32, i32)>::try_into(PI).unwrap()); | ... | ... |
Please
register
or
login
to post a comment