2个版本
0.1.1 | 2021年6月5日 |
---|---|
0.1.0 | 2021年6月5日 |
#1669 in 编码
11KB
198 行
base95
任意精度下95进制的分数数文本表示,适用于实时协作应用。
示例
use base95::Base95;
use std::str::FromStr;
fn main() {
let n1 = Base95::mid();
assert_eq!(n1.to_string(), "O");
assert_eq!(n1.raw_digits(), vec![47]);
let n2 = Base95::avg_with_zero(&n1);
assert_eq!(n2.to_string(), "7");
assert_eq!(n2.raw_digits(), vec![23]);
let n3 = Base95::avg_with_one(&n1);
assert_eq!(n3.to_string(), "g");
assert_eq!(n3.raw_digits(), vec![71]);
let n4 = Base95::avg(&n1, &n2);
assert_eq!(n4.to_string(), "C");
assert_eq!(n4.raw_digits(), vec![35]);
let n5 = Base95::from_str("j>Z= 4").unwrap();
assert_eq!(n5.raw_digits(), vec![74, 30, 58, 29, 0, 20]);
}
lib.rs
:
任意精度下95进制的分数数文本表示,适用于实时协作应用。
它可以表示0到1之间的数,不包括0和1。省略了前导的0.
。
受到这篇文章的极大启发。
为什么是95?
- UTF-8,最流行的Unicode编码方案,可以原样编码ASCII。 (每个字符1字节)
- ASCII共有95个可打印字符,从空格到波浪号。
示例
use base95::Base95;
use std::str::FromStr;
let n1 = Base95::mid();
assert_eq!(n1.to_string(), "O");
assert_eq!(n1.raw_digits(), vec![47]);
let n2 = Base95::avg_with_zero(&n1);
assert_eq!(n2.to_string(), "7");
assert_eq!(n2.raw_digits(), vec![23]);
let n3 = Base95::avg_with_one(&n1);
assert_eq!(n3.to_string(), "g");
assert_eq!(n3.raw_digits(), vec![71]);
let n4 = Base95::avg(&n1, &n2);
assert_eq!(n4.to_string(), "C");
assert_eq!(n4.raw_digits(), vec![35]);
let n5 = Base95::from_str("j>Z= 4").unwrap();
assert_eq!(n5.raw_digits(), vec![74, 30, 58, 29, 0, 20]);
为什么avg
不精确?
这种表示的主要考虑之一是分数索引的存储效率。因此,更短、稍有不精确的字符串比完美的长字符串更好。
当然,结果是确定的,也就是说,如果输入相同,输出总是相同的。