basicNumber.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
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
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
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));
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
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
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
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
00220
00221
00222
00223
00224
00225
00226
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
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
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
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
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
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
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
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
00384 template <typename TScalar>
00385 inline fieldScalar<TScalar>::fieldScalar() : x(0) {};
00386
00387
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
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));
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
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
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
00558
00559
00560
00561
00562
00563
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
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