Changeset 988
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/real.cpp
r987 r988 347 347 bool real::operator ==(real const &x) const 348 348 { 349 if ((m_signexp << 1) == 0 && (x.m_signexp << 1) == 0) 350 return true; 351 349 352 if (m_signexp != x.m_signexp) 350 353 return false; … … 499 502 } 500 503 504 real exp(real const &x) 505 { 506 int square = 0; 507 508 /* FIXME: this is slow. Find a better way to approximate exp(x) for 509 * large values. */ 510 real tmp = x, one = 1.0; 511 while (tmp > one) 512 { 513 tmp.m_signexp--; 514 square++; 515 } 516 517 real ret = 1.0, fact = 1.0, xn = tmp; 518 519 for (int i = 1; i < 100; i++) 520 { 521 fact *= (real)i; 522 ret += xn / fact; 523 xn *= tmp; 524 } 525 526 for (int i = 0; i < square; i++) 527 ret = ret * ret; 528 529 return ret; 530 } 531 501 532 void real::print(int ndigits) const 502 533 { … … 512 543 /* Normalise x so that mantissa is in [1..9.999] */ 513 544 int exponent = 0; 514 for (real div = r1, newdiv; true; div = newdiv) 515 { 516 newdiv = div * r10; 517 if (x < newdiv) 545 if (x.m_signexp) 546 { 547 for (real div = r1, newdiv; true; div = newdiv) 518 548 { 519 x /= div; 520 break; 549 newdiv = div * r10; 550 if (x < newdiv) 551 { 552 x /= div; 553 break; 554 } 555 exponent++; 521 556 } 522 exponent++; 523 } 524 for (real mul = 1, newx; true; mul *= r10) 525 { 526 newx = x * mul; 527 if (newx >= r1) 557 for (real mul = 1, newx; true; mul *= r10) 528 558 { 529 x = newx; 530 break; 559 newx = x * mul; 560 if (newx >= r1) 561 { 562 x = newx; 563 break; 564 } 565 exponent--; 531 566 } 532 exponent--;533 567 } 534 568 -
trunk/src/real.h
r986 r988 56 56 friend real fres(real const &x); 57 57 friend real sqrt(real const &x); 58 friend real exp(real const &x); 58 59 59 60 void print(int ndigits = 150) const;
Note: See TracChangeset
for help on using the changeset viewer.