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

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

[复制链接]
发表于 7 天前 | 显示全部楼层
可以运行了。

建议把所有数字输出到文件里,不然算完只能看几十位数……
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 7 天前 | 显示全部楼层
Ickiverar 发表于 2026-1-13 21:57
可以运行了。

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

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 6 天前 | 显示全部楼层
更新完了
现在加入要计算100为,输出pi100.txt
pi_calc.exe 100 pi100.txt
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
Ickiverar 发表于 2026-1-13 21:57
可以运行了。

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

更新完了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 5 天前 | 显示全部楼层
没法计算2G以上的位数
E:\Prog\Test\x64\Release> .\Test.exe 5000000000 r:\1g.txt
Calculating Pi to 2147483647 digits (151431731 terms)...

点评

.\calc_pi_2_0.exe 10000000 Calculating Pi to 10000000 digits (705160 terms)... BS Phase: 115.126s Sqrt Phase: 1223.58s Div Phase: 63.679s Result ... Last 10: 5589725915 结果忘记存了  发表于 昨天 13:26
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 4 天前 | 显示全部楼层
看到高精度库偏爱于计算常数来对标速度,今天我特意在开发中的 HugeCalc 里新增了导出 \(\sqrt2\)、\(e\)、\(\pi\) 指定精度的接口
只是导出接口、及修改相关调用demo程序(实则为测试APP)而已,最核心的大数乘法,尚未完成,所以无法与楼主的算法进行对比

点评

x64 的 HugeCalc 尚未公开  发表于 昨天 13:23
我的这个贼慢,而且我好奇HugeCalc如何下载?  发表于 昨天 12:11
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
回复 支持 1 反对 0

使用道具 举报

发表于 3 天前 | 显示全部楼层
Calculating Pi to 2147483647 digits (151431731 terms)...
BS Phase: 138709s
Sqrt Phase: 1e-07s

我感觉已经寄了,这时间不对吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 前天 13:16 | 显示全部楼层
有兴趣学习。建议编辑主贴,把最新版本的 cpp 文件(跳过exe文件以节省网络资源),本网站可能不支持 cpp 附件,可选用 zip, rar, bzip2等压缩格式。期待,谢谢!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 前天 23:29 | 显示全部楼层
PS E:\Prog\Test\x64\Release> .\Test.exe 5000000000 r:\1g.txt
Calculating Pi to 2147483647 digits (151431731 terms)...
BS Phase: 138709s
Sqrt Phase: 1e-07s
Div Phase: 125403s
Result length: 5
31415

算了好几天,就输出个3.1415

评分

参与人数 1威望 +2 金币 +2 贡献 +2 鲜花 +2 收起 理由
Yi_Zhi_OIer + 2 + 2 + 2 + 2 很给力!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 昨天 10:20 | 显示全部楼层
你可能应该把类似的如下的函数定义从头文件中抽取出来,放在独立的 cpp 文件中。 如果有人使用你的库,在多个他自己的 cpp 中包含了你的库的 头文件,就会发生链接错误:同一个函数有多个定义。

  1. // NTT multiplication using 3-moduli CRT with precomputed constants
  2. int precn_mul_ntt(precn_t a, precn_t b, precn_t res) {
  3.     uint64_t as = a->rsiz;
  4.     uint64_t bs = b->rsiz;

  5.     if (as == 0 || bs == 0) {
  6.         precn_set(res, 0);
  7.         return 0;
  8.     }

  9.     size_t n = 1;
  10.     while (n < as + bs) n <<= 1;
复制代码


如果你极端希望你的库是 head only 的,你也可以假假地把它模板化:

  1. // NTT multiplication using 3-moduli CRT with precomputed constants
  2. // the workhorse that does the actual work. Templatized for head-only
  3. //
  4. namespace _detail{
  5. template <bool>
  6.    int precn_mul_ntt(precn_t a, precn_t b, precn_t res) {
  7.        uint64_t as = a->rsiz;
  8.        uint64_t bs = b->rsiz;
  9.        ...
  10.    }
  11. }
  12. inline int precn_mul_ntt(precn_t a, precn_t b, precn_t res) {
  13.         return _detail::precn_mul_ntt_<true>(a,b,res);
  14. }
复制代码


Basically the body of a template function or inline function in the header file is unlikely to break the one-definition rule.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2026-1-20 11:51 , Processed in 0.024613 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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