remquof(mut x: f32, mut y: f32) -> (f32, i32)1pub fn remquof(mut x: f32, mut y: f32) -> (f32, i32) { 2 let ux: u32 = x.to_bits(); 3 let mut uy: u32 = y.to_bits(); 4 let mut ex = ((ux >> 23) & 0xff) as i32; 5 let mut ey = ((uy >> 23) & 0xff) as i32; 6 let sx = (ux >> 31) != 0; 7 let sy = (uy >> 31) != 0; 8 let mut q: u32; 9 let mut i: u32; 10 let mut uxi: u32 = ux; 11 12 if (uy << 1) == 0 || y.is_nan() || ex == 0xff { 13 return ((x * y) / (x * y), 0); 14 } 15 if (ux << 1) == 0 { 16 return (x, 0); 17 } 18 19 /* normalize x and y */ 20 if ex == 0 { 21 i = uxi << 9; 22 while (i >> 31) == 0 { 23 ex -= 1; 24 i <<= 1; 25 } 26 uxi <<= -ex + 1; 27 } else { 28 uxi &= (!0) >> 9; 29 uxi |= 1 << 23; 30 } 31 if ey == 0 { 32 i = uy << 9; 33 while (i >> 31) == 0 { 34 ey -= 1; 35 i <<= 1; 36 } 37 uy <<= -ey + 1; 38 } else { 39 uy &= (!0) >> 9; 40 uy |= 1 << 23; 41 } 42 43 q = 0; 44 if ex + 1 != ey { 45 if ex < ey { 46 return (x, 0); 47 } 48 /* x mod y */ 49 while ex > ey { 50 i = uxi.wrapping_sub(uy); 51 if (i >> 31) == 0 { 52 uxi = i; 53 q += 1; 54 } 55 uxi <<= 1; 56 q <<= 1; 57 ex -= 1; 58 } 59 i = uxi.wrapping_sub(uy); 60 if (i >> 31) == 0 { 61 uxi = i; 62 q += 1; 63 } 64 if uxi == 0 { 65 ex = -30; 66 } else { 67 while (uxi >> 23) == 0 { 68 uxi <<= 1; 69 ex -= 1; 70 } 71 } 72 } 73 74 /* scale result and decide between |x| and |x|-|y| */ 75 if ex > 0 { 76 uxi -= 1 << 23; 77 uxi |= (ex as u32) << 23; 78 } else { 79 uxi >>= -ex + 1; 80 } 81 x = f32::from_bits(uxi); 82 if sy { 83 y = -y; 84 } 85 if ex == ey || (ex + 1 == ey && (2.0 * x > y || (2.0 * x == y && (q % 2) != 0))) { 86 x -= y; 87 q += 1; 88 } 89 q &= 0x7fffffff; 90 let quo = if sx ^ sy { -(q as i32) } else { q as i32 }; 91 if sx { 92 (-x, quo) 93 } else { 94 (x, quo) 95 } 96 } 97