use crate::*;
pub fn niirf<T>( x: T, iterations: usize ) -> T
where T: crate::MixedReal + crate::MixedZero + crate::MixedAbs + crate::MixedOps + crate::MixedPowi
{
if x == T::mixed_zero()
{
return T::mixed_zero();
}
let mut x_ = x.mixed_abs();
let mut norm = 0i32; while x_< T::mixed_from_num(0.25)
{
norm -=1;
x_ = x_*T::mixed_from_num(4);
}
while T::mixed_from_num(1.0) <= x_
{
norm +=1;
x_ = x_/T::mixed_from_num(4);
}
fn beta<T>( x: T) -> T
where T: MixedReal
{
let beta_values = [ T::mixed_from_num(0.961914),
T::mixed_from_num(0.840332),
T::mixed_from_num(0.782715),
T::mixed_from_num(0.734869),
T::mixed_from_num(0.691406),
T::mixed_from_num(0.654297),
T::mixed_from_num(0.622070),
T::mixed_from_num(0.595215),
T::mixed_from_num(0.573731),
T::mixed_from_num(0.556152),
T::mixed_from_num(0.516113),
T::mixed_from_num(0.502930)];
if x < T::mixed_from_num(5.0/16.0) {
return beta_values[0];
}
else if x < T::mixed_from_num(6.0/16.0) {
return beta_values[1];
}
else if x < T::mixed_from_num(7.0/16.0) {
return beta_values[2];
}
else if x < T::mixed_from_num(8.0/16.0) {
return beta_values[3];
}
else if x < T::mixed_from_num(9.0/16.0) {
return beta_values[4];
}
else if x < T::mixed_from_num(10.0/16.0) {
return beta_values[5];
}
else if x < T::mixed_from_num(11.0/16.0) {
return beta_values[6];
}
else if x < T::mixed_from_num(12.0/16.0) {
return beta_values[7];
}
else if x < T::mixed_from_num(13.0/16.0) {
return beta_values[8];
}
else if x < T::mixed_from_num(14.0/16.0) {
return beta_values[9];
}
else if x < T::mixed_from_num(15.0/16.0) {
return beta_values[10];
}
else {
return beta_values[11];
}
}
let mut y = (T::mixed_from_num(2)*x_)/T::mixed_from_num(3) + T::mixed_from_num(0.354167); for _n in 1..iterations
{
y = beta(x_)*(x_-y.mixed_powi(2))+y;
}
while norm.abs() != 0
{
if 0 < norm
{
y = y*T::mixed_from_num(2);
norm-=1;
}
else if norm < 0
{
y = y/T::mixed_from_num(2);
norm+=1;
}
}
return y;
}