Commit 5cd265a6f079ac6dc6853c776e7ab04416b96bea

Authored by Georg Hopp
1 parent fef11669

Add sqrt approximation for fractionals

... ... @@ -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