11 个版本

0.2.6 2024年2月26日
0.2.5 2024年2月25日
0.1.4 2024年2月10日

Rust 模式 中排名 1069

MIT 许可证

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);

依赖项