00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 template <int CHAR, typename TScalar, typename TScalarPair>
00036 const number_eps1<CHAR, TScalar, TScalarPair>
00037 number_eps1<CHAR, TScalar, TScalarPair>::Zero = number_eps1<CHAR, TScalar, TScalarPair>(0);
00038
00039 template <int CHAR, typename TScalar, typename TScalarPair>
00040 const number_eps1<CHAR, TScalar, TScalarPair>
00041 number_eps1<CHAR, TScalar, TScalarPair>::One = number_eps1<CHAR, TScalar, TScalarPair>(1);
00042
00043
00044
00045
00046
00047
00048
00049 template <int CHAR, typename TScalar, typename TScalarPair>
00050 inline number_eps1<CHAR, TScalar, TScalarPair>::number_eps1() : epsx(0) { };
00051
00052
00053
00061 template <int CHAR, typename TScalar, typename TScalarPair>
00062 inline number_eps1<CHAR, TScalar, TScalarPair>::
00063 number_eps1(int epsPrec, std::string dummy) : epsx(0)
00064 {
00065
00066 if (epsPrec!=1)
00067 {
00068 std::cerr << " allowed epsPrecision is { 1 }" << std::endl;
00069 throw(" allowed epsPrecision is { 1 }");
00070
00071 }
00072 }
00073
00076 template <int CHAR, typename TScalar, typename TScalarPair>
00077 inline number_eps1<CHAR, TScalar, TScalarPair>::number_eps1 (TScalar x) : epsx(x)
00078 {
00079 #ifdef SAFE
00080
00081
00082
00083 assert (needbits<CHAR>::doubledvalue<sizeof(TScalarPair)*8);
00084 #endif
00085 };
00086
00091 template <int CHAR, typename TScalar, typename TScalarPair>
00092 inline number_eps1<CHAR, TScalar, TScalarPair>::
00093 number_eps1 (const number_eps1<CHAR, TScalar, TScalarPair> & z_x) : epsx( z_x.epsx )
00094 {
00095 #ifdef SAFE
00096 assert (needbits<CHAR>::doubledvalue<sizeof(TScalarPair)*8);
00097 #endif
00098 };
00099
00101 template <int CHAR, typename TScalar, typename TScalarPair>
00102 inline number_eps1<CHAR, TScalar, TScalarPair>::
00103 number_eps1 (TScalar x, TScalar eps): epsx((eps << bitsize)|x)
00104 {
00105 #ifdef SAFE
00106
00107 assert(fullbitsize<sizeof(TScalarPair)*8);
00108 #endif
00109 };
00110
00111 template <int CHAR, typename TScalar, typename TScalarPair>
00112 inline short number_eps1<CHAR, TScalar, TScalarPair>::getEpsDegree() const
00113 {
00114 if ( getEps()!=0 )
00115 return 1;
00116 else if ( getX() !=0 )
00117 return 0;
00118 else return -1;
00119 }
00120
00121
00122
00123
00124 template <int CHAR, typename TScalar, typename TScalarPair>
00125 inline bool number_eps1<CHAR, TScalar, TScalarPair>::wellDefined(unsigned int characteristic)
00126 {
00127
00128 std::cerr << "wellDefined: characteristic" << characteristic << std::endl;
00129 return wellDefined();
00130 }
00131
00133 template <int CHAR, typename TScalar, typename TScalarPair>
00134 inline bool number_eps1<CHAR, TScalar, TScalarPair>::wellDefined()
00135 {
00136 assert(sizeof(long long)>sizeof(TScalar));
00137
00139 long long test = pow( 2, sizeof(TScalar)*8 )-1;
00140 TScalar test2 = test;
00141 test = test2;
00142
00143 if (test<0)
00144 {
00145 std::cerr << "TScalar is signed!" << std::endl;
00146 assert( sizeof(TScalar)*8-1>=bitsize);
00147 }
00148 else
00149 {
00150 std::cerr << "TScalar is unsigned!" << std::endl;
00151 assert( sizeof(TScalar)*8>=bitsize);
00152 }
00153
00154 assert(sizeof(long long)>sizeof(TScalarPair));
00155
00156 test = pow( 2, sizeof(TScalar)*8 )-1;
00157 test2 = test;
00158 test = test2;
00159
00160 if (test<0)
00161 {
00162 std::cerr << "TScalarPair is signed!" << std::endl;
00163 assert( sizeof(TScalarPair)*8-1>=fullbitsize);
00164 assert (needbits<CHAR>::doubledvalue<sizeof(TScalarPair)*8);
00165 }
00166 else
00167 {
00168 std::cerr << "TScalarPair is unsigned!" << std::endl;
00169 assert( sizeof(TScalarPair)*8>=fullbitsize);
00170 assert (needbits<CHAR>::doubledvalue<=sizeof(TScalarPair)*8);
00171 }
00172 return true;
00173 }
00174
00175
00176
00178 template <int CHAR, typename TScalar, typename TScalarPair>
00179
00180 inline TScalar number_eps1<CHAR, TScalar, TScalarPair>::getX() const
00181 {
00182 return ( maskx&epsx );
00183 }
00184
00186 template <int CHAR, typename TScalar, typename TScalarPair>
00187 inline TScalar number_eps1<CHAR, TScalar, TScalarPair>::getEps() const
00188 {
00189 #ifdef COUNT
00190 bitwiseShift+=1;
00191 #endif
00192 return ( epsx >> needbits<CHAR>::value );
00193 }
00194
00195
00197 template <int CHAR, typename TScalar, typename TScalarPair>
00198 inline void number_eps1<CHAR, TScalar, TScalarPair>::setX(TScalar x)
00199 {
00200 #ifdef COUNT
00201 bitwiseOR+=1;
00202 bitwiseAND++;
00203 #endif
00204
00205 epsx = ( epsx & maskeps ) | x ;
00206 }
00207
00209 template <int CHAR, typename TScalar, typename TScalarPair>
00210 inline void number_eps1<CHAR, TScalar, TScalarPair>::setEps(TScalar eps)
00211 {
00212 #ifdef COUNT
00213 bitwiseOR+=1;
00214 bitwiseShift+=1;
00215 bitwiseAND++;
00216 #endif
00217 epsx = (epsx & maskx) | (TScalarPair) (eps << needbits<CHAR>::value );
00218 }
00219
00220
00228 template <int CHAR, typename TScalar, typename TScalarPair>
00229 inline void
00230 number_eps1<CHAR, TScalar, TScalarPair>::
00231 setValue( unsigned short _epsPrecision, TScalar val)
00232 {
00233 if (_epsPrecision==0)
00234 setX(val);
00235 else if (_epsPrecision==1)
00236 setEps(val);
00237 else if ( val!=0 )
00238 assert(true==false);
00239
00240
00241 }
00242
00243
00244
00245 template <int CHAR, typename TScalar, typename TScalarPair>
00246 inline bool number_eps1<CHAR, TScalar, TScalarPair>::isZero() const
00247 {
00248 return (epsx==0);
00249 };
00250
00251 template <int CHAR, typename TScalar, typename TScalarPair>
00252 inline bool number_eps1<CHAR, TScalar, TScalarPair>::isNotZero() const
00253 {
00254 return (epsx!=0);
00255 };
00256
00257 template <int CHAR, typename TScalar, typename TScalarPair>
00258 inline bool
00259 number_eps1<CHAR, TScalar, TScalarPair>::
00260 nearlyEqual(const number_eps1<CHAR, TScalar, TScalarPair> & z) const
00261 {
00262 return ( getX()==z.getX() );
00263 };
00264
00265
00266 template <int CHAR, typename TScalar, typename TScalarPair>
00267 inline int
00268 number_eps1<CHAR, TScalar, TScalarPair>::
00269 operator==(const number_eps1<CHAR, TScalar, TScalarPair> & z) const
00270 {
00271 return epsx == z.epsx;
00272 }
00273
00274 template <int CHAR, typename TScalar, typename TScalarPair>
00275 inline int
00276 number_eps1<CHAR, TScalar, TScalarPair>::
00277 operator!=(const number_eps1<CHAR, TScalar, TScalarPair> & z) const
00278 {
00279 return epsx != z.epsx;
00280 }
00281
00282
00283
00284
00285
00286
00287
00288 template <int CHAR, typename TScalar, typename TScalarPair>
00289
00290
00291 inline size_t
00292 number_eps1<CHAR, TScalar, TScalarPair>::getSingleIndex(const number_eps1<CHAR, TScalar, TScalarPair> b)
00293 {
00294 #ifdef COUNT
00295 bitwiseShift += 1;
00296 bitwiseOR += 1;
00297 #endif
00298
00299 return( (size_t) b.epsx);
00300
00301 }
00302
00303
00304 template <int CHAR, typename TScalar, typename TScalarPair>
00305 inline size_t
00306 number_eps1<CHAR, TScalar, TScalarPair>::getSingleIndexByRef(
00307 const number_eps1<CHAR, TScalar, TScalarPair> & b )
00308 {
00309 #ifdef COUNT
00310 bitwiseShift += 1;
00311 bitwiseOR += 1;
00312 #endif
00313
00314 return( (size_t) b.epsx);
00315 }
00316
00317
00318 template <int CHAR, typename TScalar, typename TScalarPair>
00319 inline size_t
00320 number_eps1<CHAR, TScalar, TScalarPair>::getPairIndex(
00321 const number_eps1<CHAR, TScalar, TScalarPair> a,
00322 const number_eps1<CHAR, TScalar, TScalarPair> b)
00323 {
00324 #ifdef COUNT
00325 bitwiseShift += 1;
00326 bitwiseOR += 1;
00327 #endif
00328
00329 return( ((size_t)a.epsx<< (needbits<CHAR>::doubledvalue)) | (size_t)b.epsx );
00330 }
00331
00332
00333 template <int CHAR, typename TScalar, typename TScalarPair>
00334 inline size_t
00335 number_eps1<CHAR, TScalar, TScalarPair>::getPairIndexByRef(
00336 const number_eps1<CHAR, TScalar, TScalarPair>& a,
00337 const number_eps1<CHAR, TScalar, TScalarPair>& b)
00338 {
00339 #ifdef COUNT
00340 bitwiseShift += 1;
00341 bitwiseOR += 1;
00342 #endif
00343
00344 return( ((size_t)a.epsx<< (needbits<CHAR>::doubledvalue)) | (size_t) b.epsx );
00345 }
00346
00347
00348 template <int CHAR, typename TScalar, typename TScalarPair>
00349 inline size_t
00350 number_eps1<CHAR, TScalar, TScalarPair>::
00351 getSingleIndex(const number_eps1<CHAR, TScalar, TScalarPair> b,
00352 const TScalar characteristic)
00353 {
00354
00355 #ifdef SAFE
00356 assert(characteristic==CHAR);
00357 #endif
00358 return number_eps1<CHAR, TScalar, TScalarPair>::getSingleIndex(b);
00359 }
00360
00361
00362 template <int CHAR, typename TScalar, typename TScalarPair>
00363 inline size_t
00364 number_eps1<CHAR, TScalar, TScalarPair>::
00365 getSingleIndexByRef( const number_eps1<CHAR, TScalar, TScalarPair>& b,
00366 const TScalar & characteristic)
00367 {
00368
00369 #ifdef SAFE
00370 assert(characteristic==CHAR);
00371 #endif
00372 return number_eps1<CHAR, TScalar, TScalarPair>::getSingleIndexByRef(b);
00373 }
00374
00375
00376 template <int CHAR, typename TScalar, typename TScalarPair>
00377 inline size_t
00378 number_eps1<CHAR, TScalar, TScalarPair>::
00379 getPairIndex( const number_eps1<CHAR, TScalar, TScalarPair> a,
00380 const number_eps1<CHAR, TScalar, TScalarPair> b,
00381 const TScalar characteristic )
00382 {
00383 #ifdef SAFE
00384 assert(characteristic==CHAR);
00385 #endif
00386 return number_eps1<CHAR, TScalar, TScalarPair>::getPairIndex(a,b);
00387 }
00388
00389
00390 template <int CHAR, typename TScalar, typename TScalarPair>
00391 inline size_t
00392 number_eps1<CHAR, TScalar, TScalarPair>::
00393 getPairIndexByRef(const number_eps1<CHAR, TScalar, TScalarPair> & a,
00394 const number_eps1<CHAR, TScalar, TScalarPair> & b,
00395 const TScalar & characteristic )
00396 {
00397 #ifdef SAFE
00398 assert(characteristic==CHAR);
00399 #endif
00400 return number_eps1<CHAR, TScalar, TScalarPair>::getPairIndexByRef(a, b);
00401 }
00402
00403
00404
00405
00406 template <int CHAR, typename TScalar, typename TScalarPair>
00407 inline size_t
00408 number_eps1<CHAR, TScalar, TScalarPair>::
00409 getMaxSingleIndex(const TScalar characteristic)
00410 {
00411
00412 assert(characteristic==CHAR);
00413
00414
00415 number_eps1<CHAR, TScalar, TScalarPair> num (characteristic-1,characteristic-1);
00416
00417 return number_eps1<CHAR, TScalar, TScalarPair>::getSingleIndex(num);
00418
00419 }
00420
00421
00422 template <int CHAR, typename TScalar, typename TScalarPair>
00423 inline size_t
00424 number_eps1<CHAR, TScalar, TScalarPair>::
00425 getMaxPairIndex (const TScalar characteristic)
00426 {
00427
00428 if (characteristic!=CHAR)
00429 {
00430 std::cerr << "characteristic" << characteristic << std::endl;
00431 std::cerr << "CHAR" << CHAR << std::endl;
00432 }
00433 assert(characteristic==CHAR);
00434
00435 number_eps1<CHAR, TScalar, TScalarPair> num1 (characteristic-1, characteristic-1);
00436 number_eps1<CHAR, TScalar, TScalarPair> num2 (characteristic-1, characteristic-1);
00437
00438 return number_eps1<CHAR, TScalar, TScalarPair>::getPairIndex(num1, num2);
00439
00440 }
00441
00442
00443
00444
00445 template <int CHAR, typename TScalar, typename TScalarPair>
00446 std::ostream &
00447 operator<<(std::ostream & out, const number_eps1<CHAR, TScalar, TScalarPair>& z)
00448 {
00449
00450 out << (int)z.getX() ;
00451 if (z.getEps()!=0)
00452 {
00453 out << " + ";
00454 out << (int)z.getEps() << "*eps " ;
00455 }
00456 return out;
00457 } ;
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488 template <int CHAR, class TScalar>
00489 const number_eps0<CHAR, TScalar>
00490 number_eps0<CHAR, TScalar>::Zero(0);
00491
00492
00493 template <int CHAR, class TScalar>
00494 const number_eps0<CHAR, TScalar>
00495 number_eps0<CHAR, TScalar>::One(1);
00496
00497
00498
00499
00500
00501
00502
00503 template <int CHAR, class TScalar>
00504 inline
00505 number_eps0< CHAR, TScalar >::number_eps0() :x(0)
00506 {
00507
00508 };
00509
00514 template <int CHAR, class TScalar>
00515 inline number_eps0< CHAR, TScalar >::number_eps0 (TScalar _x) :x(_x)
00516 {
00517 };
00518
00519
00520
00522 template <int CHAR, class TScalar>
00523 inline
00524 number_eps0< CHAR, TScalar >::number_eps0 (TScalar _x, TScalar eps): x(_x)
00525 {
00526 };
00527
00528
00536 template <int CHAR, class TScalar>
00537 inline
00538 number_eps0< CHAR, TScalar >::number_eps0(int epsPrec, std::string dummy):x(0)
00539 {
00540 if (epsPrec!=0)
00541 {
00542 std::cerr << " allowed epsPrecision is { 0 }" << std::endl;
00543 throw(" allowed epsPrecision is { 0 }");
00544 }
00545
00546 }
00547
00548
00549
00550 template <int CHAR, class TScalar>
00551 inline bool
00552 number_eps0< CHAR, TScalar >::wellDefined()
00553 {
00554 assert(sizeof(long long)>sizeof(TScalar));
00555
00556 long test = pow( 2, sizeof(TScalar)*8 )-1;
00557 TScalar test2 = test;
00558 test = test2;
00559
00560 if (test<0)
00561 {
00562 std::cerr << "TScalar is signed!" << std::endl;
00563 assert( sizeof(TScalar)*8-1>=bitsize);
00564 }
00565 else
00566 {
00567 std::cerr << "TScalar is unsigned!" << std::endl;
00568 assert( sizeof(TScalar)*8>=bitsize);
00569 }
00570 return true;
00571 }
00572
00573
00574 template <int CHAR, class TScalar>
00575 inline short
00576 number_eps0< CHAR, TScalar >::getEpsDegree() const
00577 {
00578 if ( getX() !=0 )
00579 return 0;
00580 else return -1;
00581 }
00582
00583
00584
00585 template <int CHAR, class TScalar>
00586 inline TScalar
00587 number_eps0< CHAR, TScalar >::getX() const
00588 {
00589 return (x);
00590 };
00591
00592 template <int CHAR, class TScalar>
00593 inline void
00594 number_eps0< CHAR, TScalar >::setX(const TScalar _x)
00595 {
00596 x = _x;
00597 };
00598
00600 template <int CHAR, class TScalar>
00601 inline TScalar
00602 number_eps0< CHAR, TScalar >::getEps() const
00603 {
00604 return 0;
00605 }
00606
00607
00608 template <int CHAR, class TScalar>
00609 inline void
00610 number_eps0< CHAR, TScalar >::setEps(const TScalar eps) const
00611 {
00612 if (eps!=0)
00613 assert(true==false);
00614 };
00615
00616
00617 template <int CHAR, class TScalar>
00618 inline int
00619 number_eps0< CHAR, TScalar >::getValue( unsigned short _epsExp) const
00620 {
00621 if(_epsExp==0)
00622 return x;
00623 return 0;
00624 };
00625
00626
00635 template <int CHAR, class TScalar>
00636 inline void number_eps0< CHAR, TScalar >::setValue( unsigned short _epsExponent, TScalar coeff)
00637 {
00638 if (_epsExponent==0)
00639 x = coeff;
00640 else if ( coeff!=0 )
00641 assert(true==false);
00642 }
00643
00644
00645
00646
00647
00648 template <int CHAR, class TScalar>
00649 inline size_t
00650 number_eps0< CHAR, TScalar >::getSingleIndex(const number_eps0< CHAR, TScalar > b)
00651 {
00652 return( (size_t)b.x );
00653 }
00654
00655
00656 template <int CHAR, class TScalar>
00657 inline size_t
00658 number_eps0< CHAR, TScalar >::getSingleIndexByRef(const number_eps0< CHAR, TScalar > & b)
00659 {
00660 return( (size_t)b.x );
00661 }
00662
00663 template <int CHAR, class TScalar>
00664 inline size_t
00665 number_eps0< CHAR, TScalar >::getPairIndex(const number_eps0< CHAR, TScalar > a,
00666 const number_eps0< CHAR, TScalar > b)
00667 {
00668 #ifdef SAFE
00669 size_t res = a.x;
00670 res = ( (res<<bitsize) | b.x );
00671 assert( res==( ((size_t)a.x<< bitsize) | b.x) );
00672 #endif
00673 return( ((size_t)a.x<< needbits<CHAR>::value) | (size_t)b.x );
00674 }
00675
00676
00677 template <int CHAR,class TScalar>
00678 inline size_t
00679 number_eps0< CHAR, TScalar >::getPairIndexByRef(const number_eps0< CHAR, TScalar > & a,
00680 const number_eps0< CHAR, TScalar > & b)
00681 {
00682 #ifdef SAFE
00683 size_t res = a.x;
00684 res = ( (res<<bitsize) | b.x );
00685 assert( res==( ((size_t)a.x<<bitsize) | b.x ) );
00686 #endif
00687 return( ( (size_t)a.x<< needbits<CHAR>::value ) | (size_t)b.x );
00688 }
00689
00690
00691 template <int CHAR,class TScalar>
00692 inline size_t
00693 number_eps0< CHAR, TScalar >::getSingleIndex (const number_eps0< CHAR, TScalar > b,
00694 const TScalar characteristic)
00695 {
00696 return getSingleIndex(b);
00697 }
00698
00699
00700 template <int CHAR,class TScalar>
00701 inline size_t
00702 number_eps0< CHAR, TScalar >::getSingleIndexByRef(const number_eps0< CHAR, TScalar > & b,
00703 const TScalar & characteristic)
00704 {
00705 return getSingleIndexByRef(b);
00706 }
00707
00708
00709 template <int CHAR, class TScalar>
00710 inline size_t
00711 number_eps0< CHAR, TScalar >::getPairIndex(const number_eps0< CHAR, TScalar > a,
00712 const number_eps0< CHAR, TScalar > b,
00713 const TScalar characteristic)
00714 {
00715 return getPairIndex(a,b);
00716 }
00717
00718
00719 template <int CHAR, class TScalar>
00720 inline size_t
00721 number_eps0< CHAR, TScalar >::getPairIndexByRef( const number_eps0< CHAR, TScalar > & a,
00722 const number_eps0< CHAR, TScalar > & b,
00723 const TScalar & characteristic)
00724 {
00725 return getPairIndexByRef(a,b);
00726 }
00727
00728
00729 template <int CHAR, class TScalar>
00730 inline size_t
00731 number_eps0< CHAR, TScalar >::getMaxSingleIndex(const TScalar characteristic)
00732 {
00733 return( (size_t)(characteristic-1) );
00734 }
00735
00736
00737 template <int CHAR, class TScalar>
00738 inline size_t
00739 number_eps0< CHAR, TScalar >::getMaxPairIndex (const TScalar characteristic)
00740 {
00741 return ( ( (size_t)(characteristic-1)<<bitsize) | (size_t)(characteristic-1) );
00742 }
00743
00744
00745
00746 template <int CHAR, class TScalar>
00747 inline bool
00748 number_eps0< CHAR, TScalar >::isZero() const
00749 {
00750 return ( x==0 );
00751 };
00752
00753
00754 template <int CHAR, class TScalar>
00755 inline bool
00756 number_eps0< CHAR, TScalar >::isNotZero() const
00757 {
00758 return ( x!=0 );
00759 };
00760
00762 template <int CHAR, class TScalar>
00763 inline bool
00764 number_eps0< CHAR, TScalar >::nearlyEqual(const number_eps0 z) const
00765 {
00766 return ( x == z.x );
00767 };
00768
00769
00770 template <int CHAR, class TScalar>
00771 inline int
00772 number_eps0< CHAR, TScalar >::operator==(const number_eps0 & z) const
00773 {
00774 return ( x == z.x );
00775 }
00776
00777
00778 template <int CHAR, class TScalar>
00779 inline int
00780 number_eps0< CHAR, TScalar >::operator!=(const number_eps0 & z) const
00781 {
00782 return ( x != z.x );
00783 }
00784
00785
00786
00787
00788 template <int CHAR,class TScalar>
00789 std::ostream &
00790 operator<<(std::ostream & out, const number_eps0<CHAR, TScalar>& z)
00791 {
00792
00793 out << (int)z.getX() ;
00794 if (z.getEps()!=0)
00795 {
00796 out << " + ";
00797 out << (int)z.getEps() << "*eps " ;
00798 }
00799 return out;
00800 } ;
00801
00802
00803
00804
00805
00806
00807
00808
00809