找回密码
 欢迎注册
楼主: Yi_Zhi_OIer

[原创] 自己的高精度库,C++,请求指教

[复制链接]
 楼主| 发表于 2026-1-19 11:50:06 | 显示全部楼层
Ickiverar 发表于 2026-1-15 22:06
没法计算2G以上的位数
E:\Prog\Test\x64\Release> .\Test.exe 5000000000 r:\1g.txt
Calculating Pi to 214 ...

这四千万位数NTT已经寄了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2026-1-19 11:51:22 | 显示全部楼层
Ickiverar 发表于 2026-1-18 23:29
PS E:\Prog\Test\x64\Release> .\Test.exe 5000000000 r:\1g.txt
Calculating Pi to 2147483647 digits (15 ...

这个1e-7是因为sqrt phase直接没内存,所以出错。而且NTT结果>80000000位直接出错
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2026-1-19 11:52:31 | 显示全部楼层
做题人生 发表于 2026-1-18 13:16
有兴趣学习。建议编辑主贴,把最新版本的 cpp 文件(跳过exe文件以节省网络资源),本网站可能不支持 cpp  ...

github https://github.com/StevenJinyanCheng/preclib
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2026-1-23 17:47:29 | 显示全部楼层
现在搞了一个计算器 MiniCalc
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2026-1-23 21:16:24 | 显示全部楼层
Ickiverar 发表于 2026-1-13 21:57
可以运行了。

建议把所有数字输出到文件里,不然算完只能看几十位数……

请问您能给我的MiniCalc给点建议吗,github上有,跑install_minicalc.bat(但是要Clang),或者自己编译gui_calc_cn.cpp

点评

git上不要放exe!把所有的exe全删了,然后传个构建工具比如sln,cmake,甚至readme里写个构建命令上去也行。发表exe要用github的release功能!  发表于 2026-1-24 11:57
https://zhuanlan.zhihu.com/p/264855981  发表于 2026-1-24 11:53
上面有人也说过了,你的头文件里甚至放了具体函数定义,c++不是这样的!prec_util.hpp里至今还有函数定义,prec_factor.hpp里还全是inline,这并不好!  发表于 2026-1-24 11:48
你既然写c++,就学学RAII是怎么管理资源的,不要让用户去调函数申请内存释放内存,在类的析构函数里把这活干了。  发表于 2026-1-24 11:44
而且还在那个repository里  发表于 2026-1-23 21:16
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2026-1-24 11:55:53 | 显示全部楼层
Yi_Zhi_OIer 发表于 2026-1-23 21:16
请问您能给我的MiniCalc给点建议吗,github上有,跑install_minicalc.bat(但是要Clang),或者自己编译gu ...

一般只有模板类内的函数定义或者非常非常简单的函数会inline,你这些长得要命的函数就别inline了,好好前置声明然后在cpp里实现。不然用你这个头文件的cpp多了,每个cpp都要重新编译一次这堆长得要命的函数,每个obj里都塞一份这一堆函数的副本,链接时每个引用都要从一大堆副本里选一个链接,编译慢死

点评

好的,但是我这个需要march=native,否则慢的要死  发表于 2026-1-24 16:19
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2026-1-24 12:12:16 | 显示全部楼层
    sprecn_free(w1_a); sprecn_free(w1_b);
    sprecn_free(wm1_a); sprecn_free(wm1_b);
    sprecn_free(r0); sprecn_free(r1); sprecn_free(rm1); sprecn_free(rinf);
    sprecn_free(tmp); sprecn_free(c2); sprecn_free(tmp2); sprecn_free(c1);

这一坨东西,既然它是在一个函数里做完的,就应该只申请/释放一次内存。你应该先计算出这个函数一共需要多少内存,然后在这个内存上用偏移去取每个变量需要的大小。



如果你的类型内部还在维护内存的申请释放,那么你根本做不到这一点,这个设计就是失败的。既然区分了底层和高层api,就应该把内存资源维护(高层带RAII的类)和底层计算(仅在已申请的内存上进行)区分开。

你现在的设计导致每个层级都在申请释放内存,根本做不到内存的统合申请。而所谓的底层,除了没法使用RAII产生的缺点,并没有任何好处。


你可以看看这个实现:
https://github.com/himisawww/ilmp/blob/main/ilmp/mul_toom42.c

仅在24行申请一次内存(而且是在栈上申请(alloca),因为能使用toomcook的长度不会太大,栈空间已经足够),26到45行都在使用纯指针操作去切分操作数/结果空间和申请的临时内存。

点评

RAII: resource acquisition is initialization. 资源获取即初始化。 c++ 在ctor 和 dtor 中获取/释放资源(如内存,mutex lock/unlock, 文件等)以避免泄漏和悬挂的一种...  发表于 2026-1-25 12:28
请问RAII是什么意思  发表于 2026-1-24 16:28
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2026-4-20 16:09 , Processed in 0.039679 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表