#numbers #float #modular #padic

nightly no-std acid2

2-adic双精度浮点实现

6个版本

0.2.1 2022年12月10日
0.2.0 2022年12月6日
0.1.3 2022年11月10日

#895 in 数学

MIT/Apache

36KB
506

acid2

Build Status License Crates.io API

2-adic浮点实现,以实现最大硬件亲和力和性能。

该项目处于非常初级的阶段。在测试基础设施更加健壮之前,无法保证其正确性。

目标

本项目的目标是实现具有最大性能的2-adic浮点运算。目前,已知的唯一用例是用于逼近p-adic积分,其中精确度不是硬性要求。

代码优化

尽可能使用无分支代码,尽管这可能会牺牲一些可读性。然而,由于2-adic加法需要计数尾部零,这可能在某些架构上不可行。在某些x86平台上,LLVM的cttz内建函数使用位扫描(bsfl)和条件跳转来实现。

特性清单

需要更多测试

拥有大量、表驱动的单元测试,涵盖溢出/下溢和inf/NaN等用例将是理想的。即使是对于像浮点运算这样复杂的东西,手动构造的手工测试用例也可能仍然很有用。

numpy支持

Python支持将使使用此库进行实验变得非常迅速。需要进一步调查这将涉及什么(也就是说,我不知道如何做这件事)。

字符串转换

能够将p-adic数的字符串表示转换为/从字符串表示,这对于调试非常有帮助——不仅对作者,而且对使用此库的消费者也是如此。目前,有一个fmt::Debug的占位符实现,它只显示指数和尾数作为元组。

下溢数

这与其说是特性清单,不如说是一个注意事项,即目前还没有充分考虑下溢数及其处理方式。

比较p-adic和实数浮点数

p-adic浮点数没有符号位

在p-adic数中,任何整数的加法逆元是p-adic度量的收敛正整数序列的极限。因此,不需要符号位。

没有精确的加法逆元(除了0以外)

上述结论的一个推论是,由于整数的负数有无限多位,因此它们不能被精确表示。以-1为例,它的2进位表示如下

...1111111111.0

由于有无限多位,浮点表示被截断为53位。由此产生的推论是,自减运算不会得到零:给定一个p进位浮点值 x,我们有 (x - x).abs() != 0

依赖项

~385–560KB
~11K SLoC