Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::env::args;
- use std::mem::transmute;
- fn main() {
- let x: f32 = args().skip(1).next().unwrap().parse().unwrap();
- let t = old_inv_sqrt(x);
- let h = inv_sqrt(x);
- let s = sqrt(x);
- println!("{}\n{}\n{}", t, h, s);
- }
- fn old_inv_sqrt(x: f32) -> f32 {
- let y: u32 = x.to_bits();
- let half: f32 = x * 0.5;
- let z: u64 = y as u64;
- let f: i64 = unsafe { transmute(z) };
- let r: i64 = 0x5f3759df - (f >> 1);
- let b: u64 = unsafe { transmute(r) };
- let b = b as u32;
- let a = f32::from_bits(b);
- a * (1.5 - (half * a * a))
- }
- fn inv_sqrt(x: f32) -> f32 {
- let i = x.to_bits();
- let s = 0x5f3759df - (i >> 1);
- let r = f32::from_bits(s);
- r * (1.5 - (x/2.0 * r * r))
- }
- fn sqrt(x: f32) -> f32 {
- let r = inv_sqrt(x);
- r * x
- }
Add Comment
Please, Sign In to add comment