Esempio n. 1
0
TInt RealToRatio(SRatio& aRatio, const TRealX& aReal)
	{
	aRatio.iSpare1 = 0;
	aRatio.iSpare2 = 0;
	if (aReal.iSign || aReal.IsZero() || aReal.IsNaN())
		{
		aRatio.iM = 0;
		aRatio.iX = 0;
		return (aReal.IsZero()) ? KErrNone : KErrNotSupported;
		}
	TRealX rx(aReal);
	TRealX rr(rx);
	rr.iExp -= 32;
	rr.iMantLo = 0;
	rr.iMantHi = 0x80000000u;
	rx += rr;	// rounding
	TInt exp = rx.iExp - 32767 - 31;
	if (exp < -32768)
		{
		aRatio.iM = 0;
		aRatio.iX = 0;
		return KErrUnderflow;
		}
	if (exp > 32767)
		{
		aRatio.iM = 0xffffffffu;
		aRatio.iX = 32767;
		return KErrOverflow;
		}
	aRatio.iM = rx.iMantHi;
	aRatio.iX = (TInt16)exp;
	return KErrNone;
	}
Esempio n. 2
0
TInt RatioMult(const SRatio& aRatio, TUint32& aInt32)
	{
	TRealX rx;
	TInt r = RatioToReal(rx, aRatio);
	if (r != KErrNone)
		return r;
	r = rx.MultEq(TRealX((TUint)aInt32));
	if (r != KErrNone)
		return r;
	if (rx.IsZero())
		{
		aInt32 = 0;
		return KErrNone;
		}
	rx.AddEq(TRealX(0.5));
	if (rx<TRealX(1))
		{
		aInt32 = 0;
		return KErrUnderflow;
		}
	if (rx.iExp > 32767+31)
		{
		aInt32 = ~0u;
		return KErrOverflow;
		}
	aInt32 = rx.operator TUint();
	return KErrNone;
	}
Esempio n. 3
0
EXPORT_C TInt Math::Sqrt(TReal& aTrg,const TReal &aSrc)
/**
Calculates the square root of a number.

@param aTrg A reference containing the result. 
@param aSrc The number whose square-root is required.

@return KErrNone if successful, otherwise another of
        the system-wide error codes. 
*/
//
// Fast sqrt routine. See Software manual by W.J.Cody & W.Waite Chapter 4.
//
	{
	const TRealX& KConstA=*(const TRealX*)KConstAdata;
	const TRealX& KConstB=*(const TRealX*)KConstBdata;
	const TRealX& Sqr2Inv=*(const TRealX*)Sqr2Invdata;

	TRealX x;
	TInt r=x.Set(aSrc);
	if (x.IsZero())
		{
		aTrg=aSrc;
		return(KErrNone);
		}   
	if (r==KErrArgument || x.iSign&1)
		{
		SetNaN(aTrg);
		return(KErrArgument);
		}
	if (r==KErrOverflow)	// positive infinity
		{
		aTrg=aSrc;
		return(r);
		}
	TInt n=x.iExp-0x7FFE;
	x.iExp=0x7FFE;
	TRealX y=KConstB*x+KConstA;
	y=y+(x/y);
	y.iExp--;
	y=y+(x/y);
	y.iExp--;
	y=y+(x/y);
	y.iExp--;
	if (n&1)
		{
		y*=Sqr2Inv;
		n++;
		}
	y.iExp=TUint16(TInt(y.iExp)+(n>>1));
	return y.GetTReal(aTrg);
	}