Yi_Zhi_OIer 发表于 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已经寄了

Yi_Zhi_OIer 发表于 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位直接出错

Yi_Zhi_OIer 发表于 2026-1-19 11:52:31

做题人生 发表于 2026-1-18 13:16
有兴趣学习。建议编辑主贴,把最新版本的 cpp 文件(跳过exe文件以节省网络资源),本网站可能不支持 cpp...

github https://github.com/StevenJinyanCheng/preclib

Yi_Zhi_OIer 发表于 2026-1-23 17:47:29

现在搞了一个计算器 MiniCalc

Yi_Zhi_OIer 发表于 2026-1-23 21:16:24

Ickiverar 发表于 2026-1-13 21:57
可以运行了。

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


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

Ickiverar 发表于 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里都塞一份这一堆函数的副本,链接时每个引用都要从一大堆副本里选一个链接,编译慢死

Ickiverar 发表于 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行都在使用纯指针操作去切分操作数/结果空间和申请的临时内存。
页: 1 2 3 [4]
查看完整版本: 自己的高精度库,C++,请求指教