tweaks
This commit is contained in:
parent
14e1bc7c10
commit
227074392b
|
@ -219,20 +219,7 @@ fn dec_int_digits(int_bits: u32) -> u32 {
|
||||||
} else {
|
} else {
|
||||||
10
|
10
|
||||||
};
|
};
|
||||||
let digits = (int_bits * 3 + i) / 10;
|
(int_bits * 3 + i) / 10
|
||||||
|
|
||||||
/*
|
|
||||||
This debug assertion can be enabled in a crate with std,
|
|
||||||
as core does not have f64::exp2.
|
|
||||||
|
|
||||||
// check that digits is ceil(log10(2^int_bits - 1)), except when int_bits < 2
|
|
||||||
debug_assert!(
|
|
||||||
int_bits < 2 || digits == (f64::from(int_bits).exp2() - 1.0).log10().ceil() as u32
|
|
||||||
);
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
digits
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dec_frac_digits(frac_bits: u32) -> u32 {
|
fn dec_frac_digits(frac_bits: u32) -> u32 {
|
||||||
|
@ -244,22 +231,7 @@ fn dec_frac_digits(frac_bits: u32) -> u32 {
|
||||||
} else {
|
} else {
|
||||||
7
|
7
|
||||||
};
|
};
|
||||||
let digits = (frac_bits * 3 + i) / 10;
|
(frac_bits * 3 + i) / 10
|
||||||
|
|
||||||
/*
|
|
||||||
These debug assertions can be enabled in a crate with std,
|
|
||||||
as core does not have f64::exp2 and f64::powi.
|
|
||||||
|
|
||||||
// check that error < delta, where
|
|
||||||
// error = 0.5 * 10^-digits
|
|
||||||
// delta = 2^-frac_bits
|
|
||||||
debug_assert!(0.5 * 10f64.powi(0 - digits as i32) < (-f64::from(frac_bits)).exp2());
|
|
||||||
// check that error with one less digit >= delta
|
|
||||||
debug_assert!(0.5 * 10f64.powi(1 - digits as i32) >= (-f64::from(frac_bits)).exp2());
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
digits
|
|
||||||
}
|
}
|
||||||
|
|
||||||
trait FmtDecHelper {
|
trait FmtDecHelper {
|
||||||
|
@ -498,4 +470,55 @@ mod tests {
|
||||||
assert_eq_fmt!(("{}", fix), ("{:.2}", flt));
|
assert_eq_fmt!(("{}", fix), ("{:.2}", flt));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn pow(base: u32, mut exp: u32) -> f64 {
|
||||||
|
let mut mult = f64::from(base);
|
||||||
|
let mut result = 1.0;
|
||||||
|
loop {
|
||||||
|
if exp % 2 != 0 {
|
||||||
|
result *= mult;
|
||||||
|
}
|
||||||
|
exp /= 2;
|
||||||
|
if exp == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mult *= mult;
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn dec_int_digits() {
|
||||||
|
use super::dec_int_digits;
|
||||||
|
assert_eq!(dec_int_digits(0), 0);
|
||||||
|
assert_eq!(dec_int_digits(1), 1);
|
||||||
|
for int_bits in 2..299 {
|
||||||
|
let check = (pow(2, int_bits) - 1.0).log10().ceil() as u32;
|
||||||
|
assert_eq!(dec_int_digits(int_bits), check, "int_bits {}", int_bits);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn dec_frac_digits() {
|
||||||
|
use super::dec_frac_digits;
|
||||||
|
for frac_bits in 0..300 {
|
||||||
|
let error = 0.5 / pow(10, dec_frac_digits(frac_bits));
|
||||||
|
let error_with_one_less_dec_digit = error * 10.0;
|
||||||
|
let delta = 1.0 / pow(2, frac_bits);
|
||||||
|
assert!(
|
||||||
|
error < delta,
|
||||||
|
"frac_bits {}, error {:e}, delta {:e}",
|
||||||
|
frac_bits,
|
||||||
|
error,
|
||||||
|
delta
|
||||||
|
);
|
||||||
|
assert!(
|
||||||
|
error_with_one_less_dec_digit >= delta,
|
||||||
|
"frac_bits {}, error with one less digit {:e}, delta {:e}",
|
||||||
|
frac_bits,
|
||||||
|
error_with_one_less_dec_digit,
|
||||||
|
delta
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue