floating-point - 如何在不使用不安全代码的情况下将 float 转换为二进制数?

标签 floating-point rust ieee-754

有没有办法将 float (f32f64)转换为我可以按位访问的数据类型,例如 u32/u64?也就是说,对应于:

fn as_bits(i: f64) -> u64 {
    unsafe { mem::transmute(i) }
}

但没有不安全。根据 rules,此代码是安全的,即使它可能不会在所有平台上返回相同的值,特别是对于 NaN。反向安全接口(interface)也很好。

最佳答案

引入了 Rust 1.20 f64::to_bitsf32::to_bits :

fn main() {
    println!("{}", (4.2f64).to_bits())
}

在此之前,您需要使用不安全函数transmute。它们产生相同的结果:

use std::mem;

fn main() {
    let float = 4.2f64;

    let via_method = float.to_bits();
    let via_transmute: u64 = unsafe { mem::transmute(float) };

    assert_eq!(via_method, via_transmute);    
}

关于floating-point - 如何在不使用不安全代码的情况下将 float 转换为二进制数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44377657/

相关文章:

c# - float 的计算在不同的处理器上会有所不同吗? (+在 C# 和 C 之间传递 double )

python - numpy 顺序依赖吗?

rust - 在迭代可变成员时访问不可变方法

rust - 如何将对象数组传递给 WebAssembly 并使用 wasm-bindgen 将其转换为结构向量?

ruby - 是否可以直接从 Ruby 代码调用 Rust 的结构字段,而无需将 extern "C"getter 实现到相应的字段

python - 当指数达到-127时如何在Python中计算尾数

ieee-754 - 浮点 : "The leading 1 is ' implicit' in the significand. "-- ...嗯?

python - python 3.6 中不支持的操作数类型

java - NaN 的总和 : How is the underlying bit pattern calculated?

assembly - GCC 在转换 unsigned int 时如何使用 fildll?