示例#1
0
void ViewWidget::connectSignalsAndSlots()
{
  bool connected;
  connected = connect(mIG,
                      SIGNAL(nameChanged(QString)), 
                      this,
                      SLOT(on_nameChanged(QString)));
  OS_ASSERT(connected);

  connected = connect(this,
                      SIGNAL(commentsShow(bool)),
                      mIG,
                      SLOT(commentConfig(bool)));
  OS_ASSERT(connected);

  connected = connect(this,
                      SIGNAL(precisionDlgShow()),
                      mIGPrecisionDlg,
                      SLOT(show()));
  OS_ASSERT(connected);

  connected = connect(this,
                      SIGNAL(precisionDlgHide()),
                      mIGPrecisionDlg,
                      SLOT(hide()));
  OS_ASSERT(connected);

  connected = connect(mIGPrecisionDlg,
                      SIGNAL(accepted()),
                      mIG,
                      SLOT(setPrec()));
  OS_ASSERT(connected);

  connected = connect(mIGPrecisionDlg,
                      SIGNAL(accepted()),
                      this,
                      SIGNAL(precisionDlgFinished()));
  OS_ASSERT(connected);

  connected = connect(mIGPrecisionDlg,
                      SIGNAL(rejected()),
                      this,
                      SIGNAL(precisionDlgFinished()));
  OS_ASSERT(connected);

  connected = connect(mIGPrecisionDlg,
                      SIGNAL(finished(int)),
                      this,
                      SIGNAL(precisionDlgFinished()));
  OS_ASSERT(connected);

  connected = connect(mIG,
                      SIGNAL(dirty()),
                      this,
                      SIGNAL(modelDirty()));
  OS_ASSERT(connected);

 
}
BigNumberBase BigNumberBase::operator = (const BigNumberBase& num)
{
	mpz_set(m_gmp->m_integer, num.m_gmp->m_integer);
	m_prec = num.m_prec;
	if (m_fixedPrec != -1)
	{
		setPrec(m_fixedPrec, m_fixedPrecFlag);
	}
	return *this;
}
void BigNumberBase::setFixedPrec(int32_t fixedPrec, PrecFlag fixedPrecFlag)
{
	if (fixedPrec == -1)
	{
		fixedPrec = Calc::PRECISE;
	}
	m_fixedPrec = fixedPrec;
	m_fixedPrecFlag = fixedPrecFlag;
	setPrec(m_fixedPrec, m_fixedPrecFlag);
}
void BigNumberBase::setPrec(int32_t prec, PrecFlag flag)
{
	if (prec == -1)
	{
		prec = Calc::PRECISE;
	}
	if (m_prec == prec)
	{
		return;
	}
	if (m_prec < prec)
	{
		GmpInt::TenExp(m_gmp->m_integer, (prec - m_prec));
		m_prec = prec;
		return;
	}
	if (flag == BigNumberBase::HALF_ADJUST)
	{
		std::string result = toString();
		if (result[result.size() - (m_prec - prec)] < '5')
		{
			setPrec(prec, BigNumberBase::ROUND_OFF);
			return;
		}

		if (BigNumberBase::Compare(*this, "0") == BigNumberCompare::BIG)
		{
			setPrec(prec, BigNumberBase::ROUND_UP);
			return;
		}
		setPrec(prec, BigNumberBase::ROUND_DOWN);
		return;
	}

	int32_t exp = m_prec - prec;
	char* szExp = (char*)malloc(exp + 2);
	memset(szExp, 48, exp + 1);
	szExp[exp + 1] = 0;
	szExp[0] = 49;
	mpz_t mpzExp;
	mpz_init_set_str(mpzExp, szExp, 10);
	
	switch (flag)
	{
	case BigNumberBase::ROUND_OFF:
	{
		mpz_tdiv_q(m_gmp->m_integer, m_gmp->m_integer, mpzExp);
		break;
	}
	case BigNumberBase::ROUND_UP:
	{
		mpz_cdiv_q(m_gmp->m_integer, m_gmp->m_integer, mpzExp);
		break;
	}
	case BigNumberBase::ROUND_DOWN:
	{
		mpz_fdiv_q(m_gmp->m_integer, m_gmp->m_integer, mpzExp);
		break;
	}
	default:
		break;
	}

	mpz_clear(mpzExp);
	::free(szExp);
	m_prec = prec;
}