fn cvt_from(val: f32) -> i16 { (val * 32768.0).min(32767.0).max(-32768.0) as i16 }
}
impl FromFmt<f32> for i32 {
- fn cvt_from(val: f32) -> i32 { (val * 31.0f32.exp2()) as i32 }
+ fn cvt_from(val: f32) -> i32 {
+ if val >= 1.0 {
+ std::i32::MAX
+ } else if val <= -1.0 {
+ std::i32::MIN
+ } else {
+ let scale = (1u32 << 31) as f32;
+ (val * scale) as i32
+ }
+ }
}
impl FromFmt<f32> for f32 {
fn cvt_from(val: f32) -> f32 { val }
let l = data[off0];
let r = data[off1];
assert_eq!(l, 7445);
- assert_eq!(r, -19943);
+ assert_eq!(r, -19505);
} else {
panic!("wrong buffer type");
}