(value: f64, factor: f64, decode_exp: u8, mode: DecodeMode)
| 289 | /// Returns `Some(i64)` if the value round-trips exactly, `None` otherwise. |
| 290 | #[inline] |
| 291 | fn try_alp_encode(value: f64, factor: f64, decode_exp: u8, mode: DecodeMode) -> Option<i64> { |
| 292 | if !value.is_finite() { |
| 293 | return None; |
| 294 | } |
| 295 | |
| 296 | let scaled = value * factor; |
| 297 | if scaled < i64::MIN as f64 || scaled > i64::MAX as f64 { |
| 298 | return None; |
| 299 | } |
| 300 | |
| 301 | let encoded = scaled.round() as i64; |
| 302 | |
| 303 | let decoded = match mode { |
| 304 | DecodeMode::MultiplyInverse => encoded as f64 * INV_POW10[decode_exp as usize], |
| 305 | DecodeMode::DivideByFactor => encoded as f64 / POW10[decode_exp as usize], |
| 306 | }; |
| 307 | |
| 308 | if decoded.to_bits() == value.to_bits() { |
| 309 | Some(encoded) |
| 310 | } else { |
| 311 | None |
| 312 | } |
| 313 | } |
| 314 | |
| 315 | /// Reconstruct a single f64 from an ALP-encoded integer. |
| 316 | #[inline] |
no test coverage detected