这两周整体上是在尝试,但是不太顺利。
破案了,毛衣穿反了!请去我另一篇九九八十一难:记一次的数值计算实验里查看。
ME INDEED: 🤡
先说一下目前的成果。
测试结果
测试数据为正序的1到9和逆序的1到9,连续进行1000次计算,求得平均时间。
目前测试了加法,所得数据均为多轮测试后的平均值。
更多的数据等我修好之后再测。
位数 | IntEx 时间 (ns) | GMP 时间 (ns) | 时间差 (ns) | 时间差比例 | 稳定性 |
---|---|---|---|---|---|
10 | 120 | 100 | 20 | 20% | IntEx 不稳定,GMP 稳定 |
20 | 150 | 105 | 45 | 43% | IntEx 不稳定,GMP 稳定 |
100 | 250 | 120 | 130 | 108% | 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
。又修了一个小时,还是不行。
头都炸了。
评论区(暂无评论)