Floating point 将字节转换为浮点是安全的,还是会产生未定义的行为?
是否有字节序列在转换为Floating point 将字节转换为浮点是安全的,还是会产生未定义的行为?,floating-point,rust,undefined-behavior,Floating Point,Rust,Undefined Behavior,是否有字节序列在转换为f32或f64时,会在Rust中产生未定义的行为?我将非有限值(如NaN、Infinity等)计算为有效的浮点值 注释提示从原始字节转换浮点可能存在一些问题。提供了一个很好的列表,列出了发生未定义行为的情况。其中,与该问题最密切相关的是: 基元类型中的值无效,即使在专用字段/局部变量中也是如此: 悬挂/空引用或框 布尔值中除false(0)或true(1)以外的值 类型定义中未包含的枚举中的判别式 字符中的一个值,它是代理项或高于char::MAX的值 str中的非UTF
f32
或f64
时,会在Rust中产生未定义的行为?我将非有限值(如NaN、Infinity等)计算为有效的浮点值
注释提示从原始字节转换浮点可能存在一些问题。提供了一个很好的列表,列出了发生未定义行为的情况。其中,与该问题最密切相关的是:
基元类型中的值无效,即使在专用字段/局部变量中也是如此:
- 悬挂/空引用或框
- 布尔值中除false(0)或true(1)以外的值
- 类型定义中未包含的枚举中的判别式
- 字符中的一个值,它是代理项或高于char::MAX的值
- str中的非UTF-8字节序列
transmute
。特别是,字节顺序
板条箱提供了一种从字节流中读取数字的安全直观的方法
use byteorder::{ByteOrder, LittleEndian}; // or NativeEndian
let bytes = [0x00u8, 0x00, 0x80, 0x7F];
let number = LittleEndian::read_f32(&bytes);
println!("{}", number);
好的,实际上有一种非常特殊的边缘情况,将位转换为浮点会导致信号NaN,在某些CPU架构和配置中,这将触发低级异常。有关详细信息,请参见中的讨论。目前已知,具体化信令NAN并不是未定义的行为,如果启用了浮点异常(默认情况下并非如此),则不太可能出现问题 Rust library团队已经做出的决定是,转化为浮动是安全的,即使没有任何掩蔽。文档中详细描述了以下原因: 目前,这与所有平台上的
transmute::(v)
相同。事实证明,这是难以置信的便携性,原因有两个:
- 浮点和整数在所有支持的平台上具有相同的endianness
- IEEE-754非常精确地指定了浮点的位布局
一些解析/编码库可能仍在将各种NaN转换为绝对安静的NaN,因为这一问题在Rust的历史上有一段时间是不确定的。可能是信号NaN。