数学研发论坛

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

[讨论] 重启大整数库 HugeCalc 的研发工作

  [复制链接]
发表于 2020-2-3 13:41:39 | 显示全部楼层
风云剑 发表于 2020-2-3 12:41
嗯,老大先搞定核心部分,将一个软件持续开发十多年,真的是很不容易。

楼主加油。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2020-2-3 13:57:51 | 显示全部楼层
谢谢大家的支持和鼓励!

刚刚查阅了下 HugeCalc 公开发布的更新历史:V1.0.0.1 2004-03-02;。。。;V8.0.0.0 2007-12-08
也就是说,初版的研发,肯定是经历了 2003 年爆发的“非典”(SARS);
在暂停 12 年后,重启该项目,又碰到新型冠状病毒,即“新冠”(2019-nCoV),
不知是否为天意,要求我更深地宅在家里,潜心研究,优化算法,少出 bug.
少外出,不给社会添乱;多做实事,为社会做点贡献。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-2-3 17:13:47 | 显示全部楼层
如使用汇编的话,建议使用nasm格式,可在windows和linux下编译
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2020-2-3 17:34:32 | 显示全部楼层
汇编肯定是需要的,但 x64 位下的汇编我还从未写过,所以还有许多未知领域需开拓。

我之前习惯于编写嵌入式汇编,因为好调试。
据说 VC 不支持 x64 下的嵌入式汇编?这可咋整?

正好请教一下楼上,可有没有什么好法子解决?需要安装哪些工具?

如果能将汇编写得也跨平台,待时机成熟时,我会考虑开源的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-2-4 09:12:45 | 显示全部楼层
如果想支持linux,可考虑使用cmake创建工程文件,vscode做集成开发环境。vscode可调试程序。我在linux开发,主要使用vscode调试程序,GDB总是用不惯。nasm的配置不难,baidu下很容易解决。vscode相对说其它跨平台集成环境(codeblocks,netbeans),学习成本稍高。但我相信,这不是问题。

点评

vscode 挺不错的.  发表于 2020-2-4 13:41
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2020-2-4 10:07:46 | 显示全部楼层
谢谢!这样的交流体现了讨论的价值。
我准备去抽空看一些 NASM 的文档,啃一下这个硬骨头。

当前,已完成了大整数的字符串输入、输出,与先前的略有不一样,欢迎讨论:
1、输入:支持超长的 二进制、八进制、十进制、十六进制字串的输入(之前的 HugeCalc 仅支持后两种);
2、符号:在进制标记位前,以最后出现的 + / - 为准;若无,则默认为“+”(之前的 HugeCalc 则为:在进制标记位前,若出现“-”,即为负);
3、输出:内部由 16 个字符串 vector 构成的环作为缓存,当得到需输出请求时,指向不同的 vector 的迭代器。

其中,第 3 点是与先前的 HugeCalc 的最大不同:
之前输出字符串所需的缓存,是由各自的 HugeInt / HugeIntX 自己维护,
而字符串是相当费内存的,比大整数需要的数组还费空间,
所以一旦发现大整数本身发生了变动,就会考虑清除字符串输出的缓存。
总之,这方面的设计,需要一个时间、空间上的平衡艺术。

当前的设计,是字符串缓存集中管理,可通过 clear() 函数全部回收;
但要求调用者,一旦得到输出字串的首地址指针,最好马上拷贝一份到本地。

大家觉得,这样的字符串缓存管理模式合理吗?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-2-4 13:12:38 | 显示全部楼层
1)字面量的风格
C++11 关于整数的字面量(integer literal)有了很大的扩充, 建议可以在用户体验上 借鉴或者完全兼容 C++11的风格
然后 字符串字面量 可以试着通过 自定义一个字面量类型, 兼容上述的整数字面量,  交由统一的函数处理.
参考资料: https://en.cppreference.com/w/cpp/language/integer_literal
https://en.cppreference.com/w/cpp/language/user_literal

2) 内存管理
可以给用户提供深拷贝的接口.但我觉得默认最好还是要延迟内存的操作, 写时拷贝.
另外,话说是不是有必要给用户提供一种方便, 让用户可以自己指定HugeCalc内存分配区.   
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2020-2-4 13:26:43 | 显示全部楼层
1) 字面量的风格,我就是参照楼上链接的 C++ 标准编写的;

2) 字符串输出,我想尽量简单点,
比如用“static_cast< LPCTSTR >( hugeint )” 或者“(LPCTSTR )hugeint” 即可得到 hugeint 字符串输出;
有 16 个字符串循环存储,可以达到一定的延迟内存的效果。
太麻烦的约定,对于开发者、调用者,感觉都不甚方便。

不过现在接口还不稳定,内部架构可能还需再调整。

点评

嗯,MFC 定义的,兼容 MBCS / UNICODE 字符格式;我导出接口会只用 C++ 标准的类型(不含 STL 部分,防止以后不兼容)  发表于 2020-2-4 13:38
LPCTSTR 不是标准的类型吧  发表于 2020-2-4 13:35
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-2-4 13:37:48 | 显示全部楼层
gxqcn 发表于 2020-2-4 13:26
1) 字面量的风格,我就是参照楼上链接的 C++ 标准编写的;

2) 字符串输出,我想尽量简单点,
Qt的API设计在业界还是挺出名的. API设计原则 – QT官网的设计实践总结
按照Qt的风格, 会给HugeInt 类型提供一个静态方法  std::string HugeInt::toStdString();
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-2-4 13:43:09 | 显示全部楼层
liangbch 发表于 2020-2-4 09:12
如果想支持linux,可考虑使用cmake创建工程文件,vscode做集成开发环境。vscode可调试程序。我在linux开发 ...
vscode挺不错的, 插件很多. 我还只是vscode的初级玩家.  平时vim, Qt Creator, Clion比较多.  在 Qt Creator, Clion 里,调试非常傻瓜,零门槛.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2021-9-21 23:12 , Processed in 0.095139 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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