SVF
Classes | Macros | Typedefs | Functions
epd.h File Reference

Go to the source code of this file.

Classes

struct  IeeeDoubleStruct
 
struct  IeeeNanStruct
 
union  EpTypeUnion
 
struct  EpDoubleStruct
 

Macros

#define EPD_MAX_BIN   1023
 
#define EPD_MAX_DEC   308
 
#define EPD_EXP_INF   0x7ff
 

Typedefs

typedef struct EpDoubleStruct EpDouble
 
typedef struct IeeeDoubleStruct IeeeDouble
 
typedef struct IeeeNanStruct IeeeNan
 
typedef union EpTypeUnion EpType
 

Functions

EpDoubleEpdAlloc (void)
 
int EpdCmp (const char *key1, const char *key2)
 
void EpdFree (EpDouble *epd)
 
void EpdGetString (EpDouble *epd, char *str)
 
void EpdConvert (double value, EpDouble *epd)
 
void EpdMultiply (EpDouble *epd1, double value)
 
void EpdMultiply2 (EpDouble *epd1, EpDouble *epd2)
 
void EpdMultiply2Decimal (EpDouble *epd1, EpDouble *epd2)
 
void EpdMultiply3 (EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
 
void EpdMultiply3Decimal (EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
 
void EpdDivide (EpDouble *epd1, double value)
 
void EpdDivide2 (EpDouble *epd1, EpDouble *epd2)
 
void EpdDivide3 (EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
 
void EpdAdd (EpDouble *epd1, double value)
 
void EpdAdd2 (EpDouble *epd1, EpDouble *epd2)
 
void EpdAdd3 (EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
 
void EpdSubtract (EpDouble *epd1, double value)
 
void EpdSubtract2 (EpDouble *epd1, EpDouble *epd2)
 
void EpdSubtract3 (EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
 
void EpdPow2 (int n, EpDouble *epd)
 
void EpdPow2Decimal (int n, EpDouble *epd)
 
void EpdNormalize (EpDouble *epd)
 
void EpdNormalizeDecimal (EpDouble *epd)
 
void EpdGetValueAndDecimalExponent (EpDouble *epd, double *value, int *exponent)
 
int EpdGetExponent (double value)
 
int EpdGetExponentDecimal (double value)
 
void EpdMakeInf (EpDouble *epd, int sign)
 
void EpdMakeZero (EpDouble *epd, int sign)
 
void EpdMakeNan (EpDouble *epd)
 
void EpdCopy (EpDouble *from, EpDouble *to)
 
int EpdIsInf (EpDouble *epd)
 
int EpdIsZero (EpDouble *epd)
 
int EpdIsNan (EpDouble *epd)
 
int EpdIsNanOrInf (EpDouble *epd)
 
int IsInfDouble (double value)
 
int IsNanDouble (double value)
 
int IsNanOrInfDouble (double value)
 

Macro Definition Documentation

◆ EPD_EXP_INF

#define EPD_EXP_INF   0x7ff

Definition at line 64 of file epd.h.

◆ EPD_MAX_BIN

#define EPD_MAX_BIN   1023

CHeaderFile*****************************************************************

FileName [epd.h]

PackageName [epd]

Synopsis [The University of Colorado extended double precision package.]

Description [arithmetic functions with extended double precision.]

SeeAlso []

Author [In-Ho Moon]

Copyright [Copyright (c) 1995-2004, Regents of the University of Colorado

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

Neither the name of the University of Colorado nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.]

Revision [

Id
epd.h,v 1.9 2004/08/13 18:20:30 fabio Exp

]

Definition at line 62 of file epd.h.

◆ EPD_MAX_DEC

#define EPD_MAX_DEC   308

Definition at line 63 of file epd.h.

Typedef Documentation

◆ EpDouble

typedef struct EpDoubleStruct EpDouble

Definition at line 145 of file epd.h.

◆ EpType

typedef union EpTypeUnion EpType

Definition at line 148 of file epd.h.

◆ IeeeDouble

typedef struct IeeeDoubleStruct IeeeDouble

Definition at line 146 of file epd.h.

◆ IeeeNan

typedef struct IeeeNanStruct IeeeNan

Definition at line 147 of file epd.h.

Function Documentation

◆ EpdAdd()

void EpdAdd ( EpDouble epd1,
double  value 
)

Function********************************************************************

Synopsis [Adds two arbitrary precision double values.]

Description [Adds two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 535 of file epd.c.

536 {
537  EpDouble epd2;
538  double tmp;
539  int exponent, diff;
540 
541  if (EpdIsNan(epd1) || IsNanDouble(value)) {
542  EpdMakeNan(epd1);
543  return;
544  } else if (EpdIsInf(epd1) || IsInfDouble(value)) {
545  int sign;
546 
547  EpdConvert(value, &epd2);
548  if (EpdIsInf(epd1) && IsInfDouble(value)) {
549  sign = epd1->type.bits.sign ^ epd2.type.bits.sign;
550  if (sign == 1)
551  EpdMakeNan(epd1);
552  } else if (EpdIsInf(&epd2)) {
553  EpdCopy(&epd2, epd1);
554  }
555  return;
556  }
557 
558  assert(epd1->type.bits.exponent == EPD_MAX_BIN);
559 
560  EpdConvert(value, &epd2);
561  if (epd1->exponent > epd2.exponent) {
562  diff = epd1->exponent - epd2.exponent;
563  if (diff <= EPD_MAX_BIN)
564  tmp = epd1->type.value + epd2.type.value / pow((double)2.0, (double)diff);
565  else
566  tmp = epd1->type.value;
567  exponent = epd1->exponent;
568  } else if (epd1->exponent < epd2.exponent) {
569  diff = epd2.exponent - epd1->exponent;
570  if (diff <= EPD_MAX_BIN)
571  tmp = epd1->type.value / pow((double)2.0, (double)diff) + epd2.type.value;
572  else
573  tmp = epd2.type.value;
574  exponent = epd2.exponent;
575  } else {
576  tmp = epd1->type.value + epd2.type.value;
577  exponent = epd1->exponent;
578  }
579  epd1->type.value = tmp;
580  epd1->exponent = exponent;
581  EpdNormalize(epd1);
582 }
int IsNanDouble(double value)
Definition: epd.c:1304
double value
Definition: epd.h:132
void EpdConvert(double value, EpDouble *epd)
Definition: epd.c:184
unsigned int sign
Definition: epd.h:91
void EpdCopy(EpDouble *from, EpDouble *to)
Definition: epd.c:1181
#define assert(ex)
Definition: util.h:141
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalize(EpDouble *epd)
Definition: epd.c:976
int IsInfDouble(double value)
Definition: epd.c:1275
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
unsigned int exponent
Definition: epd.h:90
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdAdd2()

void EpdAdd2 ( EpDouble epd1,
EpDouble epd2 
)

Function********************************************************************

Synopsis [Adds two arbitrary precision double values.]

Description [Adds two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 597 of file epd.c.

598 {
599  double value;
600  int exponent, diff;
601 
602  if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
603  EpdMakeNan(epd1);
604  return;
605  } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
606  int sign;
607 
608  if (EpdIsInf(epd1) && EpdIsInf(epd2)) {
609  sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
610  if (sign == 1)
611  EpdMakeNan(epd1);
612  } else if (EpdIsInf(epd2)) {
613  EpdCopy(epd2, epd1);
614  }
615  return;
616  }
617 
618  assert(epd1->type.bits.exponent == EPD_MAX_BIN);
619  assert(epd2->type.bits.exponent == EPD_MAX_BIN);
620 
621  if (epd1->exponent > epd2->exponent) {
622  diff = epd1->exponent - epd2->exponent;
623  if (diff <= EPD_MAX_BIN) {
624  value = epd1->type.value +
625  epd2->type.value / pow((double)2.0, (double)diff);
626  } else
627  value = epd1->type.value;
628  exponent = epd1->exponent;
629  } else if (epd1->exponent < epd2->exponent) {
630  diff = epd2->exponent - epd1->exponent;
631  if (diff <= EPD_MAX_BIN) {
632  value = epd1->type.value / pow((double)2.0, (double)diff) +
633  epd2->type.value;
634  } else
635  value = epd2->type.value;
636  exponent = epd2->exponent;
637  } else {
638  value = epd1->type.value + epd2->type.value;
639  exponent = epd1->exponent;
640  }
641  epd1->type.value = value;
642  epd1->exponent = exponent;
643  EpdNormalize(epd1);
644 }
double value
Definition: epd.h:132
unsigned int sign
Definition: epd.h:91
void EpdCopy(EpDouble *from, EpDouble *to)
Definition: epd.c:1181
#define assert(ex)
Definition: util.h:141
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalize(EpDouble *epd)
Definition: epd.c:976
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
unsigned int exponent
Definition: epd.h:90
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdAdd3()

void EpdAdd3 ( EpDouble epd1,
EpDouble epd2,
EpDouble epd3 
)

Function********************************************************************

Synopsis [Adds two arbitrary precision double values.]

Description [Adds two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 659 of file epd.c.

660 {
661  double value;
662  int exponent, diff;
663 
664  if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
665  EpdMakeNan(epd3);
666  return;
667  } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
668  int sign;
669 
670  if (EpdIsInf(epd1) && EpdIsInf(epd2)) {
671  sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
672  if (sign == 1)
673  EpdMakeNan(epd3);
674  else
675  EpdCopy(epd1, epd3);
676  } else if (EpdIsInf(epd1)) {
677  EpdCopy(epd1, epd3);
678  } else {
679  EpdCopy(epd2, epd3);
680  }
681  return;
682  }
683 
684  assert(epd1->type.bits.exponent == EPD_MAX_BIN);
685  assert(epd2->type.bits.exponent == EPD_MAX_BIN);
686 
687  if (epd1->exponent > epd2->exponent) {
688  diff = epd1->exponent - epd2->exponent;
689  if (diff <= EPD_MAX_BIN) {
690  value = epd1->type.value +
691  epd2->type.value / pow((double)2.0, (double)diff);
692  } else
693  value = epd1->type.value;
694  exponent = epd1->exponent;
695  } else if (epd1->exponent < epd2->exponent) {
696  diff = epd2->exponent - epd1->exponent;
697  if (diff <= EPD_MAX_BIN) {
698  value = epd1->type.value / pow((double)2.0, (double)diff) +
699  epd2->type.value;
700  } else
701  value = epd2->type.value;
702  exponent = epd2->exponent;
703  } else {
704  value = epd1->type.value + epd2->type.value;
705  exponent = epd1->exponent;
706  }
707  epd3->type.value = value;
708  epd3->exponent = exponent;
709  EpdNormalize(epd3);
710 }
double value
Definition: epd.h:132
unsigned int sign
Definition: epd.h:91
void EpdCopy(EpDouble *from, EpDouble *to)
Definition: epd.c:1181
#define assert(ex)
Definition: util.h:141
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalize(EpDouble *epd)
Definition: epd.c:976
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
unsigned int exponent
Definition: epd.h:90
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdAlloc()

EpDouble* EpdAlloc ( void  )

AutomaticStart

CFile***********************************************************************

FileName [epd.c]

PackageName [epd]

Synopsis [Arithmetic functions with extended double precision.]

Description []

SeeAlso []

Author [In-Ho Moon]

Copyright [Copyright (c) 1995-2004, Regents of the University of Colorado

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

Neither the name of the University of Colorado nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.]

Revision [

Id
epd.c,v 1.10 2004/08/13 18:20:30 fabio Exp

] Function********************************************************************

Synopsis [Allocates an EpDouble struct.]

Description [Allocates an EpDouble struct.]

SideEffects []

SeeAlso []

Definition at line 71 of file epd.c.

72 {
73  EpDouble *epd;
74 
75  epd = ALLOC(EpDouble, 1);
76  return(epd);
77 }
#define ALLOC(type, num)
Definition: util.h:76

◆ EpdCmp()

int EpdCmp ( const char *  key1,
const char *  key2 
)

Function********************************************************************

Synopsis [Compares two EpDouble struct.]

Description [Compares two EpDouble struct.]

SideEffects []

SeeAlso []

Definition at line 92 of file epd.c.

93 {
94  EpDouble *epd1 = (EpDouble *) key1;
95  EpDouble *epd2 = (EpDouble *) key2;
96  if (epd1->type.value != epd2->type.value ||
97  epd1->exponent != epd2->exponent) {
98  return(1);
99  }
100  return(0);
101 }
double value
Definition: epd.h:132
union EpTypeUnion type
Definition: epd.h:138
int exponent
Definition: epd.h:139

◆ EpdConvert()

void EpdConvert ( double  value,
EpDouble epd 
)

Function********************************************************************

Synopsis [Converts double to EpDouble struct.]

Description [Converts double to EpDouble struct.]

SideEffects []

SeeAlso []

Definition at line 184 of file epd.c.

185 {
186  epd->type.value = value;
187  epd->exponent = 0;
188  EpdNormalize(epd);
189 }
double value
Definition: epd.h:132
void EpdNormalize(EpDouble *epd)
Definition: epd.c:976
union EpTypeUnion type
Definition: epd.h:138
int exponent
Definition: epd.h:139

◆ EpdCopy()

void EpdCopy ( EpDouble from,
EpDouble to 
)

Function********************************************************************

Synopsis [Copies a EpDouble struct.]

Description [Copies a EpDouble struct.]

SideEffects []

SeeAlso []

Definition at line 1181 of file epd.c.

1182 {
1183  to->type.value = from->type.value;
1184  to->exponent = from->exponent;
1185 }
double value
Definition: epd.h:132
union EpTypeUnion type
Definition: epd.h:138
int exponent
Definition: epd.h:139

◆ EpdDivide()

void EpdDivide ( EpDouble epd1,
double  value 
)

Function********************************************************************

Synopsis [Divides two arbitrary precision double values.]

Description [Divides two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 385 of file epd.c.

386 {
387  EpDouble epd2;
388  double tmp;
389  int exponent;
390 
391  if (EpdIsNan(epd1) || IsNanDouble(value)) {
392  EpdMakeNan(epd1);
393  return;
394  } else if (EpdIsInf(epd1) || IsInfDouble(value)) {
395  int sign;
396 
397  EpdConvert(value, &epd2);
398  if (EpdIsInf(epd1) && IsInfDouble(value)) {
399  EpdMakeNan(epd1);
400  } else if (EpdIsInf(epd1)) {
401  sign = epd1->type.bits.sign ^ epd2.type.bits.sign;
402  EpdMakeInf(epd1, sign);
403  } else {
404  sign = epd1->type.bits.sign ^ epd2.type.bits.sign;
405  EpdMakeZero(epd1, sign);
406  }
407  return;
408  }
409 
410  if (value == 0.0) {
411  EpdMakeNan(epd1);
412  return;
413  }
414 
415  assert(epd1->type.bits.exponent == EPD_MAX_BIN);
416 
417  EpdConvert(value, &epd2);
418  tmp = epd1->type.value / epd2.type.value;
419  exponent = epd1->exponent - epd2.exponent;
420  epd1->type.value = tmp;
421  epd1->exponent = exponent;
422  EpdNormalize(epd1);
423 }
int IsNanDouble(double value)
Definition: epd.c:1304
double value
Definition: epd.h:132
void EpdConvert(double value, EpDouble *epd)
Definition: epd.c:184
unsigned int sign
Definition: epd.h:91
#define assert(ex)
Definition: util.h:141
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalize(EpDouble *epd)
Definition: epd.c:976
int IsInfDouble(double value)
Definition: epd.c:1275
union EpTypeUnion type
Definition: epd.h:138
void EpdMakeZero(EpDouble *epd, int sign)
Definition: epd.c:1136
struct IeeeDoubleStruct bits
Definition: epd.h:133
void EpdMakeInf(EpDouble *epd, int sign)
Definition: epd.c:1114
unsigned int exponent
Definition: epd.h:90
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdDivide2()

void EpdDivide2 ( EpDouble epd1,
EpDouble epd2 
)

Function********************************************************************

Synopsis [Divides two arbitrary precision double values.]

Description [Divides two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 438 of file epd.c.

439 {
440  double value;
441  int exponent;
442 
443  if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
444  EpdMakeNan(epd1);
445  return;
446  } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
447  int sign;
448 
449  if (EpdIsInf(epd1) && EpdIsInf(epd2)) {
450  EpdMakeNan(epd1);
451  } else if (EpdIsInf(epd1)) {
452  sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
453  EpdMakeInf(epd1, sign);
454  } else {
455  sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
456  EpdMakeZero(epd1, sign);
457  }
458  return;
459  }
460 
461  if (epd2->type.value == 0.0) {
462  EpdMakeNan(epd1);
463  return;
464  }
465 
466  assert(epd1->type.bits.exponent == EPD_MAX_BIN);
467  assert(epd2->type.bits.exponent == EPD_MAX_BIN);
468 
469  value = epd1->type.value / epd2->type.value;
470  exponent = epd1->exponent - epd2->exponent;
471  epd1->type.value = value;
472  epd1->exponent = exponent;
473  EpdNormalize(epd1);
474 }
double value
Definition: epd.h:132
unsigned int sign
Definition: epd.h:91
#define assert(ex)
Definition: util.h:141
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalize(EpDouble *epd)
Definition: epd.c:976
union EpTypeUnion type
Definition: epd.h:138
void EpdMakeZero(EpDouble *epd, int sign)
Definition: epd.c:1136
struct IeeeDoubleStruct bits
Definition: epd.h:133
void EpdMakeInf(EpDouble *epd, int sign)
Definition: epd.c:1114
unsigned int exponent
Definition: epd.h:90
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdDivide3()

void EpdDivide3 ( EpDouble epd1,
EpDouble epd2,
EpDouble epd3 
)

Function********************************************************************

Synopsis [Divides two arbitrary precision double values.]

Description [Divides two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 489 of file epd.c.

490 {
491  if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
492  EpdMakeNan(epd3);
493  return;
494  } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
495  int sign;
496 
497  if (EpdIsInf(epd1) && EpdIsInf(epd2)) {
498  EpdMakeNan(epd3);
499  } else if (EpdIsInf(epd1)) {
500  sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
501  EpdMakeInf(epd3, sign);
502  } else {
503  sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
504  EpdMakeZero(epd3, sign);
505  }
506  return;
507  }
508 
509  if (epd2->type.value == 0.0) {
510  EpdMakeNan(epd3);
511  return;
512  }
513 
514  assert(epd1->type.bits.exponent == EPD_MAX_BIN);
515  assert(epd2->type.bits.exponent == EPD_MAX_BIN);
516 
517  epd3->type.value = epd1->type.value / epd2->type.value;
518  epd3->exponent = epd1->exponent - epd2->exponent;
519  EpdNormalize(epd3);
520 }
double value
Definition: epd.h:132
unsigned int sign
Definition: epd.h:91
#define assert(ex)
Definition: util.h:141
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalize(EpDouble *epd)
Definition: epd.c:976
union EpTypeUnion type
Definition: epd.h:138
void EpdMakeZero(EpDouble *epd, int sign)
Definition: epd.c:1136
struct IeeeDoubleStruct bits
Definition: epd.h:133
void EpdMakeInf(EpDouble *epd, int sign)
Definition: epd.c:1114
unsigned int exponent
Definition: epd.h:90
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdFree()

void EpdFree ( EpDouble epd)

Function********************************************************************

Synopsis [Frees an EpDouble struct.]

Description [Frees an EpDouble struct.]

SideEffects []

SeeAlso []

Definition at line 116 of file epd.c.

117 {
118  FREE(epd);
119 }
#define FREE(obj)
Definition: util.h:80

◆ EpdGetExponent()

int EpdGetExponent ( double  value)

Function********************************************************************

Synopsis [Returns the exponent value of a double.]

Description [Returns the exponent value of a double.]

SideEffects []

SeeAlso []

Definition at line 1067 of file epd.c.

1068 {
1069  int exponent;
1070  EpDouble epd;
1071 
1072  epd.type.value = value;
1073  exponent = epd.type.bits.exponent;
1074  return(exponent);
1075 }
double value
Definition: epd.h:132
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
unsigned int exponent
Definition: epd.h:90

◆ EpdGetExponentDecimal()

int EpdGetExponentDecimal ( double  value)

Function********************************************************************

Synopsis [Returns the decimal exponent value of a double.]

Description [Returns the decimal exponent value of a double.]

SideEffects []

SeeAlso []

Definition at line 1090 of file epd.c.

1091 {
1092  char *pos, str[24];
1093  int exponent;
1094 
1095  sprintf(str, "%E", value);
1096  pos = strstr(str, "E");
1097  sscanf(pos, "E%d", &exponent);
1098  return(exponent);
1099 }
char * strstr()

◆ EpdGetString()

void EpdGetString ( EpDouble epd,
char *  str 
)

Function********************************************************************

Synopsis [Converts an arbitrary precision double value to a string.]

Description [Converts an arbitrary precision double value to a string.]

SideEffects []

SeeAlso []

Definition at line 134 of file epd.c.

135 {
136  double value;
137  int exponent;
138  char *pos;
139 
140  if (IsNanDouble(epd->type.value)) {
141  sprintf(str, "NaN");
142  return;
143  } else if (IsInfDouble(epd->type.value)) {
144  if (epd->type.bits.sign == 1)
145  sprintf(str, "-Inf");
146  else
147  sprintf(str, "Inf");
148  return;
149  }
150 
151  assert(epd->type.bits.exponent == EPD_MAX_BIN ||
152  epd->type.bits.exponent == 0);
153 
154  EpdGetValueAndDecimalExponent(epd, &value, &exponent);
155  sprintf(str, "%e", value);
156  pos = strstr(str, "e");
157  if (exponent >= 0) {
158  if (exponent < 10)
159  sprintf(pos + 1, "+0%d", exponent);
160  else
161  sprintf(pos + 1, "+%d", exponent);
162  } else {
163  exponent *= -1;
164  if (exponent < 10)
165  sprintf(pos + 1, "-0%d", exponent);
166  else
167  sprintf(pos + 1, "-%d", exponent);
168  }
169 }
int IsNanDouble(double value)
Definition: epd.c:1304
double value
Definition: epd.h:132
unsigned int sign
Definition: epd.h:91
void EpdGetValueAndDecimalExponent(EpDouble *epd, double *value, int *exponent)
Definition: epd.c:1033
#define assert(ex)
Definition: util.h:141
int IsInfDouble(double value)
Definition: epd.c:1275
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
unsigned int exponent
Definition: epd.h:90
char * strstr()
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdGetValueAndDecimalExponent()

void EpdGetValueAndDecimalExponent ( EpDouble epd,
double *  value,
int *  exponent 
)

Function********************************************************************

Synopsis [Returns value and decimal exponent of EpDouble.]

Description [Returns value and decimal exponent of EpDouble.]

SideEffects []

SeeAlso []

Definition at line 1033 of file epd.c.

1034 {
1035  EpDouble epd1, epd2;
1036 
1037  if (EpdIsNanOrInf(epd))
1038  return;
1039 
1040  if (EpdIsZero(epd)) {
1041  *value = 0.0;
1042  *exponent = 0;
1043  return;
1044  }
1045 
1046  epd1.type.value = epd->type.value;
1047  epd1.exponent = 0;
1048  EpdPow2Decimal(epd->exponent, &epd2);
1049  EpdMultiply2Decimal(&epd1, &epd2);
1050 
1051  *value = epd1.type.value;
1052  *exponent = epd1.exponent;
1053 }
double value
Definition: epd.h:132
union EpTypeUnion type
Definition: epd.h:138
void EpdPow2Decimal(int n, EpDouble *epd)
Definition: epd.c:945
int EpdIsZero(EpDouble *epd)
Definition: epd.c:1218
void EpdMultiply2Decimal(EpDouble *epd1, EpDouble *epd2)
Definition: epd.c:284
int exponent
Definition: epd.h:139
int EpdIsNanOrInf(EpDouble *epd)
Definition: epd.c:1257

◆ EpdIsInf()

int EpdIsInf ( EpDouble epd)

Function********************************************************************

Synopsis [Checks whether the value is Inf.]

Description [Checks whether the value is Inf.]

SideEffects []

SeeAlso []

Definition at line 1200 of file epd.c.

1201 {
1202  return(IsInfDouble(epd->type.value));
1203 }
double value
Definition: epd.h:132
int IsInfDouble(double value)
Definition: epd.c:1275
union EpTypeUnion type
Definition: epd.h:138

◆ EpdIsNan()

int EpdIsNan ( EpDouble epd)

Function********************************************************************

Synopsis [Checks whether the value is NaN.]

Description [Checks whether the value is NaN.]

SideEffects []

SeeAlso []

Definition at line 1239 of file epd.c.

1240 {
1241  return(IsNanDouble(epd->type.value));
1242 }
int IsNanDouble(double value)
Definition: epd.c:1304
double value
Definition: epd.h:132
union EpTypeUnion type
Definition: epd.h:138

◆ EpdIsNanOrInf()

int EpdIsNanOrInf ( EpDouble epd)

Function********************************************************************

Synopsis [Checks whether the value is NaN or Inf.]

Description [Checks whether the value is NaN or Inf.]

SideEffects []

SeeAlso []

Definition at line 1257 of file epd.c.

1258 {
1259  return(IsNanOrInfDouble(epd->type.value));
1260 }
double value
Definition: epd.h:132
union EpTypeUnion type
Definition: epd.h:138
int IsNanOrInfDouble(double value)
Definition: epd.c:1332

◆ EpdIsZero()

int EpdIsZero ( EpDouble epd)

Function********************************************************************

Synopsis [Checks whether the value is Zero.]

Description [Checks whether the value is Zero.]

SideEffects []

SeeAlso []

Definition at line 1218 of file epd.c.

1219 {
1220  if (epd->type.value == 0.0)
1221  return(1);
1222  else
1223  return(0);
1224 }
double value
Definition: epd.h:132
union EpTypeUnion type
Definition: epd.h:138

◆ EpdMakeInf()

void EpdMakeInf ( EpDouble epd,
int  sign 
)

Function********************************************************************

Synopsis [Makes EpDouble Inf.]

Description [Makes EpDouble Inf.]

SideEffects []

SeeAlso []

Definition at line 1114 of file epd.c.

1115 {
1116  epd->type.bits.mantissa1 = 0;
1117  epd->type.bits.mantissa0 = 0;
1118  epd->type.bits.exponent = EPD_EXP_INF;
1119  epd->type.bits.sign = sign;
1120  epd->exponent = 0;
1121 }
unsigned int sign
Definition: epd.h:91
unsigned int mantissa1
Definition: epd.h:88
unsigned int mantissa0
Definition: epd.h:89
#define EPD_EXP_INF
Definition: epd.h:64
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
unsigned int exponent
Definition: epd.h:90
int exponent
Definition: epd.h:139

◆ EpdMakeNan()

void EpdMakeNan ( EpDouble epd)

Function********************************************************************

Synopsis [Makes EpDouble NaN.]

Description [Makes EpDouble NaN.]

SideEffects []

SeeAlso []

Definition at line 1158 of file epd.c.

1159 {
1160  epd->type.nan.mantissa1 = 0;
1161  epd->type.nan.mantissa0 = 0;
1162  epd->type.nan.quiet_bit = 1;
1163  epd->type.nan.exponent = EPD_EXP_INF;
1164  epd->type.nan.sign = 1;
1165  epd->exponent = 0;
1166 }
struct IeeeNanStruct nan
Definition: epd.h:134
#define EPD_EXP_INF
Definition: epd.h:64
unsigned int exponent
Definition: epd.h:117
union EpTypeUnion type
Definition: epd.h:138
unsigned int sign
Definition: epd.h:118
unsigned int mantissa0
Definition: epd.h:115
unsigned int quiet_bit
Definition: epd.h:116
unsigned int mantissa1
Definition: epd.h:114
int exponent
Definition: epd.h:139

◆ EpdMakeZero()

void EpdMakeZero ( EpDouble epd,
int  sign 
)

Function********************************************************************

Synopsis [Makes EpDouble Zero.]

Description [Makes EpDouble Zero.]

SideEffects []

SeeAlso []

Definition at line 1136 of file epd.c.

1137 {
1138  epd->type.bits.mantissa1 = 0;
1139  epd->type.bits.mantissa0 = 0;
1140  epd->type.bits.exponent = 0;
1141  epd->type.bits.sign = sign;
1142  epd->exponent = 0;
1143 }
unsigned int sign
Definition: epd.h:91
unsigned int mantissa1
Definition: epd.h:88
unsigned int mantissa0
Definition: epd.h:89
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
unsigned int exponent
Definition: epd.h:90
int exponent
Definition: epd.h:139

◆ EpdMultiply()

void EpdMultiply ( EpDouble epd1,
double  value 
)

Function********************************************************************

Synopsis [Multiplies two arbitrary precision double values.]

Description [Multiplies two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 204 of file epd.c.

205 {
206  EpDouble epd2;
207  double tmp;
208  int exponent;
209 
210  if (EpdIsNan(epd1) || IsNanDouble(value)) {
211  EpdMakeNan(epd1);
212  return;
213  } else if (EpdIsInf(epd1) || IsInfDouble(value)) {
214  int sign;
215 
216  EpdConvert(value, &epd2);
217  sign = epd1->type.bits.sign ^ epd2.type.bits.sign;
218  EpdMakeInf(epd1, sign);
219  return;
220  }
221 
222  assert(epd1->type.bits.exponent == EPD_MAX_BIN);
223 
224  EpdConvert(value, &epd2);
225  tmp = epd1->type.value * epd2.type.value;
226  exponent = epd1->exponent + epd2.exponent;
227  epd1->type.value = tmp;
228  epd1->exponent = exponent;
229  EpdNormalize(epd1);
230 }
int IsNanDouble(double value)
Definition: epd.c:1304
double value
Definition: epd.h:132
void EpdConvert(double value, EpDouble *epd)
Definition: epd.c:184
unsigned int sign
Definition: epd.h:91
#define assert(ex)
Definition: util.h:141
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalize(EpDouble *epd)
Definition: epd.c:976
int IsInfDouble(double value)
Definition: epd.c:1275
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
void EpdMakeInf(EpDouble *epd, int sign)
Definition: epd.c:1114
unsigned int exponent
Definition: epd.h:90
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdMultiply2()

void EpdMultiply2 ( EpDouble epd1,
EpDouble epd2 
)

Function********************************************************************

Synopsis [Multiplies two arbitrary precision double values.]

Description [Multiplies two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 245 of file epd.c.

246 {
247  double value;
248  int exponent;
249 
250  if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
251  EpdMakeNan(epd1);
252  return;
253  } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
254  int sign;
255 
256  sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
257  EpdMakeInf(epd1, sign);
258  return;
259  }
260 
261  assert(epd1->type.bits.exponent == EPD_MAX_BIN);
262  assert(epd2->type.bits.exponent == EPD_MAX_BIN);
263 
264  value = epd1->type.value * epd2->type.value;
265  exponent = epd1->exponent + epd2->exponent;
266  epd1->type.value = value;
267  epd1->exponent = exponent;
268  EpdNormalize(epd1);
269 }
double value
Definition: epd.h:132
unsigned int sign
Definition: epd.h:91
#define assert(ex)
Definition: util.h:141
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalize(EpDouble *epd)
Definition: epd.c:976
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
void EpdMakeInf(EpDouble *epd, int sign)
Definition: epd.c:1114
unsigned int exponent
Definition: epd.h:90
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdMultiply2Decimal()

void EpdMultiply2Decimal ( EpDouble epd1,
EpDouble epd2 
)

Function********************************************************************

Synopsis [Multiplies two arbitrary precision double values.]

Description [Multiplies two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 284 of file epd.c.

285 {
286  double value;
287  int exponent;
288 
289  if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
290  EpdMakeNan(epd1);
291  return;
292  } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
293  int sign;
294 
295  sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
296  EpdMakeInf(epd1, sign);
297  return;
298  }
299 
300  value = epd1->type.value * epd2->type.value;
301  exponent = epd1->exponent + epd2->exponent;
302  epd1->type.value = value;
303  epd1->exponent = exponent;
304  EpdNormalizeDecimal(epd1);
305 }
double value
Definition: epd.h:132
unsigned int sign
Definition: epd.h:91
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalizeDecimal(EpDouble *epd)
Definition: epd.c:1006
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
void EpdMakeInf(EpDouble *epd, int sign)
Definition: epd.c:1114
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200

◆ EpdMultiply3()

void EpdMultiply3 ( EpDouble epd1,
EpDouble epd2,
EpDouble epd3 
)

Function********************************************************************

Synopsis [Multiplies two arbitrary precision double values.]

Description [Multiplies two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 320 of file epd.c.

321 {
322  if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
323  EpdMakeNan(epd1);
324  return;
325  } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
326  int sign;
327 
328  sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
329  EpdMakeInf(epd3, sign);
330  return;
331  }
332 
333  assert(epd1->type.bits.exponent == EPD_MAX_BIN);
334  assert(epd2->type.bits.exponent == EPD_MAX_BIN);
335 
336  epd3->type.value = epd1->type.value * epd2->type.value;
337  epd3->exponent = epd1->exponent + epd2->exponent;
338  EpdNormalize(epd3);
339 }
double value
Definition: epd.h:132
unsigned int sign
Definition: epd.h:91
#define assert(ex)
Definition: util.h:141
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalize(EpDouble *epd)
Definition: epd.c:976
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
void EpdMakeInf(EpDouble *epd, int sign)
Definition: epd.c:1114
unsigned int exponent
Definition: epd.h:90
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdMultiply3Decimal()

void EpdMultiply3Decimal ( EpDouble epd1,
EpDouble epd2,
EpDouble epd3 
)

Function********************************************************************

Synopsis [Multiplies two arbitrary precision double values.]

Description [Multiplies two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 354 of file epd.c.

355 {
356  if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
357  EpdMakeNan(epd1);
358  return;
359  } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
360  int sign;
361 
362  sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
363  EpdMakeInf(epd3, sign);
364  return;
365  }
366 
367  epd3->type.value = epd1->type.value * epd2->type.value;
368  epd3->exponent = epd1->exponent + epd2->exponent;
369  EpdNormalizeDecimal(epd3);
370 }
double value
Definition: epd.h:132
unsigned int sign
Definition: epd.h:91
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalizeDecimal(EpDouble *epd)
Definition: epd.c:1006
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
void EpdMakeInf(EpDouble *epd, int sign)
Definition: epd.c:1114
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200

◆ EpdNormalize()

void EpdNormalize ( EpDouble epd)

Function********************************************************************

Synopsis [Normalize an arbitrary precision double value.]

Description [Normalize an arbitrary precision double value.]

SideEffects []

SeeAlso []

Definition at line 976 of file epd.c.

977 {
978  int exponent;
979 
980  if (IsNanOrInfDouble(epd->type.value)) {
981  epd->exponent = 0;
982  return;
983  }
984 
985  exponent = EpdGetExponent(epd->type.value);
986  if (exponent == EPD_MAX_BIN)
987  return;
988  exponent -= EPD_MAX_BIN;
989  epd->type.bits.exponent = EPD_MAX_BIN;
990  epd->exponent += exponent;
991 }
double value
Definition: epd.h:132
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
unsigned int exponent
Definition: epd.h:90
int IsNanOrInfDouble(double value)
Definition: epd.c:1332
int exponent
Definition: epd.h:139
#define EPD_MAX_BIN
Definition: epd.h:62
int EpdGetExponent(double value)
Definition: epd.c:1067

◆ EpdNormalizeDecimal()

void EpdNormalizeDecimal ( EpDouble epd)

Function********************************************************************

Synopsis [Normalize an arbitrary precision double value.]

Description [Normalize an arbitrary precision double value.]

SideEffects []

SeeAlso []

Definition at line 1006 of file epd.c.

1007 {
1008  int exponent;
1009 
1010  if (IsNanOrInfDouble(epd->type.value)) {
1011  epd->exponent = 0;
1012  return;
1013  }
1014 
1015  exponent = EpdGetExponentDecimal(epd->type.value);
1016  epd->type.value /= pow((double)10.0, (double)exponent);
1017  epd->exponent += exponent;
1018 }
double value
Definition: epd.h:132
int EpdGetExponentDecimal(double value)
Definition: epd.c:1090
union EpTypeUnion type
Definition: epd.h:138
int IsNanOrInfDouble(double value)
Definition: epd.c:1332
int exponent
Definition: epd.h:139

◆ EpdPow2()

void EpdPow2 ( int  n,
EpDouble epd 
)

Function********************************************************************

Synopsis [Computes arbitrary precision pow of base 2.]

Description [Computes arbitrary precision pow of base 2.]

SideEffects []

SeeAlso []

Definition at line 916 of file epd.c.

917 {
918  if (n <= EPD_MAX_BIN) {
919  EpdConvert(pow((double)2.0, (double)n), epd);
920  } else {
921  EpDouble epd1, epd2;
922  int n1, n2;
923 
924  n1 = n / 2;
925  n2 = n - n1;
926  EpdPow2(n1, &epd1);
927  EpdPow2(n2, &epd2);
928  EpdMultiply3(&epd1, &epd2, epd);
929  }
930 }
void EpdConvert(double value, EpDouble *epd)
Definition: epd.c:184
void EpdPow2(int n, EpDouble *epd)
Definition: epd.c:916
void EpdMultiply3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
Definition: epd.c:320
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdPow2Decimal()

void EpdPow2Decimal ( int  n,
EpDouble epd 
)

Function********************************************************************

Synopsis [Computes arbitrary precision pow of base 2.]

Description [Computes arbitrary precision pow of base 2.]

SideEffects []

SeeAlso []

Definition at line 945 of file epd.c.

946 {
947  if (n <= EPD_MAX_BIN) {
948  epd->type.value = pow((double)2.0, (double)n);
949  epd->exponent = 0;
950  EpdNormalizeDecimal(epd);
951  } else {
952  EpDouble epd1, epd2;
953  int n1, n2;
954 
955  n1 = n / 2;
956  n2 = n - n1;
957  EpdPow2Decimal(n1, &epd1);
958  EpdPow2Decimal(n2, &epd2);
959  EpdMultiply3Decimal(&epd1, &epd2, epd);
960  }
961 }
double value
Definition: epd.h:132
void EpdNormalizeDecimal(EpDouble *epd)
Definition: epd.c:1006
union EpTypeUnion type
Definition: epd.h:138
void EpdPow2Decimal(int n, EpDouble *epd)
Definition: epd.c:945
void EpdMultiply3Decimal(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
Definition: epd.c:354
int exponent
Definition: epd.h:139
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdSubtract()

void EpdSubtract ( EpDouble epd1,
double  value 
)

Function********************************************************************

Synopsis [Subtracts two arbitrary precision double values.]

Description [Subtracts two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 725 of file epd.c.

726 {
727  EpDouble epd2;
728  double tmp;
729  int exponent, diff;
730 
731  if (EpdIsNan(epd1) || IsNanDouble(value)) {
732  EpdMakeNan(epd1);
733  return;
734  } else if (EpdIsInf(epd1) || IsInfDouble(value)) {
735  int sign;
736 
737  EpdConvert(value, &epd2);
738  if (EpdIsInf(epd1) && IsInfDouble(value)) {
739  sign = epd1->type.bits.sign ^ epd2.type.bits.sign;
740  if (sign == 0)
741  EpdMakeNan(epd1);
742  } else if (EpdIsInf(&epd2)) {
743  EpdCopy(&epd2, epd1);
744  }
745  return;
746  }
747 
748  assert(epd1->type.bits.exponent == EPD_MAX_BIN);
749 
750  EpdConvert(value, &epd2);
751  if (epd1->exponent > epd2.exponent) {
752  diff = epd1->exponent - epd2.exponent;
753  if (diff <= EPD_MAX_BIN)
754  tmp = epd1->type.value - epd2.type.value / pow((double)2.0, (double)diff);
755  else
756  tmp = epd1->type.value;
757  exponent = epd1->exponent;
758  } else if (epd1->exponent < epd2.exponent) {
759  diff = epd2.exponent - epd1->exponent;
760  if (diff <= EPD_MAX_BIN)
761  tmp = epd1->type.value / pow((double)2.0, (double)diff) - epd2.type.value;
762  else
763  tmp = epd2.type.value * (double)(-1.0);
764  exponent = epd2.exponent;
765  } else {
766  tmp = epd1->type.value - epd2.type.value;
767  exponent = epd1->exponent;
768  }
769  epd1->type.value = tmp;
770  epd1->exponent = exponent;
771  EpdNormalize(epd1);
772 }
int IsNanDouble(double value)
Definition: epd.c:1304
double value
Definition: epd.h:132
void EpdConvert(double value, EpDouble *epd)
Definition: epd.c:184
unsigned int sign
Definition: epd.h:91
void EpdCopy(EpDouble *from, EpDouble *to)
Definition: epd.c:1181
#define assert(ex)
Definition: util.h:141
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalize(EpDouble *epd)
Definition: epd.c:976
int IsInfDouble(double value)
Definition: epd.c:1275
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
unsigned int exponent
Definition: epd.h:90
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdSubtract2()

void EpdSubtract2 ( EpDouble epd1,
EpDouble epd2 
)

Function********************************************************************

Synopsis [Subtracts two arbitrary precision double values.]

Description [Subtracts two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 787 of file epd.c.

788 {
789  double value;
790  int exponent, diff;
791 
792  if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
793  EpdMakeNan(epd1);
794  return;
795  } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
796  int sign;
797 
798  if (EpdIsInf(epd1) && EpdIsInf(epd2)) {
799  sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
800  if (sign == 0)
801  EpdMakeNan(epd1);
802  } else if (EpdIsInf(epd2)) {
803  EpdCopy(epd2, epd1);
804  }
805  return;
806  }
807 
808  assert(epd1->type.bits.exponent == EPD_MAX_BIN);
809  assert(epd2->type.bits.exponent == EPD_MAX_BIN);
810 
811  if (epd1->exponent > epd2->exponent) {
812  diff = epd1->exponent - epd2->exponent;
813  if (diff <= EPD_MAX_BIN) {
814  value = epd1->type.value -
815  epd2->type.value / pow((double)2.0, (double)diff);
816  } else
817  value = epd1->type.value;
818  exponent = epd1->exponent;
819  } else if (epd1->exponent < epd2->exponent) {
820  diff = epd2->exponent - epd1->exponent;
821  if (diff <= EPD_MAX_BIN) {
822  value = epd1->type.value / pow((double)2.0, (double)diff) -
823  epd2->type.value;
824  } else
825  value = epd2->type.value * (double)(-1.0);
826  exponent = epd2->exponent;
827  } else {
828  value = epd1->type.value - epd2->type.value;
829  exponent = epd1->exponent;
830  }
831  epd1->type.value = value;
832  epd1->exponent = exponent;
833  EpdNormalize(epd1);
834 }
double value
Definition: epd.h:132
unsigned int sign
Definition: epd.h:91
void EpdCopy(EpDouble *from, EpDouble *to)
Definition: epd.c:1181
#define assert(ex)
Definition: util.h:141
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalize(EpDouble *epd)
Definition: epd.c:976
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
unsigned int exponent
Definition: epd.h:90
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200
#define EPD_MAX_BIN
Definition: epd.h:62

◆ EpdSubtract3()

void EpdSubtract3 ( EpDouble epd1,
EpDouble epd2,
EpDouble epd3 
)

Function********************************************************************

Synopsis [Subtracts two arbitrary precision double values.]

Description [Subtracts two arbitrary precision double values.]

SideEffects []

SeeAlso []

Definition at line 849 of file epd.c.

850 {
851  double value;
852  int exponent, diff;
853 
854  if (EpdIsNan(epd1) || EpdIsNan(epd2)) {
855  EpdMakeNan(epd3);
856  return;
857  } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) {
858  int sign;
859 
860  if (EpdIsInf(epd1) && EpdIsInf(epd2)) {
861  sign = epd1->type.bits.sign ^ epd2->type.bits.sign;
862  if (sign == 0)
863  EpdCopy(epd1, epd3);
864  else
865  EpdMakeNan(epd3);
866  } else if (EpdIsInf(epd1)) {
867  EpdCopy(epd1, epd1);
868  } else {
869  sign = epd2->type.bits.sign ^ 0x1;
870  EpdMakeInf(epd3, sign);
871  }
872  return;
873  }
874 
875  assert(epd1->type.bits.exponent == EPD_MAX_BIN);
876  assert(epd2->type.bits.exponent == EPD_MAX_BIN);
877 
878  if (epd1->exponent > epd2->exponent) {
879  diff = epd1->exponent - epd2->exponent;
880  if (diff <= EPD_MAX_BIN) {
881  value = epd1->type.value -
882  epd2->type.value / pow((double)2.0, (double)diff);
883  } else
884  value = epd1->type.value;
885  exponent = epd1->exponent;
886  } else if (epd1->exponent < epd2->exponent) {
887  diff = epd2->exponent - epd1->exponent;
888  if (diff <= EPD_MAX_BIN) {
889  value = epd1->type.value / pow((double)2.0, (double)diff) -
890  epd2->type.value;
891  } else
892  value = epd2->type.value * (double)(-1.0);
893  exponent = epd2->exponent;
894  } else {
895  value = epd1->type.value - epd2->type.value;
896  exponent = epd1->exponent;
897  }
898  epd3->type.value = value;
899  epd3->exponent = exponent;
900  EpdNormalize(epd3);
901 }
double value
Definition: epd.h:132
unsigned int sign
Definition: epd.h:91
void EpdCopy(EpDouble *from, EpDouble *to)
Definition: epd.c:1181
#define assert(ex)
Definition: util.h:141
int EpdIsNan(EpDouble *epd)
Definition: epd.c:1239
void EpdNormalize(EpDouble *epd)
Definition: epd.c:976
union EpTypeUnion type
Definition: epd.h:138
struct IeeeDoubleStruct bits
Definition: epd.h:133
void EpdMakeInf(EpDouble *epd, int sign)
Definition: epd.c:1114
unsigned int exponent
Definition: epd.h:90
void EpdMakeNan(EpDouble *epd)
Definition: epd.c:1158
int exponent
Definition: epd.h:139
int EpdIsInf(EpDouble *epd)
Definition: epd.c:1200
#define EPD_MAX_BIN
Definition: epd.h:62

◆ IsInfDouble()

int IsInfDouble ( double  value)

Function********************************************************************

Synopsis [Checks whether the value is Inf.]

Description [Checks whether the value is Inf.]

SideEffects []

SeeAlso []

Definition at line 1275 of file epd.c.

1276 {
1277  EpType val;
1278 
1279  val.value = value;
1280  if (val.bits.exponent == EPD_EXP_INF &&
1281  val.bits.mantissa0 == 0 &&
1282  val.bits.mantissa1 == 0) {
1283  if (val.bits.sign == 0)
1284  return(1);
1285  else
1286  return(-1);
1287  }
1288  return(0);
1289 }
double value
Definition: epd.h:132
unsigned int sign
Definition: epd.h:91
unsigned int mantissa1
Definition: epd.h:88
unsigned int mantissa0
Definition: epd.h:89
#define EPD_EXP_INF
Definition: epd.h:64
struct IeeeDoubleStruct bits
Definition: epd.h:133
unsigned int exponent
Definition: epd.h:90

◆ IsNanDouble()

int IsNanDouble ( double  value)

Function********************************************************************

Synopsis [Checks whether the value is NaN.]

Description [Checks whether the value is NaN.]

SideEffects []

SeeAlso []

Definition at line 1304 of file epd.c.

1305 {
1306  EpType val;
1307 
1308  val.value = value;
1309  if (val.nan.exponent == EPD_EXP_INF &&
1310  val.nan.sign == 1 &&
1311  val.nan.quiet_bit == 1 &&
1312  val.nan.mantissa0 == 0 &&
1313  val.nan.mantissa1 == 0) {
1314  return(1);
1315  }
1316  return(0);
1317 }
double value
Definition: epd.h:132
struct IeeeNanStruct nan
Definition: epd.h:134
#define EPD_EXP_INF
Definition: epd.h:64
unsigned int exponent
Definition: epd.h:117
unsigned int sign
Definition: epd.h:118
unsigned int mantissa0
Definition: epd.h:115
unsigned int quiet_bit
Definition: epd.h:116
unsigned int mantissa1
Definition: epd.h:114

◆ IsNanOrInfDouble()

int IsNanOrInfDouble ( double  value)

Function********************************************************************

Synopsis [Checks whether the value is NaN or Inf.]

Description [Checks whether the value is NaN or Inf.]

SideEffects []

SeeAlso []

Definition at line 1332 of file epd.c.

1333 {
1334  EpType val;
1335 
1336  val.value = value;
1337  if (val.nan.exponent == EPD_EXP_INF &&
1338  val.nan.mantissa0 == 0 &&
1339  val.nan.mantissa1 == 0 &&
1340  (val.nan.sign == 1 || val.nan.quiet_bit == 0)) {
1341  return(1);
1342  }
1343  return(0);
1344 }
double value
Definition: epd.h:132
struct IeeeNanStruct nan
Definition: epd.h:134
#define EPD_EXP_INF
Definition: epd.h:64
unsigned int exponent
Definition: epd.h:117
unsigned int sign
Definition: epd.h:118
unsigned int mantissa0
Definition: epd.h:115
unsigned int quiet_bit
Definition: epd.h:116
unsigned int mantissa1
Definition: epd.h:114