2024-08-29 20:16:02 +00:00
|
|
|
use crate::types::I32F32;
|
2024-08-28 19:17:00 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_wide_mul(){
|
2024-08-29 20:16:02 +00:00
|
|
|
let a=I32F32::ONE;
|
2024-09-03 00:03:01 +00:00
|
|
|
let aa=a.wide_mul_1_1(a);
|
2024-08-28 19:17:00 +00:00
|
|
|
assert_eq!(aa,crate::types::I64F64::ONE);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_bint(){
|
2024-08-29 20:16:02 +00:00
|
|
|
let a=I32F32::ONE;
|
|
|
|
assert_eq!(a*2,I32F32::from(2));
|
2024-08-28 19:17:00 +00:00
|
|
|
}
|
2024-08-29 17:12:08 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_sqrt(){
|
2024-08-29 20:16:02 +00:00
|
|
|
let a=I32F32::ONE*4;
|
|
|
|
assert_eq!(a.sqrt(),I32F32::from(2));
|
2024-08-29 17:12:08 +00:00
|
|
|
}
|
2024-08-29 19:13:42 +00:00
|
|
|
#[test]
|
2024-08-29 23:20:10 +00:00
|
|
|
fn test_sqrt_zero(){
|
|
|
|
let a=I32F32::ZERO;
|
|
|
|
assert_eq!(a.sqrt(),I32F32::ZERO);
|
|
|
|
}
|
|
|
|
#[test]
|
2024-08-29 19:13:42 +00:00
|
|
|
fn test_sqrt_low(){
|
2024-08-29 20:16:02 +00:00
|
|
|
let a=I32F32::HALF;
|
2024-08-29 19:13:42 +00:00
|
|
|
let b=a*a;
|
|
|
|
assert_eq!(b.sqrt(),a);
|
|
|
|
}
|
2024-08-29 20:16:09 +00:00
|
|
|
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();
|
2024-08-29 20:30:48 +00:00
|
|
|
let i=(f_ans*((1u64<<32) as f64)) as i64;
|
|
|
|
let r=I32F32::from_bits(bnum::BInt::<1>::from(i));
|
|
|
|
//mimic the behaviour of the algorithm,
|
|
|
|
//return the result if it truncates to the exact answer
|
2024-09-03 00:03:01 +00:00
|
|
|
if (r+I32F32::EPSILON).wide_mul_1_1(r+I32F32::EPSILON)==n.wide_mul_1_1(I32F32::ONE){
|
2024-08-29 20:30:48 +00:00
|
|
|
return r+I32F32::EPSILON;
|
2024-08-29 20:16:09 +00:00
|
|
|
}
|
2024-09-03 00:03:01 +00:00
|
|
|
if (r-I32F32::EPSILON).wide_mul_1_1(r-I32F32::EPSILON)==n.wide_mul_1_1(I32F32::ONE){
|
2024-08-29 20:30:48 +00:00
|
|
|
return r-I32F32::EPSILON;
|
|
|
|
}
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
fn test_exact(n:I32F32){
|
|
|
|
assert_eq!(n.sqrt(),find_equiv_sqrt_via_f64(n));
|
2024-08-29 20:16:09 +00:00
|
|
|
}
|
|
|
|
#[test]
|
|
|
|
fn test_sqrt_exact(){
|
2024-08-29 20:30:48 +00:00
|
|
|
//43
|
|
|
|
for i in 0..((i64::MAX as f32).ln() as u32){
|
|
|
|
let n=I32F32::from_bits(bnum::BInt::<1>::from((i as f32).exp() as i64));
|
|
|
|
test_exact(n);
|
|
|
|
}
|
2024-08-29 20:16:09 +00:00
|
|
|
}
|
2024-08-29 22:27:48 +00:00
|
|
|
#[test]
|
|
|
|
fn test_sqrt_max(){
|
|
|
|
let a=I32F32::MAX;
|
|
|
|
test_exact(a);
|
|
|
|
}
|