double RationalNumber::Log10(const RationalNumber &r) { if ((r._num <= 0) || (r._den <= 0)) { _error_msg("numerator and denominator can't be negative values or zero."); assert(r._num > 0 && r._den > 0); } return (log10(r._num) - log10(r._den)); }
RationalNumber RationalNumber::convert_to_fraction(char *strNum) { if (!isNumber(strNum)) { _error_msg("input string is not understandable fraction value."); assert(isNumber(strNum)); } int counter = 0; // int len = 0; int pos = -1; int i = 0; int isdecimal = false; char *str = strNum; char *temp = new char[20]; while (*str) { if (*str == '.') { isdecimal = true; pos = counter; } else { *(temp + i++) = *str; } str++; counter++; } temp[i] = 0; if (isdecimal) { this->_num = atol(temp); this->_den = (int)pow(10, counter - pos - 1 ); } else { this->_num = atol(temp); this->_den = 1; } delete[] temp; return *this; }
RationalNumber::RationalNumber(int _a, int _b) { _num = _a; _den = _b; if (_den == 0) { _error_msg("denominator can't be zero."); assert(_den != 0); } simplify(*this); }
/*--------------------------------------------------------------------------*/ static INT ComDrv_PowerDown(void) { INT nTimeOutCount; const UINT8 abyStopMode[2] = { 0x03, 0x17 }; ComDrv_DisableInterrupt(); ComDrv_VolumeDown(); /* Set AP1 to 1 */ ComDrv_SendSimpleCommand(CMD_COM_ID_ANALOG_CTRL,ANALOG_CTRL_REG_AP1); /* Set AP0 to 1 */ ComDrv_SendSimpleCommand(CMD_COM_ID_ANALOG_CTRL,ANALOG_CTRL_REG_AP0 | ANALOG_CTRL_REG_AP1); /* Let uC enter STOP mode */ #ifdef SOFT_MODE ComDrv_SendFIFOData(CMD_COM_ID_GEN_FIFO, abyStopMode, 2); #else outpw(REG_ACTL_M80SIZE, 2+1); outpw(REG_ACTL_M80DATA0, 0x55 | abyStopMode[0]<<8 | (abyStopMode[1]<<16)); outpw(REG_ACTL_M80ADDR, CMD_COM_ID_GEN_FIFO); //outpw(REG_ACTL_M80CON, 0x25210); outpw(REG_ACTL_M80CON, inpw(REG_ACTL_M80CON) | W_GFIFO | W_IF12_ACT); while((inpw(REG_ACTL_M80CON)&W_IF12_ACT) != 0); //outpw(REG_ACTL_M80CON, 0x5200); outpw(REG_ACTL_M80CON, inpw(REG_ACTL_M80CON) & ~W_GFIFO ); ComDrv_SendSimpleCommand(CMD_COM_ID_WAKE_UP,WAKE_UP_REG_INT); #endif for (nTimeOutCount=0;nTimeOutCount<10000;nTimeOutCount++){ if ((ComDrv_ReceiveSimpleData(CMD_COM_ID_WAKE_UP) & WAKE_UP_REG_DP0) != 0) break; } if (nTimeOutCount==10000){ _error_msg("ComDrv_PowerDown - wait for W5691 uC enther STOP mode timeout\n"); return ERR_W5691_STOP_TIMEOUT; } /* Set DP1 to 1, Set AP2 to 1 */ ComDrv_SendSimpleCommand(CMD_COM_ID_CLK_CTRL,CLK_CTRL_REG_DP1 | CLK_CTRL_REG_AP2); ComDrv_EnableInterrupt(); return MW_NO_ERROR; }
static INT write_intermediate_reg(INT nRegId, UINT8 data) { INT nTimeOutCount; outpw(REG_ACTL_M80ADDR, nRegId); outpw(REG_ACTL_M80SIZE, 0x1); outpw(REG_ACTL_M80DATA0, data); outpw(REG_ACTL_M80CON, inpw(REG_ACTL_M80CON) | W_IF12_ACT); for(nTimeOutCount=0;nTimeOutCount<10000;nTimeOutCount++){ if ((inpw(REG_ACTL_M80CON) & W_IF12_ACT) == 0 ) break; } if (nTimeOutCount == 10000){ _error_msg("write_intermediate_reg - M80 write intermediate register timeout\n"); return ERR_M80_W_INTERMEDIATEREG_TIMEOUT; } return 0; }
static INT read_intermediate_reg(INT nRegId) { INT nTimeOutCount; outpw(REG_ACTL_M80ADDR, nRegId); outpw(REG_ACTL_M80CON, inpw(REG_ACTL_M80CON) | R_IF11_ACT); for(nTimeOutCount=0;nTimeOutCount<10000;nTimeOutCount++){ if ((inpw(REG_ACTL_M80CON) & R_IF11_ACT) == 0 ) break; } if (nTimeOutCount == 10000){ _error_msg("read_intermediate_reg - M80 read intermediate register timeout\n"); return ERR_M80_R_INTERMEDIATEREG_TIMEOUT; } return ((inpw(REG_ACTL_M80SIZE)>>16) & 0xff); }