2013-06-04 57 views
1

我期待写一个算法,需要做两个不合理的大数字(数千数字长)的划分。除以上数据类型限制

是否有一个库已经存在于python或C++(或汇编)中呢?它甚至有可能吗?

有arn't任何时间限制或任何

+0

想到的第一件事是numpy。由于它用于科学任务,我的猜测是它有处理大量数据的手段。 – pypat

+1

请说明您的需求。如果您要求处理“数千位数字”数字的问题,但在您说您实际上想要处理多字节数字的评论中。这是两个完全不同的需求。 “数千位数”的数字是几千字节。 – svk

回答

3

的Python已经支持大整数,所以唯一缺少的功能是有理数。这是由分数提供模块:

from fractions import Fraction 
>>> print float(Fraction(2**54343)/Fraction(2**54347 + 1)) 
0.0625 
>>> print Fraction(2**54343)/Fraction(2**54347 + 1) 
# ... very long exact answer expressed as a fraction ... 
+0

上面有bigint的东西吗? – Darcys22

+0

@ Darcys22 Python默认使用大整数(但不是有理数)。 2 ** 54343是一个指数,其结果是一个16359位的数字。另一个数字的大小相似。您只需在Python提示符下键入“2 ** 54343”,它就会显示数字。 – svk

+0

我在想比这个更大。随着2 ** 23432532652我收到一个内存错误,这就是为什么我认为它不是一个语言问题,但由页面大小强制执行的限制 – Darcys22

2

在C++中,你可以使用Boost.Multiprecision库:

的多倍库提供整数,合理, 用C浮点类型++有更多范围和精度比 C++的普通内置类型

实施例:

#include <iostream> 
#include <string> 
#include <utility> 

#include <boost/multiprecision/mpfr.hpp> 

int main() 
{ 
    std::string s(100, '0'); 
    s.at(0) = '1'; 
    boost::multiprecision::mpfr_float_1000 f1(std::move(s)); 
    boost::multiprecision::mpfr_float_1000 f2 = f1/42; 
    std::cout << f2.str() << std::endl; 

    return 0; 
} 
+0

代码的工作原理是什么?它是通过字符串而不是将其存储为数据类型吗? – Darcys22

+1

@ Darcys22,'Boost.Multiprecision'只是一些流行的多精度库的封装。在下面的例子中使用'mpfr'库。我不知道如何存储在该库中的数字,对不起。 – soon

+2

@ Darcys22:如果用“字符串”表示一个可打印的十进制数字串,则表示没有。它将大数字表示为一个较小的块(可能是32或64位,与处理器可直接使用的数据类型相匹配)的数组(或字符串,如果您喜欢的话),并使用“长分区”等算法对其进行算术运算。 –