Я, конечно, не Ньютон...
Sep. 30th, 2021 09:17 pmНо вот самоизобретённый алгоритм поиска квадратного корня для int'а (на входе только положительные числа). Надо сказать, от Си его отличает только большая словесность (Ordering::Greater вместо 1).
use std::cmp::Ordering;
pub fn my_sqrt(x: i32) -> i32 {
if x == 0 || x == 1{
return x;
}
let x = x as u32;
let sig_bit_count = 31 - x.leading_zeros();
let mut working_bit = sig_bit_count / 2;
let mut root = 1u32 << working_bit;
while working_bit > 0 {
working_bit -= 1;
let candidate = 1 << working_bit;
root += match ((root + candidate) * (root + candidate)).cmp(&x) {
Ordering::Equal | Ordering::Less => candidate,
Ordering::Greater => 0,
}
}
root as i32
}