00001
00051 #include <stdio.h>
00052 #include <stdlib.h>
00053 #include <string.h>
00054 #include <math.h>
00055 #include "util.h"
00056 #include "epd.h"
00057
00058
00070 EpDouble *
00071 EpdAlloc(void)
00072 {
00073 EpDouble *epd;
00074
00075 epd = ALLOC(EpDouble, 1);
00076 return(epd);
00077 }
00078
00079
00091 int
00092 EpdCmp(const char *key1, const char *key2)
00093 {
00094 EpDouble *epd1 = (EpDouble *) key1;
00095 EpDouble *epd2 = (EpDouble *) key2;
00096 if (epd1->type.value != epd2->type.value ||
00097 epd1->exponent != epd2->exponent) {
00098 return(1);
00099 }
00100 return(0);
00101 }
00102
00103
00115 void
00116 EpdFree(EpDouble *epd)
00117 {
00118 FREE(epd);
00119 }
00120
00121
00133 void
00134 EpdGetString(EpDouble *epd, char *str)
00135 {
00136 double value;
00137 int exponent;
00138 char *pos;
00139
00140 if (IsNanDouble(epd->type.value)) {
00141 sprintf(str, "NaN");
00142 return;
00143 } else if (IsInfDouble(epd->type.value)) {
00144 if (epd->type.bits.sign == 1)
00145 sprintf(str, "-Inf");
00146 else
00147 sprintf(str, "Inf");
00148 return;
00149 }
00150
00151 assert(epd->type.bits.exponent == EPD_MAX_BIN ||
00152 epd->type.bits.exponent == 0);
00153
00154 EpdGetValueAndDecimalExponent(epd, &value, &exponent);
00155 sprintf(str, "%e", value);
00156 pos = strstr(str, "e");
00157 if (exponent >= 0) {
00158 if (exponent < 10)
00159 sprintf(pos + 1, "+0%d", exponent);
00160 else
00161 sprintf(pos + 1, "+%d", exponent);
00162 } else {
00163 exponent *= -1;
00164 if (exponent < 10)
00165 sprintf(pos + 1, "-0%d", exponent);
00166 else
00167 sprintf(pos + 1, "-%d", exponent);
00168 }
00169 }
00170
00171
00183 void
00184 EpdConvert(double value, EpDouble *epd)
00185 {
00186 epd->type.value = value;
00187 epd->exponent = 0;
00188 EpdNormalize(epd);
00189 }
00190
00191
00203 void
00204 EpdMultiply(EpDouble *epd1, double value)
00205 {
00206 EpDouble epd2;
00207 double tmp;
00208 int exponent;
00209
00210 if (EpdIsNan(epd1) || IsNanDouble(value)) {
00211 EpdMakeNan(epd1);
00212 return;
00213 } else if (EpdIsInf(epd1) || IsInfDouble(value)) {
00214 int sign;
00215
00216 EpdConvert(value, &epd2);
00217 sign = epd1->type.bits.sign ^ epd2.type.bits.sign;
00218 EpdMakeInf(epd1, sign);
00219 return;
00220 }
00221
00222 assert(epd1->type.bits.exponent == EPD_MAX_BIN);
00223
00224 EpdConvert(value, &epd2);
00225 tmp = epd1->type.value * epd2.type.value;
00226 exponent = epd1->exponent + epd2.exponent;
00227 epd1->type.value = tmp;
00228 epd1->exponent = exponent;
00229 EpdNormalize(epd1);
00230 }
00231
00232
00244 void
00245 EpdMultiply2(EpDouble *epd1, EpDouble *epd2)
00246 {
00247 double value;
00248 int exponent;
00249
00250 if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
00251 EpdMakeNan(epd1);
00252 return;
00253 } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
00254 int sign;
00255
00256 sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
00257 EpdMakeInf(epd1, sign);
00258 return;
00259 }
00260
00261 assert(epd1->type.bits.exponent == EPD_MAX_BIN);
00262 assert(epd2->type.bits.exponent == EPD_MAX_BIN);
00263
00264 value = epd1->type.value * epd2->type.value;
00265 exponent = epd1->exponent + epd2->exponent;
00266 epd1->type.value = value;
00267 epd1->exponent = exponent;
00268 EpdNormalize(epd1);
00269 }
00270
00271
00283 void
00284 EpdMultiply2Decimal(EpDouble *epd1, EpDouble *epd2)
00285 {
00286 double value;
00287 int exponent;
00288
00289 if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
00290 EpdMakeNan(epd1);
00291 return;
00292 } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
00293 int sign;
00294
00295 sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
00296 EpdMakeInf(epd1, sign);
00297 return;
00298 }
00299
00300 value = epd1->type.value * epd2->type.value;
00301 exponent = epd1->exponent + epd2->exponent;
00302 epd1->type.value = value;
00303 epd1->exponent = exponent;
00304 EpdNormalizeDecimal(epd1);
00305 }
00306
00307
00319 void
00320 EpdMultiply3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
00321 {
00322 if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
00323 EpdMakeNan(epd1);
00324 return;
00325 } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
00326 int sign;
00327
00328 sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
00329 EpdMakeInf(epd3, sign);
00330 return;
00331 }
00332
00333 assert(epd1->type.bits.exponent == EPD_MAX_BIN);
00334 assert(epd2->type.bits.exponent == EPD_MAX_BIN);
00335
00336 epd3->type.value = epd1->type.value * epd2->type.value;
00337 epd3->exponent = epd1->exponent + epd2->exponent;
00338 EpdNormalize(epd3);
00339 }
00340
00341
00353 void
00354 EpdMultiply3Decimal(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
00355 {
00356 if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
00357 EpdMakeNan(epd1);
00358 return;
00359 } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
00360 int sign;
00361
00362 sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
00363 EpdMakeInf(epd3, sign);
00364 return;
00365 }
00366
00367 epd3->type.value = epd1->type.value * epd2->type.value;
00368 epd3->exponent = epd1->exponent + epd2->exponent;
00369 EpdNormalizeDecimal(epd3);
00370 }
00371
00372
00384 void
00385 EpdDivide(EpDouble *epd1, double value)
00386 {
00387 EpDouble epd2;
00388 double tmp;
00389 int exponent;
00390
00391 if (EpdIsNan(epd1) || IsNanDouble(value)) {
00392 EpdMakeNan(epd1);
00393 return;
00394 } else if (EpdIsInf(epd1) || IsInfDouble(value)) {
00395 int sign;
00396
00397 EpdConvert(value, &epd2);
00398 if (EpdIsInf(epd1) && IsInfDouble(value)) {
00399 EpdMakeNan(epd1);
00400 } else if (EpdIsInf(epd1)) {
00401 sign = epd1->type.bits.sign ^ epd2.type.bits.sign;
00402 EpdMakeInf(epd1, sign);
00403 } else {
00404 sign = epd1->type.bits.sign ^ epd2.type.bits.sign;
00405 EpdMakeZero(epd1, sign);
00406 }
00407 return;
00408 }
00409
00410 if (value == 0.0) {
00411 EpdMakeNan(epd1);
00412 return;
00413 }
00414
00415 assert(epd1->type.bits.exponent == EPD_MAX_BIN);
00416
00417 EpdConvert(value, &epd2);
00418 tmp = epd1->type.value / epd2.type.value;
00419 exponent = epd1->exponent - epd2.exponent;
00420 epd1->type.value = tmp;
00421 epd1->exponent = exponent;
00422 EpdNormalize(epd1);
00423 }
00424
00425
00437 void
00438 EpdDivide2(EpDouble *epd1, EpDouble *epd2)
00439 {
00440 double value;
00441 int exponent;
00442
00443 if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
00444 EpdMakeNan(epd1);
00445 return;
00446 } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
00447 int sign;
00448
00449 if (EpdIsInf(epd1) && EpdIsInf(epd2)) {
00450 EpdMakeNan(epd1);
00451 } else if (EpdIsInf(epd1)) {
00452 sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
00453 EpdMakeInf(epd1, sign);
00454 } else {
00455 sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
00456 EpdMakeZero(epd1, sign);
00457 }
00458 return;
00459 }
00460
00461 if (epd2->type.value == 0.0) {
00462 EpdMakeNan(epd1);
00463 return;
00464 }
00465
00466 assert(epd1->type.bits.exponent == EPD_MAX_BIN);
00467 assert(epd2->type.bits.exponent == EPD_MAX_BIN);
00468
00469 value = epd1->type.value / epd2->type.value;
00470 exponent = epd1->exponent - epd2->exponent;
00471 epd1->type.value = value;
00472 epd1->exponent = exponent;
00473 EpdNormalize(epd1);
00474 }
00475
00476
00488 void
00489 EpdDivide3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
00490 {
00491 if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
00492 EpdMakeNan(epd3);
00493 return;
00494 } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
00495 int sign;
00496
00497 if (EpdIsInf(epd1) && EpdIsInf(epd2)) {
00498 EpdMakeNan(epd3);
00499 } else if (EpdIsInf(epd1)) {
00500 sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
00501 EpdMakeInf(epd3, sign);
00502 } else {
00503 sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
00504 EpdMakeZero(epd3, sign);
00505 }
00506 return;
00507 }
00508
00509 if (epd2->type.value == 0.0) {
00510 EpdMakeNan(epd3);
00511 return;
00512 }
00513
00514 assert(epd1->type.bits.exponent == EPD_MAX_BIN);
00515 assert(epd2->type.bits.exponent == EPD_MAX_BIN);
00516
00517 epd3->type.value = epd1->type.value / epd2->type.value;
00518 epd3->exponent = epd1->exponent - epd2->exponent;
00519 EpdNormalize(epd3);
00520 }
00521
00522
00534 void
00535 EpdAdd(EpDouble *epd1, double value)
00536 {
00537 EpDouble epd2;
00538 double tmp;
00539 int exponent, diff;
00540
00541 if (EpdIsNan(epd1) || IsNanDouble(value)) {
00542 EpdMakeNan(epd1);
00543 return;
00544 } else if (EpdIsInf(epd1) || IsInfDouble(value)) {
00545 int sign;
00546
00547 EpdConvert(value, &epd2);
00548 if (EpdIsInf(epd1) && IsInfDouble(value)) {
00549 sign = epd1->type.bits.sign ^ epd2.type.bits.sign;
00550 if (sign == 1)
00551 EpdMakeNan(epd1);
00552 } else if (EpdIsInf(&epd2)) {
00553 EpdCopy(&epd2, epd1);
00554 }
00555 return;
00556 }
00557
00558 assert(epd1->type.bits.exponent == EPD_MAX_BIN);
00559
00560 EpdConvert(value, &epd2);
00561 if (epd1->exponent > epd2.exponent) {
00562 diff = epd1->exponent - epd2.exponent;
00563 if (diff <= EPD_MAX_BIN)
00564 tmp = epd1->type.value + epd2.type.value / pow((double)2.0, (double)diff);
00565 else
00566 tmp = epd1->type.value;
00567 exponent = epd1->exponent;
00568 } else if (epd1->exponent < epd2.exponent) {
00569 diff = epd2.exponent - epd1->exponent;
00570 if (diff <= EPD_MAX_BIN)
00571 tmp = epd1->type.value / pow((double)2.0, (double)diff) + epd2.type.value;
00572 else
00573 tmp = epd2.type.value;
00574 exponent = epd2.exponent;
00575 } else {
00576 tmp = epd1->type.value + epd2.type.value;
00577 exponent = epd1->exponent;
00578 }
00579 epd1->type.value = tmp;
00580 epd1->exponent = exponent;
00581 EpdNormalize(epd1);
00582 }
00583
00584
00596 void
00597 EpdAdd2(EpDouble *epd1, EpDouble *epd2)
00598 {
00599 double value;
00600 int exponent, diff;
00601
00602 if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
00603 EpdMakeNan(epd1);
00604 return;
00605 } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
00606 int sign;
00607
00608 if (EpdIsInf(epd1) && EpdIsInf(epd2)) {
00609 sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
00610 if (sign == 1)
00611 EpdMakeNan(epd1);
00612 } else if (EpdIsInf(epd2)) {
00613 EpdCopy(epd2, epd1);
00614 }
00615 return;
00616 }
00617
00618 assert(epd1->type.bits.exponent == EPD_MAX_BIN);
00619 assert(epd2->type.bits.exponent == EPD_MAX_BIN);
00620
00621 if (epd1->exponent > epd2->exponent) {
00622 diff = epd1->exponent - epd2->exponent;
00623 if (diff <= EPD_MAX_BIN) {
00624 value = epd1->type.value +
00625 epd2->type.value / pow((double)2.0, (double)diff);
00626 } else
00627 value = epd1->type.value;
00628 exponent = epd1->exponent;
00629 } else if (epd1->exponent < epd2->exponent) {
00630 diff = epd2->exponent - epd1->exponent;
00631 if (diff <= EPD_MAX_BIN) {
00632 value = epd1->type.value / pow((double)2.0, (double)diff) +
00633 epd2->type.value;
00634 } else
00635 value = epd2->type.value;
00636 exponent = epd2->exponent;
00637 } else {
00638 value = epd1->type.value + epd2->type.value;
00639 exponent = epd1->exponent;
00640 }
00641 epd1->type.value = value;
00642 epd1->exponent = exponent;
00643 EpdNormalize(epd1);
00644 }
00645
00646
00658 void
00659 EpdAdd3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
00660 {
00661 double value;
00662 int exponent, diff;
00663
00664 if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
00665 EpdMakeNan(epd3);
00666 return;
00667 } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
00668 int sign;
00669
00670 if (EpdIsInf(epd1) && EpdIsInf(epd2)) {
00671 sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
00672 if (sign == 1)
00673 EpdMakeNan(epd3);
00674 else
00675 EpdCopy(epd1, epd3);
00676 } else if (EpdIsInf(epd1)) {
00677 EpdCopy(epd1, epd3);
00678 } else {
00679 EpdCopy(epd2, epd3);
00680 }
00681 return;
00682 }
00683
00684 assert(epd1->type.bits.exponent == EPD_MAX_BIN);
00685 assert(epd2->type.bits.exponent == EPD_MAX_BIN);
00686
00687 if (epd1->exponent > epd2->exponent) {
00688 diff = epd1->exponent - epd2->exponent;
00689 if (diff <= EPD_MAX_BIN) {
00690 value = epd1->type.value +
00691 epd2->type.value / pow((double)2.0, (double)diff);
00692 } else
00693 value = epd1->type.value;
00694 exponent = epd1->exponent;
00695 } else if (epd1->exponent < epd2->exponent) {
00696 diff = epd2->exponent - epd1->exponent;
00697 if (diff <= EPD_MAX_BIN) {
00698 value = epd1->type.value / pow((double)2.0, (double)diff) +
00699 epd2->type.value;
00700 } else
00701 value = epd2->type.value;
00702 exponent = epd2->exponent;
00703 } else {
00704 value = epd1->type.value + epd2->type.value;
00705 exponent = epd1->exponent;
00706 }
00707 epd3->type.value = value;
00708 epd3->exponent = exponent;
00709 EpdNormalize(epd3);
00710 }
00711
00712
00724 void
00725 EpdSubtract(EpDouble *epd1, double value)
00726 {
00727 EpDouble epd2;
00728 double tmp;
00729 int exponent, diff;
00730
00731 if (EpdIsNan(epd1) || IsNanDouble(value)) {
00732 EpdMakeNan(epd1);
00733 return;
00734 } else if (EpdIsInf(epd1) || IsInfDouble(value)) {
00735 int sign;
00736
00737 EpdConvert(value, &epd2);
00738 if (EpdIsInf(epd1) && IsInfDouble(value)) {
00739 sign = epd1->type.bits.sign ^ epd2.type.bits.sign;
00740 if (sign == 0)
00741 EpdMakeNan(epd1);
00742 } else if (EpdIsInf(&epd2)) {
00743 EpdCopy(&epd2, epd1);
00744 }
00745 return;
00746 }
00747
00748 assert(epd1->type.bits.exponent == EPD_MAX_BIN);
00749
00750 EpdConvert(value, &epd2);
00751 if (epd1->exponent > epd2.exponent) {
00752 diff = epd1->exponent - epd2.exponent;
00753 if (diff <= EPD_MAX_BIN)
00754 tmp = epd1->type.value - epd2.type.value / pow((double)2.0, (double)diff);
00755 else
00756 tmp = epd1->type.value;
00757 exponent = epd1->exponent;
00758 } else if (epd1->exponent < epd2.exponent) {
00759 diff = epd2.exponent - epd1->exponent;
00760 if (diff <= EPD_MAX_BIN)
00761 tmp = epd1->type.value / pow((double)2.0, (double)diff) - epd2.type.value;
00762 else
00763 tmp = epd2.type.value * (double)(-1.0);
00764 exponent = epd2.exponent;
00765 } else {
00766 tmp = epd1->type.value - epd2.type.value;
00767 exponent = epd1->exponent;
00768 }
00769 epd1->type.value = tmp;
00770 epd1->exponent = exponent;
00771 EpdNormalize(epd1);
00772 }
00773
00774
00786 void
00787 EpdSubtract2(EpDouble *epd1, EpDouble *epd2)
00788 {
00789 double value;
00790 int exponent, diff;
00791
00792 if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
00793 EpdMakeNan(epd1);
00794 return;
00795 } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
00796 int sign;
00797
00798 if (EpdIsInf(epd1) && EpdIsInf(epd2)) {
00799 sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
00800 if (sign == 0)
00801 EpdMakeNan(epd1);
00802 } else if (EpdIsInf(epd2)) {
00803 EpdCopy(epd2, epd1);
00804 }
00805 return;
00806 }
00807
00808 assert(epd1->type.bits.exponent == EPD_MAX_BIN);
00809 assert(epd2->type.bits.exponent == EPD_MAX_BIN);
00810
00811 if (epd1->exponent > epd2->exponent) {
00812 diff = epd1->exponent - epd2->exponent;
00813 if (diff <= EPD_MAX_BIN) {
00814 value = epd1->type.value -
00815 epd2->type.value / pow((double)2.0, (double)diff);
00816 } else
00817 value = epd1->type.value;
00818 exponent = epd1->exponent;
00819 } else if (epd1->exponent < epd2->exponent) {
00820 diff = epd2->exponent - epd1->exponent;
00821 if (diff <= EPD_MAX_BIN) {
00822 value = epd1->type.value / pow((double)2.0, (double)diff) -
00823 epd2->type.value;
00824 } else
00825 value = epd2->type.value * (double)(-1.0);
00826 exponent = epd2->exponent;
00827 } else {
00828 value = epd1->type.value - epd2->type.value;
00829 exponent = epd1->exponent;
00830 }
00831 epd1->type.value = value;
00832 epd1->exponent = exponent;
00833 EpdNormalize(epd1);
00834 }
00835
00836
00848 void
00849 EpdSubtract3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
00850 {
00851 double value;
00852 int exponent, diff;
00853
00854 if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
00855 EpdMakeNan(epd3);
00856 return;
00857 } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
00858 int sign;
00859
00860 if (EpdIsInf(epd1) && EpdIsInf(epd2)) {
00861 sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
00862 if (sign == 0)
00863 EpdCopy(epd1, epd3);
00864 else
00865 EpdMakeNan(epd3);
00866 } else if (EpdIsInf(epd1)) {
00867 EpdCopy(epd1, epd1);
00868 } else {
00869 sign = epd2->type.bits.sign ^ 0x1;
00870 EpdMakeInf(epd3, sign);
00871 }
00872 return;
00873 }
00874
00875 assert(epd1->type.bits.exponent == EPD_MAX_BIN);
00876 assert(epd2->type.bits.exponent == EPD_MAX_BIN);
00877
00878 if (epd1->exponent > epd2->exponent) {
00879 diff = epd1->exponent - epd2->exponent;
00880 if (diff <= EPD_MAX_BIN) {
00881 value = epd1->type.value -
00882 epd2->type.value / pow((double)2.0, (double)diff);
00883 } else
00884 value = epd1->type.value;
00885 exponent = epd1->exponent;
00886 } else if (epd1->exponent < epd2->exponent) {
00887 diff = epd2->exponent - epd1->exponent;
00888 if (diff <= EPD_MAX_BIN) {
00889 value = epd1->type.value / pow((double)2.0, (double)diff) -
00890 epd2->type.value;
00891 } else
00892 value = epd2->type.value * (double)(-1.0);
00893 exponent = epd2->exponent;
00894 } else {
00895 value = epd1->type.value - epd2->type.value;
00896 exponent = epd1->exponent;
00897 }
00898 epd3->type.value = value;
00899 epd3->exponent = exponent;
00900 EpdNormalize(epd3);
00901 }
00902
00903
00915 void
00916 EpdPow2(int n, EpDouble *epd)
00917 {
00918 if (n <= EPD_MAX_BIN) {
00919 EpdConvert(pow((double)2.0, (double)n), epd);
00920 } else {
00921 EpDouble epd1, epd2;
00922 int n1, n2;
00923
00924 n1 = n / 2;
00925 n2 = n - n1;
00926 EpdPow2(n1, &epd1);
00927 EpdPow2(n2, &epd2);
00928 EpdMultiply3(&epd1, &epd2, epd);
00929 }
00930 }
00931
00932
00944 void
00945 EpdPow2Decimal(int n, EpDouble *epd)
00946 {
00947 if (n <= EPD_MAX_BIN) {
00948 epd->type.value = pow((double)2.0, (double)n);
00949 epd->exponent = 0;
00950 EpdNormalizeDecimal(epd);
00951 } else {
00952 EpDouble epd1, epd2;
00953 int n1, n2;
00954
00955 n1 = n / 2;
00956 n2 = n - n1;
00957 EpdPow2Decimal(n1, &epd1);
00958 EpdPow2Decimal(n2, &epd2);
00959 EpdMultiply3Decimal(&epd1, &epd2, epd);
00960 }
00961 }
00962
00963
00975 void
00976 EpdNormalize(EpDouble *epd)
00977 {
00978 int exponent;
00979
00980 if (IsNanOrInfDouble(epd->type.value)) {
00981 epd->exponent = 0;
00982 return;
00983 }
00984
00985 exponent = EpdGetExponent(epd->type.value);
00986 if (exponent == EPD_MAX_BIN)
00987 return;
00988 exponent -= EPD_MAX_BIN;
00989 epd->type.bits.exponent = EPD_MAX_BIN;
00990 epd->exponent += exponent;
00991 }
00992
00993
01005 void
01006 EpdNormalizeDecimal(EpDouble *epd)
01007 {
01008 int exponent;
01009
01010 if (IsNanOrInfDouble(epd->type.value)) {
01011 epd->exponent = 0;
01012 return;
01013 }
01014
01015 exponent = EpdGetExponentDecimal(epd->type.value);
01016 epd->type.value /= pow((double)10.0, (double)exponent);
01017 epd->exponent += exponent;
01018 }
01019
01020
01032 void
01033 EpdGetValueAndDecimalExponent(EpDouble *epd, double *value, int *exponent)
01034 {
01035 EpDouble epd1, epd2;
01036
01037 if (EpdIsNanOrInf(epd))
01038 return;
01039
01040 if (EpdIsZero(epd)) {
01041 *value = 0.0;
01042 *exponent = 0;
01043 return;
01044 }
01045
01046 epd1.type.value = epd->type.value;
01047 epd1.exponent = 0;
01048 EpdPow2Decimal(epd->exponent, &epd2);
01049 EpdMultiply2Decimal(&epd1, &epd2);
01050
01051 *value = epd1.type.value;
01052 *exponent = epd1.exponent;
01053 }
01054
01066 int
01067 EpdGetExponent(double value)
01068 {
01069 int exponent;
01070 EpDouble epd;
01071
01072 epd.type.value = value;
01073 exponent = epd.type.bits.exponent;
01074 return(exponent);
01075 }
01076
01077
01089 int
01090 EpdGetExponentDecimal(double value)
01091 {
01092 char *pos, str[24];
01093 int exponent;
01094
01095 sprintf(str, "%E", value);
01096 pos = strstr(str, "E");
01097 sscanf(pos, "E%d", &exponent);
01098 return(exponent);
01099 }
01100
01101
01113 void
01114 EpdMakeInf(EpDouble *epd, int sign)
01115 {
01116 epd->type.bits.mantissa1 = 0;
01117 epd->type.bits.mantissa0 = 0;
01118 epd->type.bits.exponent = EPD_EXP_INF;
01119 epd->type.bits.sign = sign;
01120 epd->exponent = 0;
01121 }
01122
01123
01135 void
01136 EpdMakeZero(EpDouble *epd, int sign)
01137 {
01138 epd->type.bits.mantissa1 = 0;
01139 epd->type.bits.mantissa0 = 0;
01140 epd->type.bits.exponent = 0;
01141 epd->type.bits.sign = sign;
01142 epd->exponent = 0;
01143 }
01144
01145
01157 void
01158 EpdMakeNan(EpDouble *epd)
01159 {
01160 epd->type.nan.mantissa1 = 0;
01161 epd->type.nan.mantissa0 = 0;
01162 epd->type.nan.quiet_bit = 1;
01163 epd->type.nan.exponent = EPD_EXP_INF;
01164 epd->type.nan.sign = 1;
01165 epd->exponent = 0;
01166 }
01167
01168
01180 void
01181 EpdCopy(EpDouble *from, EpDouble *to)
01182 {
01183 to->type.value = from->type.value;
01184 to->exponent = from->exponent;
01185 }
01186
01187
01199 int
01200 EpdIsInf(EpDouble *epd)
01201 {
01202 return(IsInfDouble(epd->type.value));
01203 }
01204
01205
01217 int
01218 EpdIsZero(EpDouble *epd)
01219 {
01220 if (epd->type.value == 0.0)
01221 return(1);
01222 else
01223 return(0);
01224 }
01225
01226
01238 int
01239 EpdIsNan(EpDouble *epd)
01240 {
01241 return(IsNanDouble(epd->type.value));
01242 }
01243
01244
01256 int
01257 EpdIsNanOrInf(EpDouble *epd)
01258 {
01259 return(IsNanOrInfDouble(epd->type.value));
01260 }
01261
01262
01274 int
01275 IsInfDouble(double value)
01276 {
01277 EpType val;
01278
01279 val.value = value;
01280 if (val.bits.exponent == EPD_EXP_INF &&
01281 val.bits.mantissa0 == 0 &&
01282 val.bits.mantissa1 == 0) {
01283 if (val.bits.sign == 0)
01284 return(1);
01285 else
01286 return(-1);
01287 }
01288 return(0);
01289 }
01290
01291
01303 int
01304 IsNanDouble(double value)
01305 {
01306 EpType val;
01307
01308 val.value = value;
01309 if (val.nan.exponent == EPD_EXP_INF &&
01310 val.nan.sign == 1 &&
01311 val.nan.quiet_bit == 1 &&
01312 val.nan.mantissa0 == 0 &&
01313 val.nan.mantissa1 == 0) {
01314 return(1);
01315 }
01316 return(0);
01317 }
01318
01319
01331 int
01332 IsNanOrInfDouble(double value)
01333 {
01334 EpType val;
01335
01336 val.value = value;
01337 if (val.nan.exponent == EPD_EXP_INF &&
01338 val.nan.mantissa0 == 0 &&
01339 val.nan.mantissa1 == 0 &&
01340 (val.nan.sign == 1 || val.nan.quiet_bit == 0)) {
01341 return(1);
01342 }
01343 return(0);
01344 }