use fixed_wide_traits::wide::WideMul; use crate::types::I32F32; #[test] fn test_wide_mul(){ let a=I32F32::ONE; let aa=a.wide_mul(a); assert_eq!(aa,crate::types::I64F64::ONE); } #[test] fn test_bint(){ let a=I32F32::ONE; assert_eq!(a*2,I32F32::from(2)); } #[test] fn test_sqrt(){ let a=I32F32::ONE*4; assert_eq!(a.sqrt(),I32F32::from(2)); } #[test] fn test_sqrt_low(){ let a=I32F32::HALF; let b=a*a; assert_eq!(b.sqrt(),a); } fn find_equiv_sqrt_via_f64(n:I32F32)->I32F32{ //GIMME THEM BITS BOY let &[bits]=n.to_bits().to_bits().digits(); let ibits=bits as i64; let f=(ibits as f64)/((1u64<<32) as f64); let f_ans=f.sqrt(); let mut i=(f_ans*((1u64<<32) as f64)) as i64; let s=(i as i128)*(i as i128); if s<((ibits as i128)<<32){ i+=1; } I32F32::from_bits(bnum::BInt::<1>::from(i)) } #[test] fn test_sqrt_exact(){ let a=I32F32::ONE*2; let b=find_equiv_sqrt_via_f64(a); assert_eq!(a.sqrt(),b); }