basicNumber.cpp

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 //----------------------basicNumber----------------------------------------
00006 
00007 
00008 
00009 
00010 
00011 
00012 template <typename TScalar>
00013  const basicNumber<TScalar> basicNumber<TScalar>::Zero = basicNumber<TScalar>(0);
00014 
00015 template <typename TScalar>
00016  const basicNumber<TScalar> basicNumber<TScalar>::One = basicNumber<TScalar>(1);
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 //-------------------------Constructors--------------------------------------------------------
00027 
00028 template <typename TScalar>
00029 inline   basicNumber<TScalar>::basicNumber()  : x(0), eps(0) {};
00030 
00031 
00033 template <typename TScalar>
00034 inline basicNumber<TScalar>::basicNumber (TScalar s) : x(s), eps(0)      {       };
00035 
00036 
00038 template <typename TScalar>
00039 inline basicNumber<TScalar>::basicNumber (TScalar epsPrecision, std::string s ) :x(0), eps(0)
00040 {
00041         if (epsPrecision>1)
00042         {
00043                 std::cerr << " allowed epsPrecision is { 0, 1 }" << std::endl;
00044                 throw(" allowed epsPrecision is { 0, 1 }");
00045         }
00046         //      assert(epsPrecision<2);
00047 };
00048 
00050 template <typename TScalar>
00051 inline basicNumber<TScalar>::basicNumber (const  basicNumber<TScalar> & z)      : x(z.x), eps(z.eps)     {};
00052 
00053 
00054         
00056 template <typename TScalar>
00057 inline basicNumber<TScalar>::basicNumber (TScalar s, TScalar t)         : x(s), eps(t)           {};
00058 
00059 
00060 template <typename TScalar>
00061  inline bool  basicNumber<TScalar>::wellDefined(unsigned int characteristic)
00062 {
00063         std::cerr << "wellDefined: characteristic" << characteristic << std::endl;
00064 
00065         assert(sizeof(long long)>sizeof(TScalar));      //otherwise the following test does not work
00066 
00067         long long       test  = pow( 2.0, (int)sizeof(TScalar)*8 )-1;
00068         TScalar test2 = test;
00069         test = test2;
00070 
00071         if (test<0)
00072         {
00073                 
00074                 std::cerr << "TScalar is signed!" << std::endl;
00075                 assert(pow( 2.0, (int)sizeof(TScalar)*8-1 )>characteristic);
00076         }
00077         else
00078         {
00079                 std::cerr << "TScalar is unsigned!" << std::endl;
00080                 assert(pow( 2.0, (int)sizeof(TScalar)*8 )>characteristic);
00081         }
00082         return true;
00083 }
00084 
00085 
00086 
00087 
00088 //-------------------------Properties--------------------------------------------------------
00090 template <typename TScalar>
00091 inline unsigned short basicNumber<TScalar>::getEpsPrecision() const
00092 {
00093         return 1;
00094 }
00095 
00096 
00097 template <typename TScalar>
00098 inline short basicNumber<TScalar>::getEpsDegree() const
00099 {
00100         if ( getEps() !=0 ) 
00101                 return 1;
00102         else if ( getX() !=0 ) 
00103                 return 0;
00104         else return -1;
00105 }
00106 
00107 //-----------------------------------data Access-------------------------------------------------------
00108 
00109 template <typename TScalar>
00110 inline   TScalar   basicNumber<TScalar>::getX() const 
00111 {
00112         return x;
00113 }
00114 
00115 template <typename TScalar>
00116 inline  TScalar   basicNumber<TScalar>::getEps() const
00117 {
00118         return (eps);
00119 }
00120 
00121 template <typename TScalar>
00122 inline TScalar& basicNumber<TScalar>::operator[](int i)
00123 {
00124         #ifdef SAFE
00125                 assert(i==0||i==1);
00126         #endif
00127 
00128         if (i==0)
00129                 return x;
00130         if (i==1)
00131                 return eps;
00132         
00133 }
00134 
00135 
00136 
00137 
00139 template <typename TScalar>
00140 inline  void   basicNumber<TScalar>::setValue(TScalar epsExponent, TScalar coeff) 
00141 {
00142         
00143         assert(epsExponent==0||epsExponent==1);
00144         
00145         if ( epsExponent==0 )
00146                 setX(coeff);
00147         else if ( epsExponent==1 )
00148                 setEps(coeff);
00149         else
00150                 assert(true==false);
00151         
00152 }
00153 
00154 
00155 template <typename TScalar>
00156 TScalar          basicNumber<TScalar>::getValue(TScalar epsExponent)  const
00157 {
00158         if ( epsExponent==0 )
00159                 return getX();
00160         else if ( epsExponent==1 )
00161                 return getEps();
00162         else
00163                 return 0;
00164 }
00165 
00166 
00167 template <typename TScalar>
00168 inline void basicNumber<TScalar>::setX(TScalar xxx)
00169 {
00170         x=xxx;
00171 }
00172 
00173 template <typename TScalar>
00174 inline void basicNumber<TScalar>::setEps(TScalar _eps) 
00175 {
00176         eps=_eps;
00177 }
00178 
00179 
00180 
00181 
00182 //-------------------------Operators--------------------------------------------------------
00183 
00184 template <typename TScalar>
00185 inline  bool basicNumber<TScalar>::isZero() const
00186 {
00187         return (x==0 && eps==0);
00188 };
00189 
00190 
00191 template <typename TScalar>
00192 inline  bool basicNumber<TScalar>::isNotZero() const
00193 {
00194         return (x!=0 || eps!=0);
00195 };
00196 
00198 template <typename TScalar>
00199 inline int basicNumber<TScalar>::nearlyEqual(const basicNumber z) const
00200 {
00201         return  (x==z.x);
00202 };
00203 
00204 template <typename TScalar>
00205 inline bool basicNumber<TScalar>::operator==( const basicNumber z) const
00206 {       
00207         return (x==z.getX() && eps==z.getEps());
00208 }
00209 
00210 template <typename TScalar>
00211 inline bool basicNumber<TScalar>::operator!=( const basicNumber z)  const
00212 {       
00213         return (x!=z.getX() || eps!=z.getEps());
00214 }
00215 
00216 
00218 /*
00219 template <typename TScalar>
00220 inline void  basicNumber<TScalar>::operator+=(const basicNumber &z)     
00221 {
00222         //#ifdef SAFE
00223                 std::cerr <<"Warning: using unsafe +=operator!" << std::endl;
00224         //#endif
00225         x+=z.x;
00226         eps+=z.eps;
00227 }
00228 */
00229 
00230 
00231 
00232 template <typename TScalar>
00233 inline void  basicNumber<TScalar>::printMultSecure(std::ostream &os)    const
00234 {
00235         os <<  "(" << *this << ")";
00236          
00237 }
00238 
00239 
00240 
00241 //-------------------------Index Computation--------------------------------------------------------
00242 
00243 
00244 
00245 
00247 template <typename TScalar>
00248 size_t  
00249 basicNumber<TScalar>::getPairIndex     (        const basicNumber a, 
00250                                                         const basicNumber b, 
00251                                                         const TScalar   characteristic)
00252 {
00253         //return ( (a.eps*characteristic+a.x)*characteristic + b.eps )*characteristic + b.x  ;
00254         return ( (a.eps*characteristic+b.eps) * characteristic + a.x ) * characteristic + b.x  ;
00255 }
00256 
00257 template <typename TScalar>
00258 size_t  
00259 basicNumber<TScalar>::getPairIndexByRef(        const basicNumber & a, 
00260                                                         const basicNumber & b, 
00261                                                         const TScalar   & characteristic)
00262 {
00263         //return ( (a.eps*characteristic+a.x)*characteristic + b.eps )*characteristic + b.x  ;
00264         return ( (a.eps*characteristic+b.eps) * characteristic + a.x ) * characteristic + b.x  ;
00265 }
00266 
00267 template <typename TScalar>
00268  size_t         basicNumber<TScalar>::getSingleIndex(const basicNumber b, 
00269                                                                  const TScalar          characteristic)
00270 {
00271         //return  b.eps *characteristic + b.x  ;
00272         return  b.eps *characteristic*characteristic + b.x  ;
00273 }
00274 
00275 template <typename TScalar>
00276  size_t         basicNumber<TScalar>::getSingleIndexByRef(const basicNumber & b, 
00277                                                                         const TScalar   & characteristic)
00278 {
00279         //return  b.eps *characteristic + b.x  ;
00280         return  b.eps *characteristic*characteristic + b.x  ;
00281 }
00282 
00283 template <typename TScalar>
00284  size_t   basicNumber<TScalar>::getMaxSingleIndex(const TScalar characteristic)
00285 {
00286         return (characteristic-1)*characteristic*characteristic + characteristic-1;
00287 }
00288 
00289 template <typename TScalar>
00290  size_t   basicNumber<TScalar>::getMaxPairIndex  (const TScalar characteristic)
00291 {
00292         return characteristic*characteristic*characteristic*characteristic-1;
00293 }
00294 
00295 
00296 
00297 
00298 //-------------------------IO--------------------------------------------------------
00299 
00300 
00301 template <typename TScalar>
00302 std::ostream &  operator<<(std::ostream & out, const basicNumber<TScalar>& z)  
00303 {       
00304         out << (int)z.getX();
00305 
00306         if (!z.getEps()==0)
00307         {
00308                 out << " +  ";
00309                 out << (int)z.getEps() << "*eps^1 " ;
00310         }
00311         return out;
00312 }
00313 
00314 
00315 
00316 
00317 
00318 
00319 
00320 
00321 
00322 
00323 
00324 
00325 
00326 
00327 
00328 
00329 
00330 
00331 
00332 
00333 
00334 
00335 
00336 
00337 
00338 
00339 
00340 
00341 
00342 
00343 
00344 
00345 
00346 //----------------------fieldScalar----------------------------------------
00347 
00348 
00349 
00350 
00351 
00352 
00353 
00354 
00355 
00356 
00357 
00358 
00359 
00360 
00361 
00362 
00363 
00364 
00365 
00366 
00367 
00368 
00369 
00370 
00371 
00372 
00373 
00374 
00375 template <typename TScalar>
00376  const fieldScalar<TScalar> fieldScalar<TScalar>::Zero = fieldScalar<TScalar>(0);
00377 
00378 template <typename TScalar>
00379  const fieldScalar<TScalar> fieldScalar<TScalar>::One = fieldScalar<TScalar>(1);
00380 
00381 
00382 
00383 //------------------------------Constructors----------------------------------------
00384 template <typename TScalar>
00385 inline   fieldScalar<TScalar>::fieldScalar()  : x(0) {};
00386 
00387 // x initialisierung vergessen...
00388 template <typename TScalar>
00389 inline   fieldScalar<TScalar>:: fieldScalar(std::stringstream & sstream)
00390 {
00391         x=0;
00392         sstream >> x;
00393         #ifdef DEBUG
00394         std::cerr << "parse fieldScalar from stream" << x << std::endl; 
00395         #endif
00396 }
00397 
00399 template <typename TScalar>
00400 inline fieldScalar<TScalar>::fieldScalar (TScalar s) : x(s)      {       };
00401 
00402 
00404 template <typename TScalar>
00405 inline fieldScalar<TScalar>::fieldScalar (TScalar epsPrecision, std::string s ) :x(0)
00406 {
00407         if (epsPrecision!=0)
00408         {
00409                 std::cerr << " allowed epsPrecision is { 0 }" << std::endl;
00410                 throw(" allowed epsPrecision is { 0 }");
00411         }
00412         //assert(epsPrecision==0);
00413         
00414 };
00415 
00417 template <typename TScalar>
00418 inline bool fieldScalar<TScalar>::wellDefined(unsigned int characteristic)
00419 {
00420 
00421         std::cerr << "wellDefined: characteristic" << characteristic << std::endl;
00422 
00423         assert(sizeof(long long)>sizeof(TScalar));      //otherwise the following test does not work
00424 
00425         long long       test  = pow( 2.0, (int)sizeof(TScalar)*8 )-1;
00426         TScalar test2 = test;
00427         test = test2;
00428 
00429         if (test<0)
00430         {
00431                 std::cerr << "TScalar is signed!" << std::endl;
00432                 assert(pow( 2.0, (int)sizeof(TScalar)*8-1 )>characteristic);
00433         }
00434         else
00435         {
00436                 std::cerr << "TScalar is unsigned!" << std::endl;
00437                 assert(pow( 2.0, (int)sizeof(TScalar)*8 )>characteristic);
00438         }
00439         return true;
00440 }
00441 
00442 
00443 
00445 template <typename TScalar>
00446 inline fieldScalar<TScalar>::fieldScalar (const  fieldScalar<TScalar> & z)      : x(z.x)         {};
00447 
00448 
00449         
00451 template <typename TScalar>
00452 inline fieldScalar<TScalar>::fieldScalar (TScalar s, TScalar t)         : x(s)   {};
00453 
00454 
00457 template <typename TScalar>
00458 inline unsigned short fieldScalar<TScalar>::getEpsPrecision() const
00459 {
00460         return 0;
00461 }
00462 
00463 template <typename TScalar>
00464 inline short fieldScalar<TScalar>::getEpsDegree() const
00465 {
00466         if ( getX() !=0 ) 
00467                 return 0;
00468         else return -1;
00469 }
00470 
00471 
00472 //-----------------------------Value Access---------------------------------------------------
00473 
00474 template <typename TScalar>
00475 inline   TScalar   fieldScalar<TScalar>::getX() const 
00476 {
00477         return x;
00478 }
00479 
00480 
00482 template <typename TScalar>
00483 inline  TScalar   fieldScalar<TScalar>::getEps() const
00484 {
00485         return (0);
00486 }
00487 
00488 
00489 template <typename TScalar>
00490 inline void fieldScalar<TScalar>::setX(TScalar xxx)
00491 {
00492         x=xxx;
00493 }
00494 
00495 
00496 template <typename TScalar>
00497 inline void fieldScalar<TScalar>::setEps(TScalar _eps) 
00498 {
00499         if (_eps!=0 ) 
00500                 assert(true==false);
00501 }
00502 
00503 
00506 template <typename TScalar>
00507 inline  void   fieldScalar<TScalar>::setValue(TScalar epsPrecision, TScalar coeff) 
00508 {
00509         assert(epsPrecision==0);
00510         
00511         if (epsPrecision==0)
00512                 setX(coeff);
00513         
00514 }
00515 
00516 template <typename TScalar>
00517 inline TScalar   fieldScalar<TScalar>::getValue(TScalar epsPrecision) const
00518 {
00519         if (epsPrecision==0)
00520                 return x;
00521         return 0;
00522 }
00523 
00524 
00525 template <typename TScalar>
00526 inline TScalar& fieldScalar<TScalar>::operator[](int i)
00527 {
00528         #ifdef SAFE
00529                 assert(i==0);
00530         #endif
00531 
00532         if (i==0)
00533                 return x;
00534         return 0;
00535         
00536 }
00537 
00538 
00539 //-----------------------------------Operators-------------------------------------------------
00540 
00541 template <typename TScalar>
00542 inline  bool fieldScalar<TScalar>::isZero() const
00543 {
00544         return (x==0);
00545 };
00546 
00547 
00548 template <typename TScalar>
00549 inline  bool fieldScalar<TScalar>::isNotZero() const
00550 {
00551         return (x!=0 );
00552 };
00553 
00554 
00556 /*
00557 template <typename TScalar>
00558 inline void  fieldScalar<TScalar>::operator+=(const fieldScalar &z)     
00559 {
00560         #ifdef SAFE
00561                 std::cerr <<"Warning: using unsafe +=operator!" << std::endl;
00562         #endif
00563         x+=z.x;
00564 }*/
00565 
00566 
00567 
00568 template <typename TScalar>
00569 inline bool fieldScalar<TScalar>::operator==( const fieldScalar z)  const
00570 {       
00571         return ( x==z.x );
00572 }
00573 
00574 template <typename TScalar>
00575 inline bool fieldScalar<TScalar>::operator!=( const fieldScalar z)  const
00576 {       
00577         return ( x!=z.x );
00578 }
00579 
00580 
00582 template <typename TScalar>
00583 inline int fieldScalar<TScalar>::nearlyEqual(const fieldScalar z) const
00584 {
00585         return  ( x==z.x );
00586 };
00587 
00588 
00589 template <typename TScalar>
00590 inline void     fieldScalar<TScalar>::printMultSecure(std::ostream &os) const
00591 {
00592         os <<   (int)getX() ;
00593          
00594 }
00595 
00596 
00597 
00598 
00599 //--------------------Index computation-------------------------------------------------
00600 
00601 template <typename TScalar>
00602 inline size_t   
00603 fieldScalar<TScalar>::getPairIndex     (        const fieldScalar a, 
00604                                                         const fieldScalar b, 
00605                                                         const TScalar   characteristic)
00606 {
00607         return a.x*characteristic + b.x;
00608 }
00609 
00610 template <typename TScalar>
00611 inline  size_t  
00612 fieldScalar<TScalar>::getPairIndexByRef(        const fieldScalar & a,
00613                                                         const fieldScalar & b, 
00614                                                         const TScalar   & characteristic)
00615 {
00616         return a.x*characteristic + b.x;
00617 }
00618 
00619 template <typename TScalar>
00620 inline size_t   
00621 fieldScalar<TScalar>::getSingleIndex    (const fieldScalar b, const TScalar characteristic)
00622 {
00623         return getSingleIndex(b);
00624 }
00625 
00626 
00627 template <typename TScalar>
00628 inline size_t   
00629 fieldScalar<TScalar>::getSingleIndexByRef       (const fieldScalar & b, const TScalar & characteristic)
00630 {
00631         return getSingleIndexByRef(b);
00632 }
00633 
00634 
00635 template <typename TScalar>
00636 inline size_t   fieldScalar<TScalar>::getSingleIndex            (const fieldScalar b)
00637 {
00638         return b.x;
00639 }
00640 
00641 
00642 template <typename TScalar>
00643 inline size_t   fieldScalar<TScalar>::getSingleIndexByRef       (const fieldScalar & b)
00644 {
00645         return b.x;
00646 }
00647 
00648 
00649 template <typename TScalar>
00650  size_t   fieldScalar<TScalar>::getMaxSingleIndex(const TScalar characteristic)
00651 {
00652         return characteristic - 1;
00653 }
00654 
00655 template <typename TScalar>
00656  size_t  fieldScalar<TScalar>::getMaxPairIndex  (const TScalar characteristic)
00657 {
00658         return characteristic*characteristic - 1;
00659 }
00660 
00661 
00662 
00663 
00664 template <typename TScalar>
00665 std::ostream &  operator<<(std::ostream & out, const fieldScalar<TScalar>& z)  
00666 {       
00667         out << (int)z.getX();
00668 
00669         return out;
00670 }
00671 
00672 
00673 
Generated on Tue Nov 23 13:10:51 2010 for centerfocus by  doxygen 1.6.3