00001
00010 #ifndef __FPV_H__
00011 #define __FPV_H__
00012
00013 #include "number.h"
00014
00016
00024 class fpv : public number<double>
00025 {
00026 public:
00027
00029
00042 virtual double stringToValue( const char* stringValue )
00043 {
00044 return stringToDbl( stringValue, &bms );
00045 };
00046
00047 public:
00048
00050
00055 fpv(const double val)
00056 {
00057 assignCopy( val );
00058 };
00059
00061
00066 fpv(const fpv& val)
00067 {
00068 assignCopy( val );
00069 };
00070
00072
00089 void printBitpattern( FILE* file=(FILE*)0 ) const
00090 {
00091 ::printBitpattern( value, file );
00092 };
00093
00095
00107 void printBitpatternFormatted( FILE* file=0 ) const
00108 {
00109 ::printBitpatternFormatted( value, file );
00110 };
00111
00113
00115
00117
00124 fpv operator + (const double addend) const
00125 {
00126 fpv res(*this);
00127 res.assignAdd( addend );
00128 return res;
00129 };
00130
00132
00140 fpv operator + (const fpv& addend) const
00141 {
00142 fpv res(*this);
00143 res.assignAdd( addend );
00144 return res;
00145 };
00146
00148
00156 inline fpv operator - (const double& subtrahend) const
00157 {
00158 fpv res(*this);
00159 res.assignSub( subtrahend );
00160 return res;
00161 };
00162
00164
00172 inline fpv operator - (const fpv& subtrahend) const
00173 {
00174 fpv res(*this);
00175 res.bms.status |= subtrahend.bms.status;
00176 res.assignSub( subtrahend.value );
00177 return res;
00178 };
00179
00181
00189 inline fpv operator * (const double multiplicand) const
00190 {
00191 fpv res(*this);
00192 res.assignMul( multiplicand );
00193 return res;
00194 };
00195
00197
00205 inline fpv operator * (const fpv& multiplicand) const
00206 {
00207 fpv res(*this);
00208 res.bms.status |= multiplicand.bms.status;
00209 res.assignMul( multiplicand.value );
00210 return res;
00211 };
00212
00214
00221 inline fpv operator / (const double denominator) const
00222 {
00223 fpv res(*this);
00224 res.assignDiv( denominator );
00225 return res;
00226 };
00227
00229
00236 inline fpv operator / (const fpv& denominator) const
00237 {
00238 fpv res(*this);
00239 res.assignDiv( denominator );
00240 return res;
00241 };
00242
00244
00251 inline fpv operator % (const double denominator) const
00252 {
00253 fpv remainder(*this);
00254 remainder.assignMod( denominator );
00255 return remainder;
00256 }
00257
00259
00268 inline fpv operator % (const fpv& denominator) const
00269 {
00270 fpv remainder(*this);
00271 remainder.assignMod( denominator );
00272 return remainder;
00273 }
00274
00276
00281 inline fpv& assignReciproc()
00282 {
00283 value = reciproc_x( value, &bms );
00284 return *this;
00285 };
00286
00288
00294 inline fpv reciproc() const
00295 {
00296 fpv recVal( *this );
00297 recVal.assignReciproc();
00298 return recVal;
00299 };
00300
00302
00304
00306
00324 inline fpv& assignCeil()
00325 {
00326
00327
00328 value = Ceil( value, &bms );
00329 return *this;
00330 };
00331
00333
00352 inline fpv ceil() const
00353 {
00354 fpv ceilVal( *this );
00355 ceilVal.assignCeil();
00356 return ceilVal;
00357 };
00358
00360
00380 inline fpv& assignFloor()
00381 {
00382
00383
00384 value = Floor( value, &bms );
00385 return *this;
00386 };
00387
00389
00408 inline fpv floor() const
00409 {
00410 fpv floorVal( *this );
00411 floorVal.assignFloor();
00412 return floorVal;
00413 };
00414
00416
00443 inline fpv& assignInteger()
00444 {
00445
00446 double iDbl = 0.0;
00447 toInt64( value, &iDbl, &bms );
00448 value = iDbl;
00449 return *this;
00450 };
00451
00453
00461 inline fpv integer() const
00462 {
00463
00464 fpv intVal( *this );
00465 intVal.assignInteger();
00466 return intVal;
00467 };
00468
00470
00485 inline fpv& assignRound( const int decPlaces=0 )
00486 {
00487 value = Round( value, decPlaces, &bms );
00488 return *this;
00489 };
00490
00492
00503 inline fpv round( const long decPlaces ) const
00504 {
00505 fpv rndVal( *this );
00506 rndVal.assignRound( decPlaces );
00507 return rndVal;
00508 };
00509
00511
00513
00515
00523 fpv positive() const
00524 {
00525 fpv absVal( *this );
00526 absVal.assignPositive();
00527 return absVal;
00528 };
00529
00531
00539 fpv negative() const
00540 {
00541 fpv negVal( *this );
00542 negVal.assignNegative();
00543 return negVal;
00544 };
00545
00547
00555 inline fpv inv() const
00556 {
00557 fpv invVal( *this );
00558 invVal.assignInvertSign();
00559 return invVal;
00560 };
00561
00563
00565
00567
00569
00571
00580 fpv pow( const double exponent )
00581 {
00582 fpv result(*this);
00583 result.assignPow( exponent );
00584 return result;
00585 };
00586
00588
00596 inline fpv sqrt() const
00597 {
00598
00599
00600 fpv sr( *this );
00601 sr.assignSqrt();
00602 return sr;
00603 };
00604
00606
00614 inline fpv root(const long rootExp) const
00615 {
00616
00617
00618 fpv rt( *this );
00619 rt.assignRoot( rootExp );
00620 return rt;
00621 };
00622
00624
00635 inline fpv log( const double base ) const
00636 {
00637 fpv logVal(*this);
00638 logVal.assignLog( base );
00639 return logVal;
00640 };
00641
00643
00645
00647
00649
00651
00664 inline fpv& assignRad()
00665 {
00666
00667 assignMul( PI1 );
00668 return *this;
00669 };
00670
00672
00685 inline fpv rad() const
00686 {
00687
00688 fpv radVal( *this );
00689 radVal.assignRad();
00690 return radVal;
00691 };
00692
00694
00708 inline fpv& assignDeg()
00709 {
00710
00711 assignMul( DEG1 );
00712 return *this;
00713 };
00714
00716
00730 inline fpv deg() const
00731 {
00732
00733 fpv degVal( *this );
00734 degVal.assignDeg();
00735 return degVal;
00736 };
00737
00739
00755 inline fpv& assignSin()
00756 {
00757 value = sinus( value, &bms );
00758 return *this;
00759 };
00760
00762
00776 inline fpv sin() const
00777 {
00778 fpv sinVal( *this );
00779 sinVal.assignSin();
00780 return sinVal;
00781 };
00782
00784
00796 inline fpv& assignASin()
00797 {
00798 value = arcSin( value, &bms );
00799 return *this;
00800 };
00801
00803
00815 inline fpv asin() const
00816 {
00817 fpv arcSinVal( *this );
00818 arcSinVal.assignASin();
00819 return arcSinVal;
00820 };
00821
00823
00837 inline fpv& assignCos()
00838 {
00839 value = cosinus( value, &bms );
00840 return *this;
00841 };
00842
00844
00858 inline fpv cos() const
00859 {
00860 fpv cosVal( *this );
00861 cosVal.assignCos();
00862 return cosVal;
00863 };
00864
00866
00878 inline fpv& assignACos()
00879 {
00880 value = arcCos( value, &bms );
00881 return *this;
00882 };
00883
00885
00897 inline fpv acos() const
00898 {
00899 fpv arcCosVal( *this );
00900 arcCosVal.assignACos();
00901 return arcCosVal;
00902 };
00903
00905
00923 inline fpv& assignTan()
00924 {
00925
00926 value = tangent( value, &bms );
00927 return *this;
00928 };
00929
00931
00949 inline fpv tan() const
00950 {
00951 fpv tanVal( *this );
00952 tanVal.assignTan();
00953 return tanVal;
00954 };
00955
00957
00966 inline fpv& assignATan()
00967 {
00968 value = arcTan( value, &bms );
00969 return *this;
00970 };
00971
00973
00985 inline fpv atan() const
00986 {
00987 fpv arcTanVal( *this );
00988 arcTanVal.assignATan();
00989 return arcTanVal;
00990 };
00991
00993
01010 inline fpv& assignCot()
01011 {
01012 value = cotangent( value, &bms );
01013 return *this;
01014 };
01015
01017
01034 inline fpv cot() const
01035 {
01036 fpv cotVal( *this );
01037 cotVal.assignCot();
01038 return cotVal;
01039 };
01040
01042
01061 inline fpv& assignACot()
01062 {
01063 value = arcCot( value, &bms );
01064 return *this;
01065 };
01066
01068
01086 inline fpv acot() const
01087 {
01088 fpv aCotVal( *this );
01089 aCotVal.assignACot();
01090 return aCotVal;
01091 };
01092 };
01093
01094 #endif //__FPV_H__