【发布时间】:2015-03-25 22:02:28
【问题描述】:
我正在使用 GNU 多精度 (GMP) 库对任意精度整数执行一些计算。然后我需要结果的十进制数字。但不是全部:只是,比方说,一百个最重要的数字(即数字开头的数字)或数字中间的选定数字范围(例如,1000 中的数字 100..200 -数字)。
在 GMP 中有没有办法做到这一点?
我在文档中找不到任何函数来提取一系列十进制数字作为字符串。将mpz_t 转换为字符串的转换函数总是转换整个数字。只能指定基数,不能指定起始/结束数字。
除了将整个数字转换成一个巨大的字符串,只取出一小部分并丢弃其余部分之外,还有什么更好的方法吗?
编辑:我需要的不是控制我的数字的精度或将其限制为特定的固定位数,而是从任意数量的数字字符串中选择一个数字子集精度。
这是我需要的示例:
71316831 = 19821203202357042996...2076482743
实际号码有 1112852 位,我将其收缩为 ...。
现在,我只需要这个庞大的数字字符串中任意选择的子字符串。例如,十个最重要数字(在本例中为1982120320)。或者从 1112841th 到 1112849th 的数字(在这种情况下为21203202)。或者只是 1112841th 位置的一个数字(在本例中为2)。
如果我首先使用mpz_get_str 将我的 GMP 数字转换为十进制数字字符串,我将不得不为这些数字分配大量内存,仅使用其中的一小部分并丢弃其余数字。 (更不用说二进制表示的原始mpz_t 数字已经吃掉了很多。)
【问题讨论】:
-
我已经将结果计算并分配为二进制表示。我现在唯一需要的是提取其数字范围。我不会对这个数字做任何额外的计算,所以这里对速度的担忧是无关紧要的。如果需要,提取这些数字甚至可能需要几分钟,我不在乎,我只需要以某种方式获取它们。但由于答案似乎开始偏离目标,我想没有办法做到这一点(因为人们通常会尽其所能避免手头的问题并开始挑剔一些不相关的部分)。
-
另外,分配 1MB 可能是可以忍受的,但我并没有说我想停留在这么大的数字上。 “任意精度”通常意味着它们在需要时可以更大,然后它可能开始成为问题。
标签: c gmp arbitrary-precision significant-digits