极大/小数编程

时间:2009-12-29 12:48:48

标签: c++ math programming-languages numbers

我正在尝试进行非常大/小数的极端精确数学计算。非常大的数字可能有10-50个数字,非常小的数字可能有10-50个小数位。 C ++能做到吗?如果没有,是否有任何其他编程语言可以处理这种数字?

6 个答案:

答案 0 :(得分:10)

C ++可以使用库,例如​​GNU Multiple Precision Arithmetic库。

答案 1 :(得分:1)

如果正确地为它们实现数据类型,则每种语言都可以处理这些数字。我想你想要一种内置了这种数据类型的语言。

一般来说,对于在C ++中使用double数据类型的功能,以及在大多数其他语言中,精度对于非常小和非常大的数字非常有用。我建议就此问题咨询wikipedia,这里有很好的解释。

剩下的唯一问题是,如果双人有足够的精确度。我想,它可以处理50个数字,但你仍然可以实现自己的数据类型。既然你现在知道双重如何工作,这应该是可能的。但是,您仍然可以尝试搜索已经实现了这种数据类型的数学库。

答案 2 :(得分:1)

如果你想非常精确的算术,而不是编写C ++代码来做非常精确的算术,你应该看看Mathematica,Maple和他们的开源竞争,如Maxima,Sage ,可能还有其他人。

答案 3 :(得分:1)

许多语言支持任意大数,包括(按字母顺序)Haskell,Icon,Python,Scheme和Smalltalk等。支持非常小的数字是罕见的,除非你想要的是完全合理的算术。如果你对非常小的数字的计算必须是精确的,那么我认为完全合理的算术是你唯一的选择,但它很快就会变得昂贵。您的另一个选择是使用比硬件浮点单元提供的精度更多的数字来编写您自己的浮点算法。为此,您需要大整数计算,在C或C ++中可以由GNU GMP库或Dave Hanson的C Interfaces and Implementations库提供。

如果您愿意尝试除C ++之外的其他语言,我建议使用Haskell,因为它具有非常好的创建新数字类型的工具,您可以使用QuickCheck自动测试您的数字类型,这是一个巨大的节省时间和bug查找器。

答案 4 :(得分:0)

我认为python(http://python.org)和ruby(http://ruby-lang.org)都支持非常大和非常小的数字,你可以看一看。此外,两者都可以与C ++互操作。

希望这有帮助。

答案 5 :(得分:0)

你可以使用字符串,但它很慢但很准确。在这里,我有这个加法代码......

    string add(string a, string b){
       if(b[0]-'0' == 0 && b.length() == 1){
           return a;       
       }
       int len = max(a.length(), b.length())+1;
       int ar[len];
       int br[len];
       int buffer[len];

       for(int i = 0; i < len; i++){
           ar[i] = 0;
           br[i] = 0;  
           buffer[i] = 0;  
       }

       for(int i = 0; i < a.length(); i++){
           ar[i] = a[a.length()-i-1]-'0';   
       }


       for(int i = 0; i < b.length(); i++){
           br[i] = b[b.length()-i-1]-'0';    
       }

       // Now we need to add the numbers and add them to the buffer:

       for(int i = 0; i < len-1; i++){
           buffer[i] = ar[i]+br[i];   
       }

       for(int i = 0; i < len-1; i++){
           if(buffer[i] > 9){
               string temp = convertInt(buffer[i]);
               int first_int = temp[0]-'0';
               int second_int = temp[1]-'0';
               buffer[i+1] = buffer[i+1]+first_int;
               buffer[i] = second_int;      
           }    
       }


       stringstream r;
       bool num_before = false;
       for(int i = len-1; i >= 0; i--){
           if(buffer[i] == 0 && num_before){
               r << buffer[i];
           } else if(buffer[i] != 0 && num_before == false){
               r << buffer[i];
               num_before = true;   
           } else if(buffer[i] != 0 && num_before){
               r << buffer[i];   
           }
       }

       return r.str();
    }

string convertInt(int number)
{
   stringstream ss;//create a stringstream
   ss << number;//add number to the stream
   return ss.str();//return a string with the contents of the stream
}