6个版本
0.2.1 | 2022年12月10日 |
---|---|
0.2.0 | 2022年12月6日 |
0.1.3 | 2022年11月10日 |
#895 in 数学
36KB
506 行
acid2
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