11 个版本
0.2.6 | 2024年2月26日 |
---|---|
0.2.5 | 2024年2月25日 |
0.1.4 | 2024年2月10日 |
在 Rust 模式 中排名 1069
8MB
9K SLoC
Custom Float
此包添加了一个自定义浮点数类型 Fp<U, SIGN_BIT, EXP_SIZE, INT_SIZE, FRAC_SIZE, EXP_BASE>
,其中指数和尾数的位数可以单独设置。
U
是用于表示数字的底层无符号整数类型。
SIGN_BIT
表示数字是否有符号位。
EXP_SIZE
是指数的位数。
INT_SIZE
是尾数整数部分的位数。如果为零,则整数位是隐含的。
FRAC_SIZE
是尾数小数部分的位数。
EXP_BASE
是指数的基数。
U
的总位数必须大于或等于 SIGN_BIT +
EXP_SIZE +
INT_SIZE +
FRAC_SIZE
,以容纳整个数字。
位布局如下
No data: | Sign: | Exponent: | Integer: | Fractional: |
< .. > | <SIGN_BIT> | <EXP_SIZE> | <INT_SIZE> | <FRAC_SIZE> |
实浮点数的值为以下
x = (-1)**sign*EXP_BASE**(exponent - bias)*mantissa
其中偏移量等于
bias = 2**(EXP_SIZE - 1) - 1
如果指数具有最大值,则数字是无穷大或 NaN。
然后该数字自动实现 num::Float
,并支持所有普通浮点运算。
这允许简单地实现特殊的浮点数类型,例如 TensorFloat、IEEE754 Quadruple/binary128、Fp80 和 BFloat16。
所有浮点运算的精度都不是完美的,但足够好以供使用。基本函数精度的各种图表显示在 plots 子目录中。
所有浮点数都可以轻松地相互转换,尽管转换为分辨率较低的浮点数时可能会产生舍入误差或无界输出。
示例
#![feature(generic_const_exprs)]
use custom_float::Fp;
type FpSingle = Fp<u32, true, 8, 0, 23, 2>;
let two = FpSingle::from(2);
let four = FpSingle::from(4);
assert_eq!(two + two, four);