📄 epd.c
字号:
assert(epd2->type.bits.exponent == EPD_MAX_BIN); value = epd1->type.value / epd2->type.value; exponent = epd1->exponent - epd2->exponent; epd1->type.value = value; epd1->exponent = exponent; EpdNormalize(epd1);}/**Function******************************************************************** Synopsis [Divides two arbitrary precision double values.] Description [Divides two arbitrary precision double values.] SideEffects [] SeeAlso []******************************************************************************/voidEpdDivide3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3){ if (EpdIsNan(epd1) || EpdIsNan(epd2)) { EpdMakeNan(epd3); return; } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) { int sign; if (EpdIsInf(epd1) && EpdIsInf(epd2)) { EpdMakeNan(epd3); } else if (EpdIsInf(epd1)) { sign = epd1->type.bits.sign ^ epd2->type.bits.sign; EpdMakeInf(epd3, sign); } else { sign = epd1->type.bits.sign ^ epd2->type.bits.sign; EpdMakeZero(epd3, sign); } return; } if (epd2->type.value == 0.0) { EpdMakeNan(epd3); return; } assert(epd1->type.bits.exponent == EPD_MAX_BIN); assert(epd2->type.bits.exponent == EPD_MAX_BIN); epd3->type.value = epd1->type.value / epd2->type.value; epd3->exponent = epd1->exponent - epd2->exponent; EpdNormalize(epd3);}/**Function******************************************************************** Synopsis [Adds two arbitrary precision double values.] Description [Adds two arbitrary precision double values.] SideEffects [] SeeAlso []******************************************************************************/voidEpdAdd(EpDouble *epd1, double value){ EpDouble epd2; double tmp; int exponent, diff; if (EpdIsNan(epd1) || IsNanDouble(value)) { EpdMakeNan(epd1); return; } else if (EpdIsInf(epd1) || IsInfDouble(value)) { int sign; EpdConvert(value, &epd2); if (EpdIsInf(epd1) && IsInfDouble(value)) { sign = epd1->type.bits.sign ^ epd2.type.bits.sign; if (sign == 1) EpdMakeNan(epd1); } else if (EpdIsInf(&epd2)) { EpdCopy(&epd2, epd1); } return; } assert(epd1->type.bits.exponent == EPD_MAX_BIN); EpdConvert(value, &epd2); if (epd1->exponent > epd2.exponent) { diff = epd1->exponent - epd2.exponent; if (diff <= EPD_MAX_BIN) tmp = epd1->type.value + epd2.type.value / pow((double)2.0, (double)diff); else tmp = epd1->type.value; exponent = epd1->exponent; } else if (epd1->exponent < epd2.exponent) { diff = epd2.exponent - epd1->exponent; if (diff <= EPD_MAX_BIN) tmp = epd1->type.value / pow((double)2.0, (double)diff) + epd2.type.value; else tmp = epd2.type.value; exponent = epd2.exponent; } else { tmp = epd1->type.value + epd2.type.value; exponent = epd1->exponent; } epd1->type.value = tmp; epd1->exponent = exponent; EpdNormalize(epd1);}/**Function******************************************************************** Synopsis [Adds two arbitrary precision double values.] Description [Adds two arbitrary precision double values.] SideEffects [] SeeAlso []******************************************************************************/voidEpdAdd2(EpDouble *epd1, EpDouble *epd2){ double value; int exponent, diff; if (EpdIsNan(epd1) || EpdIsNan(epd2)) { EpdMakeNan(epd1); return; } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) { int sign; if (EpdIsInf(epd1) && EpdIsInf(epd2)) { sign = epd1->type.bits.sign ^ epd2->type.bits.sign; if (sign == 1) EpdMakeNan(epd1); } else if (EpdIsInf(epd2)) { EpdCopy(epd2, epd1); } return; } assert(epd1->type.bits.exponent == EPD_MAX_BIN); assert(epd2->type.bits.exponent == EPD_MAX_BIN); if (epd1->exponent > epd2->exponent) { diff = epd1->exponent - epd2->exponent; if (diff <= EPD_MAX_BIN) { value = epd1->type.value + epd2->type.value / pow((double)2.0, (double)diff); } else value = epd1->type.value; exponent = epd1->exponent; } else if (epd1->exponent < epd2->exponent) { diff = epd2->exponent - epd1->exponent; if (diff <= EPD_MAX_BIN) { value = epd1->type.value / pow((double)2.0, (double)diff) + epd2->type.value; } else value = epd2->type.value; exponent = epd2->exponent; } else { value = epd1->type.value + epd2->type.value; exponent = epd1->exponent; } epd1->type.value = value; epd1->exponent = exponent; EpdNormalize(epd1);}/**Function******************************************************************** Synopsis [Adds two arbitrary precision double values.] Description [Adds two arbitrary precision double values.] SideEffects [] SeeAlso []******************************************************************************/voidEpdAdd3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3){ double value; int exponent, diff; if (EpdIsNan(epd1) || EpdIsNan(epd2)) { EpdMakeNan(epd3); return; } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) { int sign; if (EpdIsInf(epd1) && EpdIsInf(epd2)) { sign = epd1->type.bits.sign ^ epd2->type.bits.sign; if (sign == 1) EpdMakeNan(epd3); else EpdCopy(epd1, epd3); } else if (EpdIsInf(epd1)) { EpdCopy(epd1, epd3); } else { EpdCopy(epd2, epd3); } return; } assert(epd1->type.bits.exponent == EPD_MAX_BIN); assert(epd2->type.bits.exponent == EPD_MAX_BIN); if (epd1->exponent > epd2->exponent) { diff = epd1->exponent - epd2->exponent; if (diff <= EPD_MAX_BIN) { value = epd1->type.value + epd2->type.value / pow((double)2.0, (double)diff); } else value = epd1->type.value; exponent = epd1->exponent; } else if (epd1->exponent < epd2->exponent) { diff = epd2->exponent - epd1->exponent; if (diff <= EPD_MAX_BIN) { value = epd1->type.value / pow((double)2.0, (double)diff) + epd2->type.value; } else value = epd2->type.value; exponent = epd2->exponent; } else { value = epd1->type.value + epd2->type.value; exponent = epd1->exponent; } epd3->type.value = value; epd3->exponent = exponent; EpdNormalize(epd3);}/**Function******************************************************************** Synopsis [Subtracts two arbitrary precision double values.] Description [Subtracts two arbitrary precision double values.] SideEffects [] SeeAlso []******************************************************************************/voidEpdSubtract(EpDouble *epd1, double value){ EpDouble epd2; double tmp; int exponent, diff; if (EpdIsNan(epd1) || IsNanDouble(value)) { EpdMakeNan(epd1); return; } else if (EpdIsInf(epd1) || IsInfDouble(value)) { int sign; EpdConvert(value, &epd2); if (EpdIsInf(epd1) && IsInfDouble(value)) { sign = epd1->type.bits.sign ^ epd2.type.bits.sign; if (sign == 0) EpdMakeNan(epd1); } else if (EpdIsInf(&epd2)) { EpdCopy(&epd2, epd1); } return; } assert(epd1->type.bits.exponent == EPD_MAX_BIN); EpdConvert(value, &epd2); if (epd1->exponent > epd2.exponent) { diff = epd1->exponent - epd2.exponent; if (diff <= EPD_MAX_BIN) tmp = epd1->type.value - epd2.type.value / pow((double)2.0, (double)diff); else tmp = epd1->type.value; exponent = epd1->exponent; } else if (epd1->exponent < epd2.exponent) { diff = epd2.exponent - epd1->exponent; if (diff <= EPD_MAX_BIN) tmp = epd1->type.value / pow((double)2.0, (double)diff) - epd2.type.value; else tmp = epd2.type.value * (double)(-1.0); exponent = epd2.exponent; } else { tmp = epd1->type.value - epd2.type.value; exponent = epd1->exponent; } epd1->type.value = tmp; epd1->exponent = exponent; EpdNormalize(epd1);}/**Function******************************************************************** Synopsis [Subtracts two arbitrary precision double values.] Description [Subtracts two arbitrary precision double values.] SideEffects [] SeeAlso []******************************************************************************/voidEpdSubtract2(EpDouble *epd1, EpDouble *epd2){ double value; int exponent, diff; if (EpdIsNan(epd1) || EpdIsNan(epd2)) { EpdMakeNan(epd1); return; } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) { int sign; if (EpdIsInf(epd1) && EpdIsInf(epd2)) { sign = epd1->type.bits.sign ^ epd2->type.bits.sign; if (sign == 0) EpdMakeNan(epd1); } else if (EpdIsInf(epd2)) { EpdCopy(epd2, epd1); } return; } assert(epd1->type.bits.exponent == EPD_MAX_BIN); assert(epd2->type.bits.exponent == EPD_MAX_BIN); if (epd1->exponent > epd2->exponent) { diff = epd1->exponent - epd2->exponent; if (diff <= EPD_MAX_BIN) { value = epd1->type.value - epd2->type.value / pow((double)2.0, (double)diff); } else value = epd1->type.value; exponent = epd1->exponent; } else if (epd1->exponent < epd2->exponent) { diff = epd2->exponent - epd1->exponent; if (diff <= EPD_MAX_BIN) { value = epd1->type.value / pow((double)2.0, (double)diff) - epd2->type.value; } else value = epd2->type.value * (double)(-1.0); exponent = epd2->exponent; } else { value = epd1->type.value - epd2->type.value; exponent = epd1->exponent; } epd1->type.value = value; epd1->exponent = exponent; EpdNormalize(epd1);}/**Function******************************************************************** Synopsis [Subtracts two arbitrary precision double values.] Description [Subtracts two arbitrary precision double values.] SideEffects [] SeeAlso []******************************************************************************/voidEpdSubtract3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3){ double value; int exponent, diff; if (EpdIsNan(epd1) || EpdIsNan(epd2)) { EpdMakeNan(epd3); return; } else if (EpdIsInf(epd1) || EpdIsInf(epd2)) { int sign; if (EpdIsInf(epd1) && EpdIsInf(epd2)) { sign = epd1->type.bits.sign ^ epd2->type.bits.sign; if (sign == 0) EpdCopy(epd1, epd3); else EpdMakeNan(epd3); } else if (EpdIsInf(epd1)) { EpdCopy(epd1, epd1); } else { sign = epd2->type.bits.sign ^ 0x1; EpdMakeInf(epd3, sign); } return; } assert(epd1->type.bits.exponent == EPD_MAX_BIN); assert(epd2->type.bits.exponent == EPD_MAX_BIN); if (epd1->exponent > epd2->exponent) { diff = epd1->exponent - epd2->exponent; if (diff <= EPD_MAX_BIN) { value = epd1->type.value - epd2->type.value / pow((double)2.0, (double)diff); } else value = epd1->type.value; exponent = epd1->exponent; } else if (epd1->exponent < epd2->exponent) { diff = epd2->exponent - epd1->exponent; if (diff <= EPD_MAX_BIN) { value = epd1->type.value / pow((double)2.0, (double)diff) - epd2->type.value; } else value = epd2->type.value * (double)(-1.0); exponent = epd2->exponent; } else { value = epd1->type.value - epd2->type.value; exponent = epd1->exponent; } epd3->type.value = value; epd3->exponent = exponent; EpdNormalize(epd3);}/**Function********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -