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; }
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; }
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); }