Итак, я создаю виртуальную машину, которая принимает последовательность из 32 бит (то есть несколько пакетов по 32 бита), и они представлены как u32, но на самом деле число может быть f32, но просто заключено в u32. Моя программа знает, когда u32 на самом деле представляет собой f32, но я не уверен, как их преобразовать. Если бы я использовал as, будет ли он округляться или просто перемещать биты между форматами (я хочу последнее)? Поскольку я хочу преобразовать между u32 и f32 без изменения каких-либо базовых битов, я просто хочу назвать это по-другому. Вот, например, я беспокоюсь, что мой as u32 не будет делать то, что я хочу:
pub fn give_velocity(spell: &mut Spell, parameters: &[u32], should_execute: bool) -> Option<u32> {
match should_execute {
true => Some((spell.energy * sqrt((parameters[0] * parameters[0] + parameters[1] * parameters[1] + parameters[2] * parameters[2]) as f64)) as u32),
false => None
}
}
Также игнорируйте тот факт, что should_execute сейчас бесполезен, он не закончен.
Редактировать: на мой вопрос был дан ответ о том, как преобразовать f32 в u32, но как насчет u32 в f32?
«Если бы я использовал as, округление производилось бы...?» Да. См. Семантика выражений приведения типов в Справочнике по Rust «Приведение числа с плавающей запятой к целому числу округляет число с плавающей запятой в сторону нуля...».
@Dogbert .to_bits(), к сожалению, конвертируется в u64, а не в u32.
@CocytusDEDI Вы, наверное, смотрите на f64::to_bits. f32::to_bits преобразуется в u32.

Чтобы получить базовые биты значения f32 в виде u32, используйте f32::to_bits . Чтобы сделать обратное, используйте f32::from_bits(_):
fn main() {
let value: f32 = 1.23;
let u32 = value.to_bits();
println!("{}, {}", value, u32);
assert_eq!(value, f32::from_bits(u32));
}
Выход:
1.23, 1067282596
some_f32_value.to_bits()возвращает u32, какой вы хотите, я думаю. См. doc.rust-lang.org/stable/std/primitive.f32.html#method.to_bits.