Main Page   Class Hierarchy   Data Structures   File List   Data Fields   Globals  

sint.C

Go to the documentation of this file.
00001 
00002        //=======================================================//    _\|/_
00003       //  __  _____           ___                    ___       //      /|\
00004      //  /      |      ^     |   \  |         ^     |   \     //          _\|/_
00005     //   \__    |     / \    |___/  |        / \    |___/    //            /|\
00006    //       \   |    /___\   |  \   |       /___\   |   \   // _\|/_
00007   //     ___/   |   /     \  |   \  |____  /     \  |___/  //   /|\     
00008  //                                                       //            _\|/_
00009 //=======================================================//              /|\
00010 
00011 //
00012 // sint.C: Super Simon integer.
00013 //         Class definition for an integer long enough to count the
00014 //         number of orbits of a extremeley close binary (orbital period
00015 //         of hours to minutes [maybe even miliseconds]).
00016 //         Ment to be used in hdyn_unpert.C
00017 //
00018 //      S. Portegies Zwart et al.        12/1992
00019 //      S. Portegies Zeart                2/1997
00020 //
00021 //======================================================================
00022 
00023 //#include <stdio.h>
00024 //#include <string.h>
00025 #include "./sint.h"
00026 
00027 sint::sint(const char* digit_stream) {
00028   
00029   int n = strlen(digit_stream);
00030   
00031   if (n != 0) {
00032     
00033     digits = new char[ndigits=n];
00034     char* p = digits;
00035     const char* q = &digit_stream[n];
00036     while (n--) *p++ = *--q - '0';
00037     
00038   }
00039   else {
00040     
00041     digits = new char[ndigits=1];
00042     digits[0] = 0;
00043     
00044   }
00045 }
00046 
00047 sint::sint(int n) {
00048   
00049   char d[3*sizeof(int)+1];
00050   char* dp = d;
00051   ndigits = 0;
00052   
00053   do {
00054     
00055     *dp++ = n%10;
00056     n /= 10;
00057     ndigits++;
00058     
00059   } while (n > 0);
00060   
00061   digits = new char[ndigits];
00062   register int i;
00063   for (i=0; i<ndigits; i++) digits[i] = d[i];
00064   
00065 }
00066 
00067 sint::sint(const sint& n) {
00068   
00069   int i = n.ndigits;
00070   digits = new char[ndigits=i];
00071   char* p = digits;
00072   char* q = n.digits;
00073   while (i--) *p++ = *q++;
00074   
00075 }
00076 
00077 void sint::operator=(const sint& n) {
00078   
00079   if (this==&n) return;
00080   
00081   unsigned i = n.ndigits;
00082   digits = new char[ndigits=i];
00083   char* p = digits;
00084   char* q = n.digits;
00085   
00086   while (i--) *p++ = *q++;
00087 }
00088 
00089 
00090 
00091 sint sint::operator+(const sint& n) {
00092   
00093   int max_digits = (ndigits>n.ndigits ? ndigits : n.ndigits) + 1;
00094   
00095   char* psum = new char[max_digits];
00096   sint sum(psum, max_digits);
00097   digit_stream a(*this);
00098   digit_stream b(n);
00099   int i = max_digits;
00100   int carry = 0;
00101   
00102   while (i--) {
00103     
00104     *psum = (a++) + (b++) + carry;
00105     
00106     if (*psum>9) {
00107       
00108       carry = 1;
00109       *psum -= 10;
00110       
00111     }
00112     else carry = 0;
00113     
00114     psum++;
00115     
00116   }
00117   
00118   return sum;
00119 }
00120 
00121 void sint::print() {
00122   
00123   int i;
00124   
00125   for (i=ndigits-1; i>=0; i--) printf( "%d", digits[i]);
00126   
00127 }
00128 

Generated at Sun Feb 24 09:57:16 2002 for STARLAB by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001