2个不稳定版本
0.2.0 | 2021年7月25日 |
---|---|
0.1.0 | 2021年7月24日 |
#1106 in 编码
8KB
108 行
ananas
🍍 将任意字节放入你的NaN中!🍍
正如维基百科解释的,
例如,位运算IEEE 754单精度(32位)NaN将是
s11111111xxx xxxx xxxx xxxx xxxx xxxx
其中s是符号(在应用中通常被忽略)而x序列表示一个非零数字(值零表示无穷大)。x的最高位用于确定NaN的类型:“安静NaN”或“信号NaN”。 其余位用于编码有效载荷(在应用中通常被忽略)。
--- NaN,维基百科(2021)(强调是我的)
NaN有效载荷不再被忽略!使用ananas,你可以给你的NaN赋予全新的意义。顺便说一句,“ananas”是法语中的菠萝 🍍,你不写ananas就不能没有NaN。
NaN有一个(被忽略)的符号为0或1,指数为全1和尾数。尾数的第一个位确定NaN是信号还是安静的。其余22位可以设置为任何东西,除了0。我们定义我们的特殊NaN如下,
i111 1111 1s1nn 0000 xxxx xxxx xxxx xxxx
其中 i
是符号(被忽略),s
是信号位,n
是编码字节的标记,x
是我们的有效载荷。中间的0000是未使用的。
示例
我们可以将任意字节放入NaN中,编码为f32。每个f32数字存储两个字节,
// Encoding to NaNs
let s = "Hello, world!";
let x = ananas::bytes_to_nan(&s.as_bytes());
println!("{:?}", x); // prints '[NaN, NaN, NaN, NaN, NaN, NaN, NaN]'
// Decoding from NaNs
let y = String::from_utf8(ananas::nan_to_bytes(&x)).unwrap();
assert_eq!(y, s);
此软件包提供方便的字符串转换器。
NaN会被传播,这会保持有效载荷,
let x = ananas::str_to_nan("😎");
let y = [x[0] + 10000.0, x[1] / 0.0];
assert!(y[0].is_nan());
assert_eq!(ananas::nan_to_str(&y).unwrap(), "😎");
当两个NaN相遇时,这可能会产生奇怪的行为,例如失去交换律,
let x1 = ananas::str_to_nan("nan nan nan nan");
let x2 = ananas::str_to_nan("batman! batman!");
let y1 :Vec<_> = x1.iter().zip(&x2).map(|(a,b)| a*b).collect();
let y2 :Vec<_> = x1.iter().zip(&x2).map(|(a,b)| b * a).collect();
println!("{:?}", ananas::nan_to_str(&y1)); // nan nan nan nan
println!("{:?}", ananas::nan_to_str(&y2)); // batman! batman!
安装
不清楚为什么你要麻烦,但可以通过添加以下代码到你的项目的 Cargo.toml
来导入ananas。
[dependencies]
ananas = 0.2.0
到你的项目的 Cargo.toml
。
用途
¯\_(ツ)_/¯
许可
此代码为公有领域,根据 Unlicense 的条款。