Как я могу выполнить переход между f32 и u32, не меняя биты?

Итак, я создаю виртуальную машину, которая принимает последовательность из 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?

some_f32_value.to_bits() возвращает u32, какой вы хотите, я думаю. См. doc.rust-lang.org/stable/std/primitive.f32.html#method.to_bi‌​ts.
Dogbert 10.07.2024 15:32

«Если бы я использовал as, округление производилось бы...?» Да. См. Семантика выражений приведения типов в Справочнике по Rust «Приведение числа с плавающей запятой к целому числу округляет число с плавающей запятой в сторону нуля...».

eggyal 10.07.2024 15:35

@Dogbert .to_bits(), к сожалению, конвертируется в u64, а не в u32.

CocytusDEDI 10.07.2024 15:35

@CocytusDEDI Вы, наверное, смотрите на f64::to_bits. f32::to_bits преобразуется в u32.

Filipe Rodrigues 10.07.2024 15:39
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
4
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить базовые биты значения 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

Другие вопросы по теме