这两周整体上是在尝试,但是不太顺利。

破案了,毛衣穿反了!请去我另一篇九九八十一难:记一次的数值计算实验里查看。
ME INDEED: 🤡


先说一下目前的成果。

测试结果

测试数据为正序的1到9和逆序的1到9,连续进行1000次计算,求得平均时间。
目前测试了加法,所得数据均为多轮测试后的平均值。
更多的数据等我修好之后再测。

位数IntEx 时间 (ns)GMP 时间 (ns)时间差 (ns)时间差比例稳定性
101201002020%IntEx 不稳定,GMP 稳定
201501054543%IntEx 不稳定,GMP 稳定
100250120130108%IntEx 不稳定,GMP 稳定

Path To Shit

原本是在写科学计算器。先写了一个拓展int类:IntEx。包含以下私有变量:

private:
std::vector<uint64_t> data;
bool isPositive;

IntEx继承自抽象基类AbstractNumber,该基类声明了void from_string(const std::string str&)std::string to_string() const两个公有成员函数。

存储我原本打算的是采用指针形式的,如

std::vector<uint64_t>* data;

或者简单一点,采用智能指针。
但是GPT告诉我没必要,信了AI的鬼话了。感觉指针操纵性和方便性都非常好,能避免很多中间变量的创立。

看到我用vector就知道,我应该是使用的分块存储。考虑到存储的是数字,存储数字最好的类型就是整型。uint64_t固定有64bit,可表示的Dec大概在$1.9\times 10^{19}$。考虑到溢出问题,每块至多存储18位。原本我想用Bin表示的,考虑到只是在内存上比较浪费,算法的复杂性可能会掩盖计算的方便,从而整体效率没有提升,遂沿用Dec。

到这里问题的根源就已经埋下:这是我第一次大规模用vector,对vector的行为没有太多了解。

算法具体的实现就不展示了,按位相加,大同小异。过程学习了一些小巧思,但是没有对内存等优化。

破防

实现好整型类的加减和浮点类的加法后(当然from_string和构造函数、运算符重载等也完成了),代码量大概0.5k左右时,我突发奇想想测一下自己和GMP的差距。

sudo apt install libgmp-dev

装上GMP后,我在的cmake+vscode始终链接不上。/usr/include/下没有gmp.h,反而有gmpxx.h。但是无论我怎么折腾就是不行,一用g++又好了。一个小时都没解决问题,百思不得其解。

g++测了三组加法的数据。等到减法的时候,发现print()的测试函数炸了。初步判断应该是对vector的操作越界了。但是我那段时间始终是在写FloatEx,基本上没碰IntEx。又修了一个小时,还是不行。

头都炸了。