package Ġorg . opp ia . android . util . math Ċ Ċ import Ġorg . opp ia . android . app . model . Fraction Ċ import Ġorg . opp ia . android . app . model . Real Ċ import Ġorg . opp ia . android . app . model . Real . Real Type Case . INTEGER Ċ import Ġorg . opp ia . android . app . model . Real . Real Type Case . IR RATION AL Ċ import Ġorg . opp ia . android . app . model . Real . Real Type Case . RATION AL Ċ import Ġorg . opp ia . android . app . model . Real . Real Type Case . REAL TYPE _ NOT _ SET Ċ import Ġkotlin . math . absolute Value Ċ import Ġkotlin . math . pow Ċ Ċ /** ĠRepresents Ġan Ġinteger Ġ[ Real ] Ġwith Ġvalue Ġ 0 . Ġ*/ Ċ val ĠZERO : ĠReal Ġby Ġlazy Ġ{ ĊĠ ĠReal . newBuilder (). apply Ġ{ Ġinteger Ġ= Ġ 0 Ġ}. build () Ċ } Ċ Ċ /** ĠRepresents Ġan Ġinteger Ġ[ Real ] Ġwith Ġvalue Ġ 1 . Ġ*/ Ċ val ĠONE : ĠReal Ġby Ġlazy Ġ{ ĊĠ ĠReal . newBuilder (). apply Ġ{ Ġinteger Ġ= Ġ 1 Ġ}. build () Ċ } Ċ Ċ /** ĠRepresents Ġa Ġr ational Ġfraction Ġ[ Real ] Ġwith Ġvalue Ġ 1 / 2 . Ġ*/ Ċ val ĠONE _ HALF : ĠReal Ġby Ġlazy Ġ{ ĊĠ ĠReal . newBuilder (). apply Ġ{ ĊĠĠĠ Ġr ational Ġ= ĠFraction . newBuilder (). apply Ġ{ ĊĠĠĠĠĠ Ġnum erator Ġ= Ġ 1 ĊĠĠĠĠĠ Ġdenominator Ġ= Ġ 2 ĊĠĠĠ Ġ}. build () ĊĠ Ġ}. build () Ċ } Ċ Ċ /** Ċ Ġ* Ġ[ Comparator ] Ġfor Ġ[ Real ] s Ġthat Ġensures Ġtwo Ġre als Ġcan Ġbe Ġcompared Ġeven Ġif Ġthey Ġare Ġdifferent Ġtypes . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġno Ġre liance Ġshould Ġbe Ġplaced Ġon Ġhow Ġnegative Ġzeros Ġfor Ġdouble s Ġand Ġfr actions Ġbehave . Ċ Ġ*/ Ċ val ĠREAL _ COMP AR ATOR : ĠComparator < Real > Ġby Ġlazy Ġ{ ĠComparator . comp aring ( Real :: toDouble ) Ġ} Ċ Ċ /** Ċ Ġ* ĠReturns Ġwhether Ġthis Ġ[ Real ] Ġis Ġexplicitly Ġa Ġr ational Ġtype Ġ( i . e . Ġa Ġfraction ). Ċ Ġ* Ċ Ġ* ĠThis Ġreturns Ġfalse Ġif Ġthe Ġreal Ġis Ġan Ġinteger Ġdespite Ġthat Ġbeing Ġmathematic ally Ġr ational . Ċ Ġ*/ Ċ fun ĠReal . is Rational (): ĠBoolean Ġ= Ġreal Type Case Ġ== ĠR ATION AL Ċ Ċ /** Ċ Ġ* ĠReturns Ġwhether Ġthis Ġ[ Real ] Ġis Ġexplicitly Ġan Ġinteger . Ċ Ġ* Ċ Ġ* ĠThis Ġreturns Ġfalse Ġif Ġthe Ġreal Ġis Ġa Ġr ational Ġdespite Ġthat Ġbeing Ġmathematic ally Ġan Ġinteger Ġ( e . g . Ġa Ċ Ġ* Ġwhole Ġnumber Ġfraction ). Ċ Ġ*/ Ċ fun ĠReal . is Integer (): ĠBoolean Ġ= Ġreal Type Case Ġ== ĠINTEGER Ċ Ċ /** Ċ Ġ* ĠReturns Ġwhether Ġthis Ġ[ Real ] Ġis Ġexplicitly Ġa Ġwhole Ġnumber , Ġthat Ġis , Ġeither Ġan Ġinteger Ġor Ġa Ċ Ġ* Ġ[ Fraction ] Ġthat 's Ġalso Ġa Ġwhole Ġnumber . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġthis Ġhas Ġthe Ġsame Ġlimitations Ġas Ġ[ Fraction . is Only Whole Number ] Ġfor Ġr ational Ġvalues . Ċ Ġ*/ Ċ fun ĠReal . is Whole Number (): ĠBoolean Ġ{ ĊĠ Ġreturn Ġwhen Ġ( real Type Case ) Ġ{ ĊĠĠĠ ĠR ATION AL Ġ-> Ġr ational . is Only Whole Number () ĊĠĠĠ ĠINTEGER Ġ-> Ġtrue ĊĠĠĠ ĠI RR ATION AL , ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġfalse ĊĠ Ġ} Ċ } Ċ Ċ /** ĠReturns Ġwhether Ġthis Ġ[ Real ] Ġis Ġnegative . Ġ*/ Ċ fun ĠReal . is Negative (): ĠBoolean Ġ= Ġwhen Ġ( real Type Case ) Ġ{ ĊĠ ĠR ATION AL Ġ-> Ġr ational . is Negative ĊĠ ĠI RR ATION AL Ġ-> Ġir ration al Ġ< Ġ 0 ĊĠ ĠINTEGER Ġ-> Ġinteger Ġ< Ġ 0 ĊĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ this .") Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġwhether Ġthis Ġ[ Real ] Ġapproximately Ġequals Ġanother , Ġthat Ġis , Ġif Ġthey Ġevaluate Ġto Ċ Ġ* Ġapproximately Ġthe Ġsame Ġvalue Ġ( see Ġ[ Double . is Approx imately EqualTo ]). Ċ Ġ*/ Ċ fun ĠReal . is Approx imately EqualTo ( other : ĠReal ): ĠBoolean Ġ{ ĊĠ Ġreturn Ġthis @ is Approx imately EqualTo . is Approx imately EqualTo ( other . toDouble ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġwhether Ġthis Ġ[ Real ] Ġis Ġapproximately Ġequal Ġto Ġthe Ġspecified Ġ[ Double ] Ġper Ċ Ġ* Ġ[ Double . is Approx imately EqualTo ]. Ċ Ġ*/ Ċ fun ĠReal . is Approx imately EqualTo ( value : ĠDouble ): ĠBoolean Ġ{ ĊĠ Ġreturn Ġto Double (). is Approx imately EqualTo ( value ) Ċ } Ċ Ċ /** ĠReturns Ġwhether Ġthis Ġ[ Real ] Ġis Ġapproximately Ġzero Ġper Ġ[ Double . is Approx imately EqualTo ]. Ġ*/ Ċ fun ĠReal . is Approx imately Zero (): ĠBoolean Ġ= Ġis Approx imately EqualTo ( 0 . 0 ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġ[ Double ] Ġrepresentation Ġof Ġthis Ġ[ Real ] Ġthat Ġis Ġapproximately Ġthe Ġsame Ġvalue Ġ( per Ċ Ġ* Ġ[ is Approx imately EqualTo ]). Ċ Ġ* Ċ Ġ* ĠThis Ġmethod Ġthrows Ġan Ġexception Ġif Ġthis Ġ[ Real ] Ġis Ġinvalid Ġ( such Ġas Ġa Ġdefault Ġproto Ġinstance ). Ċ Ġ*/ Ċ fun ĠReal . toDouble (): ĠDouble Ġ{ ĊĠ Ġreturn Ġwhen Ġ( real Type Case ) Ġ{ ĊĠĠĠ ĠR ATION AL Ġ-> Ġr ational . toDouble () ĊĠĠĠ ĠINTEGER Ġ-> Ġinteger . toDouble () ĊĠĠĠ ĠI RR ATION AL Ġ-> Ġir ration al ĊĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ this .") ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġwhole - number Ġrepresentation Ġof Ġthis Ġ[ Real ], Ġor Ġnull Ġif Ġthere Ġisn 't Ġone . Ċ Ġ* Ċ Ġ* ĠThis Ġfunction Ġshould Ġonly Ġbe Ġcalled Ġif Ġ[ is Whole Number ] Ġreturns Ġtrue . ĠThe Ġcontract Ġof Ġthat Ċ Ġ* Ġfunction Ġguarantees Ġthat Ġa Ġnon - null Ġinteger Ġcan Ġbe Ġreturned Ġhere Ġfor Ġwhole Ġnumber Ġre als . Ċ Ġ* Ċ Ġ* ĠThis Ġmethod Ġthrows Ġan Ġexception Ġif Ġthis Ġ[ Real ] Ġis Ġinvalid Ġ( such Ġas Ġa Ġdefault Ġproto Ġinstance ). Ċ Ġ*/ Ċ fun ĠReal . as Whole Number (): ĠInt ? Ġ{ ĊĠ Ġreturn Ġwhen Ġ( real Type Case ) Ġ{ ĊĠĠĠ ĠR ATION AL Ġ-> Ġif Ġ( ration al . is Only Whole Number ()) Ġr ational . to Whole Number () Ġelse Ġnull ĊĠĠĠ ĠINTEGER Ġ-> Ġinteger ĊĠĠĠ ĠI RR ATION AL Ġ-> Ġnull ĊĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ this .") ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġhuman - readable , Ġplaintext Ġrepresentation Ġof Ġthis Ġ[ Real ]. Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġthe Ġreturned Ġvalue Ġis Ġguaranteed Ġto Ġbe Ġa Ġself - contained Ġnumeric Ġexpression Ġrepresenting Ċ Ġ* Ġthe Ġreal Ġ( which Ġmeans Ġproper Ġfr actions Ġare Ġconverted Ġto Ġimpro per Ġanswer Ġstrings Ġsince Ġfr actions Ċ Ġ* Ġlike Ġ' 1 Ġ 1 / 2 ' Ġcan 't Ġbe Ġwritten Ġas Ġa Ġnumeric Ġexpression Ġwithout Ġconverting Ġthem Ġto Ġan Ġimpro per Ċ Ġ* Ġform : Ġ' 3 / 2 '). Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġthis Ġwill Ġreturn Ġan Ġempty Ġstring Ġif Ġthis Ġ[ Real ] Ġdoesn 't Ġrepresent Ġan Ġactual Ġreal Ġvalue Ċ Ġ* Ġ( e . g . Ġa Ġdefault Ġinstance ). Ċ Ġ*/ Ċ fun ĠReal . to Plain Text (): ĠString Ġ= Ġwhen Ġ( real Type Case ) Ġ{ ĊĠ Ġ// ĠNote Ġthat Ġthe Ġr ational Ġpart Ġis Ġfirst Ġconverted Ġto Ġan Ġimpro per Ġfraction Ġsince Ġmixed Ġfr actions ĊĠ Ġ// Ġcan 't Ġbe Ġexpressed Ġas Ġa Ġsingle Ġcoefficient Ġin Ġtypical Ġpolynomial Ġsyntax ). ĊĠ ĠR ATION AL Ġ-> Ġr ational . to Impro per Form (). to Answer String () ĊĠ ĠI RR ATION AL Ġ-> Ġir ration al . to Plain String () ĊĠ ĠINTEGER Ġ-> Ġinteger . toString () ĊĠ Ġ// ĠThe ĠReal Ġtype Ġisn 't Ġvalid , Ġso Ġrather Ġthan Ġfailing Ġjust Ġreturn Ġan Ġempty Ġstring . ĊĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġ"" Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġnegative Ġversion Ġof Ġthis Ġ[ Real ] Ġsuch Ġthat Ġthe Ġoriginal Ġreal Ġplus Ġthe Ġnegative Ġversion Ċ Ġ* Ġwould Ġresult Ġin Ġzero . Ċ Ġ*/ Ċ operator Ġfun ĠReal . unary Minus (): ĠReal Ġ{ ĊĠ Ġreturn Ġwhen Ġ( real Type Case ) Ġ{ ĊĠĠĠ ĠR ATION AL Ġ-> Ġcreate Rational Real (- ration al ) ĊĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real (- ir ration al ) ĊĠĠĠ ĠINTEGER Ġ-> Ġcreate Integer Real (- integer ) ĊĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ this .") ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAdds Ġthis Ġ[ Real ] Ġwith Ġanother Ġand Ġreturns Ġthe Ġresult . Ċ Ġ* Ċ Ġ* ĠNeither Ġ[ Real ] Ġbeing Ġadded Ġare Ġchanged Ġduring Ġthe Ġoperation . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġthis Ġfunction Ġwill Ġalways Ġsucceed Ġ( unless Ġone Ġof Ġthe Ġ[ Real ] s Ġis Ġmalformed Ġor Ċ Ġ* Ġincomplete ), Ġbut Ġthe Ġtype Ġof Ġ[ Real ] Ġthat 's Ġreturned Ġdepends Ġon Ġthe Ġconst it uent Ġ[ Real ] s Ġbeing Ċ Ġ* Ġadded . ĠFor Ġreference , Ġhere 's Ġhow Ġthe Ġconversion Ġbehaves : Ċ Ġ* Ċ Ġ* Ġ| ------------------------------------------------ ---| Ċ Ġ* Ġ| Ġ+ ĠĠĠĠĠĠĠĠĠ Ġ| Ġinteger ĠĠĠ Ġ| Ġr ational ĠĠ Ġ| Ġir ration al Ġ| Ċ Ġ* Ġ| ------------ |------------ |------------ |------------ | Ċ Ġ* Ġ| Ġinteger ĠĠĠ Ġ| Ġinteger ĠĠĠ Ġ| Ġr ational ĠĠ Ġ| Ġir ration al Ġ| Ċ Ġ* Ġ| Ġr ational ĠĠ Ġ| Ġr ational ĠĠ Ġ| Ġr ational ĠĠ Ġ| Ġir ration al Ġ| Ċ Ġ* Ġ| Ġir ration al Ġ| Ġir ration al Ġ| Ġir ration al Ġ| Ġir ration al Ġ| Ċ Ġ* Ġ| ------------------------------------------------ ---| Ċ Ġ* Ċ Ġ* ĠAs Ġindicated Ġby Ġthe Ġabove Ġtable , Ġthis Ġfunction Ġattempts Ġto Ġmaintain Ġas Ġmuch Ġprecision Ġas Ġpossible Ċ Ġ* Ġduring Ġoperations Ġ( but Ġwill Ġfall Ġback Ġto Ġ[ Double ] s Ġif Ġthe Ġcalculation Ġwould Ġotherwise Ġresult Ġin Ġa Ċ Ġ* Ġhigh Ġlevel Ġof Ġerror ). ĠWhile Ġ[ Double ] s Ġdon 't Ġperfectly Ġcapture Ġprecision , Ġtheir Ġerror Ġlevels Ġare Ċ Ġ* Ġgenerally Ġbetter Ġthan Ġthe Ġrounding Ġerrors Ġencountered Ġfrom Ġinteger Ġarithmetic . Ċ Ġ*/ Ċ operator Ġfun ĠReal . plus ( rhs : ĠReal ): ĠReal Ġ{ ĊĠ Ġreturn Ġwhen Ġ( real Type Case ) Ġ{ ĊĠĠĠ ĠR ATION AL Ġ-> Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠ ĠR ATION AL Ġ-> Ġcreate Rational Real ( ration al Ġ+ Ġrhs . ration al ) ĊĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( ration al . toDouble () Ġ+ Ġrhs . ir ration al ) ĊĠĠĠĠĠ ĠINTEGER Ġ-> Ġcreate Rational Real ( ration al Ġ+ Ġrhs . integer . to Whole Number Fraction ()) ĊĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠ Ġ} ĊĠĠĠ ĠI RR ATION AL Ġ-> Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠ ĠR ATION AL Ġ-> Ġcreate I rr ational Real ( ir ration al Ġ+ Ġrhs . ration al . toDouble ()) ĊĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( ir ration al Ġ+ Ġrhs . ir ration al ) ĊĠĠĠĠĠ ĠINTEGER Ġ-> Ġcreate I rr ational Real ( ir ration al Ġ+ Ġrhs . integer ) ĊĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠ Ġ} ĊĠĠĠ ĠINTEGER Ġ-> Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠ ĠR ATION AL Ġ-> Ġcreate Rational Real ( integer . to Whole Number Fraction () Ġ+ Ġrhs . ration al ) ĊĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( integer Ġ+ Ġrhs . ir ration al ) ĊĠĠĠĠĠ ĠINTEGER Ġ-> Ġcreate Integer Real ( integer Ġ+ Ġrhs . integer ) ĊĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠ Ġ} ĊĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ this .") ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSubtract s Ġthis Ġ[ Real ] Ġfrom Ġanother Ġand Ġreturns Ġthe Ġresult . Ċ Ġ* Ċ Ġ* ĠNeither Ġ[ Real ] Ġbeing Ġsubtract ed Ġare Ġchanged Ġduring Ġthe Ġoperation . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġthis Ġfunction Ġwill Ġalways Ġsucceed Ġ( unless Ġone Ġof Ġthe Ġ[ Real ] s Ġis Ġmalformed Ġor Ċ Ġ* Ġincomplete ), Ġbut Ġthe Ġtype Ġof Ġ[ Real ] Ġthat 's Ġreturned Ġdepends Ġon Ġthe Ġconst it uent Ġ[ Real ] s Ġbeing Ċ Ġ* Ġsubtract ed . ĠFor Ġreference , Ġsee Ġ[ Real . plus ] Ġ( the Ġsame Ġtype Ġconversion Ġis Ġused ). Ċ Ġ*/ Ċ operator Ġfun ĠReal . minus ( rhs : ĠReal ): ĠReal Ġ{ ĊĠ Ġreturn Ġwhen Ġ( real Type Case ) Ġ{ ĊĠĠĠ ĠR ATION AL Ġ-> Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠ ĠR ATION AL Ġ-> Ġcreate Rational Real ( ration al Ġ- Ġrhs . ration al ) ĊĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( ration al . toDouble () Ġ- Ġrhs . ir ration al ) ĊĠĠĠĠĠ ĠINTEGER Ġ-> Ġcreate Rational Real ( ration al Ġ- Ġrhs . integer . to Whole Number Fraction ()) ĊĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠ Ġ} ĊĠĠĠ ĠI RR ATION AL Ġ-> Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠ ĠR ATION AL Ġ-> Ġcreate I rr ational Real ( ir ration al Ġ- Ġrhs . ration al . toDouble ()) ĊĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( ir ration al Ġ- Ġrhs . ir ration al ) ĊĠĠĠĠĠ ĠINTEGER Ġ-> Ġcreate I rr ational Real ( ir ration al Ġ- Ġrhs . integer ) ĊĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠ Ġ} ĊĠĠĠ ĠINTEGER Ġ-> Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠ ĠR ATION AL Ġ-> Ġcreate Rational Real ( integer . to Whole Number Fraction () Ġ- Ġrhs . ration al ) ĊĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( integer Ġ- Ġrhs . ir ration al ) ĊĠĠĠĠĠ ĠINTEGER Ġ-> Ġcreate Integer Real ( integer Ġ- Ġrhs . integer ) ĊĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠ Ġ} ĊĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ this .") ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠMultip lies Ġthis Ġ[ Real ] Ġwith Ġanother Ġand Ġreturns Ġthe Ġresult . Ċ Ġ* Ċ Ġ* ĠNeither Ġ[ Real ] Ġbeing Ġmultip lied Ġare Ġchanged Ġduring Ġthe Ġoperation . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġthis Ġfunction Ġwill Ġalways Ġsucceed Ġ( unless Ġone Ġof Ġthe Ġ[ Real ] s Ġis Ġmalformed Ġor Ċ Ġ* Ġincomplete ), Ġbut Ġthe Ġtype Ġof Ġ[ Real ] Ġthat 's Ġreturned Ġdepends Ġon Ġthe Ġconst it uent Ġ[ Real ] s Ġbeing Ċ Ġ* Ġmultip lied . ĠFor Ġreference , Ġsee Ġ[ Real . plus ] Ġ( the Ġsame Ġtype Ġconversion Ġis Ġused ). Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġeffective Ġdiv isions Ġby Ġzero Ġ( i . e . Ġfr actions Ġwith Ġzero Ġdenom in ators ) Ġmay Ġresult Ġin Ċ Ġ* Ġeither Ġan Ġinfinity Ġbeing Ġreturned Ġor Ġan Ġexception Ġbeing Ġthrown . Ċ Ġ*/ Ċ operator Ġfun ĠReal . times ( rhs : ĠReal ): ĠReal Ġ{ ĊĠ Ġreturn Ġwhen Ġ( real Type Case ) Ġ{ ĊĠĠĠ ĠR ATION AL Ġ-> Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠ ĠR ATION AL Ġ-> Ġcreate Rational Real ( ration al Ġ* Ġrhs . ration al ) ĊĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( ration al . toDouble () Ġ* Ġrhs . ir ration al ) ĊĠĠĠĠĠ ĠINTEGER Ġ-> Ġcreate Rational Real ( ration al Ġ* Ġrhs . integer . to Whole Number Fraction ()) ĊĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠ Ġ} ĊĠĠĠ ĠI RR ATION AL Ġ-> Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠ ĠR ATION AL Ġ-> Ġcreate I rr ational Real ( ir ration al Ġ* Ġrhs . ration al . toDouble ()) ĊĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( ir ration al Ġ* Ġrhs . ir ration al ) ĊĠĠĠĠĠ ĠINTEGER Ġ-> Ġcreate I rr ational Real ( ir ration al Ġ* Ġrhs . integer ) ĊĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠ Ġ} ĊĠĠĠ ĠINTEGER Ġ-> Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠ ĠR ATION AL Ġ-> Ġcreate Rational Real ( integer . to Whole Number Fraction () Ġ* Ġrhs . ration al ) ĊĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( integer Ġ* Ġrhs . ir ration al ) ĊĠĠĠĠĠ ĠINTEGER Ġ-> Ġcreate Integer Real ( integer Ġ* Ġrhs . integer ) ĊĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠ Ġ} ĊĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ this .") ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠDiv ides Ġthis Ġ[ Real ] Ġby Ġanother Ġand Ġreturns Ġthe Ġresult . Ċ Ġ* Ċ Ġ* ĠNeither Ġ[ Real ] Ġbeing Ġdivided Ġare Ġchanged Ġduring Ġthe Ġoperation . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġthis Ġfunction Ġwill Ġalways Ġsucceed Ġ( unless Ġone Ġof Ġthe Ġ[ Real ] s Ġis Ġmalformed Ġor Ċ Ġ* Ġincomplete ), Ġbut Ġthe Ġtype Ġof Ġ[ Real ] Ġthat 's Ġreturned Ġdepends Ġon Ġthe Ġconst it uent Ġ[ Real ] s Ġbeing Ċ Ġ* Ġdivided . ĠFor Ġreference , Ġsee Ġ[ Real . plus ] Ġfor Ġtype Ġconversion . ĠIt 's Ġthe Ġsame Ġfor Ġthis Ġmethod Ġexcept Ċ Ġ* Ġone Ġcase : Ġinteger Ġdivided Ġby Ġintegers . ĠIf Ġthe Ġdivision Ġis Ġperfect Ġ( e . g . Ġ 4 / 2 ), Ġan Ġinteger Ġwill Ġbe Ċ Ġ* Ġreturned . ĠOtherwise , Ġa Ġr ational Ġ[ Fraction ] Ġwill Ġbe Ġreturned . Ċ Ġ* Ċ Ġ* ĠNote Ġalso Ġthat Ġdiv isions Ġby Ġzero Ġmay Ġresult Ġin Ġeither Ġan Ġexception Ġbeing Ġthrown , Ġor Ġan Ġinfinity Ċ Ġ* Ġbeing Ġreturned . Ċ Ġ*/ Ċ operator Ġfun ĠReal . div ( rhs : ĠReal ): ĠReal Ġ{ ĊĠ Ġreturn Ġwhen Ġ( real Type Case ) Ġ{ ĊĠĠĠ ĠR ATION AL Ġ-> Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠ ĠR ATION AL Ġ-> Ġcreate Rational Real ( ration al Ġ/ Ġrhs . ration al ) ĊĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( ration al . toDouble () Ġ/ Ġrhs . ir ration al ) ĊĠĠĠĠĠ ĠINTEGER Ġ-> Ġcreate Rational Real ( ration al Ġ/ Ġrhs . integer . to Whole Number Fraction ()) ĊĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠ Ġ} ĊĠĠĠ ĠI RR ATION AL Ġ-> Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠ ĠR ATION AL Ġ-> Ġcreate I rr ational Real ( ir ration al Ġ/ Ġrhs . ration al . toDouble ()) ĊĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( ir ration al Ġ/ Ġrhs . ir ration al ) ĊĠĠĠĠĠ ĠINTEGER Ġ-> Ġcreate I rr ational Real ( ir ration al Ġ/ Ġrhs . integer ) ĊĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠ Ġ} ĊĠĠĠ ĠINTEGER Ġ-> Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠ ĠR ATION AL Ġ-> Ġcreate Rational Real ( integer . to Whole Number Fraction () Ġ/ Ġrhs . ration al ) ĊĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( integer Ġ/ Ġrhs . ir ration al ) ĊĠĠĠĠĠ ĠINTEGER Ġ-> Ġinteger . divide ( rhs . integer ) ĊĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠ Ġ} ĊĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ this .") ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠComputes Ġthe Ġpower Ġof Ġthis Ġ[ Real ] Ġraised Ġto Ġ[ rhs ] Ġand Ġreturns Ġthe Ġresult . Ċ Ġ* Ċ Ġ* ĠNeither Ġ[ Real ] Ġbeing Ġcombined Ġare Ġchanged Ġduring Ġthe Ġoperation . Ċ Ġ* Ċ Ġ* ĠAs Ġthis Ġis Ġan Ġin fix Ġfunction , Ġit Ġshould Ġbe Ġcalled Ġas Ġso Ġ( example ): Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġval Ġresult Ġ= Ġbase Real Ġpow Ġpower Real Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠThis Ġfunction Ġcan Ġfail Ġin Ġa Ġfew Ġcircumstances : Ċ Ġ* Ġ- ĠOne Ġof Ġthe Ġ[ Real ] s Ġis Ġmalformed Ġor Ġincomplete Ġ( such Ġas Ġa Ġdefault Ġinstance ). Ċ Ġ* Ġ- ĠIn Ġcases Ġwhere Ġa Ġroot Ġis Ġbeing Ġtaken Ġ( i . e . Ġwhen Ġ|[ rhs ]| Ġ< Ġ 1 ), Ġif Ġthe Ġroot Ġcannot Ġbe Ġtaken Ċ Ġ* ĠĠ Ġeither Ġnull Ġor ĠNaN Ġwill Ġbe Ġreturned Ġ( such Ġas Ġtrying Ġto Ġtake Ġthe Ġeven Ġroot Ġof Ġa Ġnegative Ġvalue ). Ċ Ġ* Ċ Ġ* ĠFurther , Ġnote Ġthat Ġthis Ġfunction Ġrepresents Ġthe Ġreal Ġvalue Ġroot Ġrather Ġthan Ġthe Ġprincipal Ġroot , Ċ Ġ* Ġso Ġnegative Ġbases Ġare Ġallowed Ġso Ġlong Ġas Ġthe Ġroot Ġbeing Ġused Ġis Ġodd . ĠFor Ġnon - integer like Ġpowers , Ċ Ġ* Ġthe Ġbase Ġshould Ġnever Ġbe Ġnegative Ġexcept Ġfor Ġfr actions Ġthat Ġcould Ġresult Ġin Ġa Ġpositive Ġbase Ġafter Ċ Ġ* Ġexponent iation . Ċ Ġ* Ċ Ġ* ĠThis Ġfunction Ġspecial Ġcases Ġ 0 ^ 0 Ġto Ġreturn Ġ 1 Ġin Ġall Ġcases Ġfor Ġconsistency Ġwith Ġthe Ġsystem Ġ`` pow `` Ċ Ġ* Ġfunction Ġand Ġother Ġlanguages , Ġper : Ġhttps :// stackoverflow . com / a / 1 9 9 5 5 9 9 6 . Ċ Ġ* Ċ Ġ* ĠFinally , Ġthis Ġfunction Ġalso Ġattempts Ġto Ġretain Ġmaximum Ġprecision Ġin Ġmuch Ġthe Ġsame Ġway Ġas Ġ[ sqrt ] Ċ Ġ* Ġand Ġ[ Real . plus ] Ġexcept Ġthere Ġare Ġmore Ġcases Ġwhen Ġa Ġvalue Ġmay Ġchange Ġtypes . ĠSee Ġthe Ġfollowing Ċ Ġ* Ġtable Ġfor Ġreference : Ċ Ġ* Ċ Ġ* Ġ| -------------------------------------------------------------------------------- -------------- | Ċ Ġ* Ġ| Ġpow ĠĠĠĠĠĠĠ Ġ| Ġpositive Ġint Ġ| Ġnegative Ġint Ġ| Ġroot able Ġr ational * Ġ| Ġother Ġr ation als Ġ| Ġir ration al Ġ| Ċ Ġ* Ġ| ------------ | -------------- | -------------- |---------------- ---- |---------------- -| ------------ | Ċ Ġ* Ġ| Ġinteger ĠĠĠ Ġ| Ġinteger ĠĠĠĠĠ Ġ| Ġr ational ĠĠĠĠ Ġ| Ġr ational ĠĠĠĠĠĠĠĠĠĠ Ġ| Ġir ration al ĠĠĠĠĠ Ġ| Ġir ration al Ġ| Ċ Ġ* Ġ| Ġr ational ĠĠ Ġ| Ġr ational ĠĠĠĠ Ġ| Ġr ational ĠĠĠĠ Ġ| Ġr ational ĠĠĠĠĠĠĠĠĠĠ Ġ| Ġir ration al ĠĠĠĠĠ Ġ| Ġir ration al Ġ| Ċ Ġ* Ġ| Ġir ration al Ġ| Ġir ration al ĠĠ Ġ| Ġir ration al ĠĠ Ġ| Ġir ration al ĠĠĠĠĠĠĠĠ Ġ| Ġir ration al ĠĠĠĠĠ Ġ| Ġir ration al Ġ| Ċ Ġ* Ġ| -------------------------------------------------------------------------------- -------------- | Ċ Ġ* Ċ Ġ* Ġ* This Ġcorresponds Ġto Ġfraction Ġpowers Ġwhose Ġdenominator Ġ( which Ġare Ġtreated Ġas Ġroots ) Ġcan Ġperform Ġa Ċ Ġ* Ġperfect Ġsquare Ġroot Ġof Ġeither Ġthe Ġinteger Ġbase Ġ( for Ġinteger Ġ[ Real ] s ) Ġor Ġboth Ġthe Ġnum erator Ġand Ċ Ġ* Ġdenominator Ġintegers Ġ( for Ġr ational Ġ[ Real ] s ). Ċ Ġ* Ċ Ġ* Ġ( Note Ġthat Ġthe Ġleft Ġcolumn Ġrepresents Ġthe Ġleft - hand Ġside Ġand Ġthe Ġtop Ġrow Ġrepresents Ġthe Ċ Ġ* Ġright - hand Ġside Ġof Ġthe Ġoperation ). Ċ Ġ*/ Ċ infix Ġfun ĠReal . pow ( rhs : ĠReal ): ĠReal ? Ġ{ ĊĠ Ġ// ĠPow ers Ġcan Ġreally Ġonly Ġbe Ġeffectively Ġdone Ġvia Ġfloats Ġor Ġwhole - number Ġonly Ġfr actions . ĊĠ Ġreturn Ġwhen Ġ( real Type Case ) Ġ{ ĊĠĠĠ ĠR ATION AL Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ// ĠLeft - hand Ġside Ġis ĠFraction . ĊĠĠĠĠĠ Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAny thing Ġraised Ġby Ġa Ġfraction Ġis Ġpow 'd Ġby Ġthe Ġnum erator Ġand Ġroot ed Ġby Ġthe Ġdenominator . ĊĠĠĠĠĠĠĠ ĠR ATION AL Ġ-> Ġrhs . ration al . to Impro per Form (). let Ġ{ Ġpower Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġ( ration al Ġpow Ġpower . num erator ). root ( power . denom inator , Ġpower . is Negative ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( ration al . toDouble (). pow ( rhs . ir ration al )) ĊĠĠĠĠĠĠĠ ĠINTEGER Ġ-> Ġcreate Rational Real ( ration al Ġpow Ġrhs . integer ) ĊĠĠĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠI RR ATION AL Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ// ĠLeft - hand Ġside Ġis Ġa Ġdouble . ĊĠĠĠĠĠ Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠĠĠ ĠR ATION AL Ġ-> Ġcreate I rr ational Real ( ir ration al . pow ( rhs . ration al . toDouble ())) ĊĠĠĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( ir ration al . pow ( rhs . ir ration al )) ĊĠĠĠĠĠĠĠ ĠINTEGER Ġ-> Ġcreate I rr ational Real ( ir ration al . pow ( rhs . integer )) ĊĠĠĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠINTEGER Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ// ĠLeft - hand Ġside Ġis Ġan Ġinteger . ĊĠĠĠĠĠ Ġwhen Ġ( rhs . real Type Case ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAn Ġinteger Ġraised Ġto Ġa Ġfraction Ġcan Ġuse Ġthe Ġsame Ġapproach Ġas Ġabove Ġ( fraction Ġraised Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġfraction ) Ġby Ġtre ating Ġthe Ġinteger Ġas Ġa Ġwhole Ġnumber Ġfraction . ĊĠĠĠĠĠĠĠ ĠR ATION AL Ġ-> Ġrhs . ration al . to Impro per Form (). let Ġ{ Ġpower Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġ( integer . to Whole Number Fraction () Ġpow Ġpower . num erator ). root ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpower . denom inator , Ġpower . is Negative ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( integer . toDouble (). pow ( rhs . ir ration al )) ĊĠĠĠĠĠĠĠ ĠINTEGER Ġ-> Ġinteger . pow ( rhs . integer ) ĊĠĠĠĠĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ rhs .") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ this .") ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġsquare Ġroot Ġof Ġthe Ġspecified Ġ[ Real ]. Ċ Ġ* Ċ Ġ* Ġ[ real ] Ġis Ġnot Ġchanged Ġas Ġa Ġresult Ġof Ġthis Ġoperation Ġ( a Ġnew Ġ[ Real ] Ġvalue Ġis Ġreturned ). Ċ Ġ* Ċ Ġ* ĠFailure Ġcases : Ċ Ġ* Ġ- ĠAn Ġinvalid Ġ[ Real ] Ġis Ġpassed Ġin Ġ( such Ġas Ġa Ġdefault Ġinstance ), Ġresulting Ġin Ġan Ġexception Ġbeing Ċ Ġ* ĠĠ Ġthrown . Ċ Ġ* Ġ- ĠA Ġnegative Ġvalue Ġis Ġpassed Ġin Ġ( this Ġwill Ġeither Ġresult Ġin Ġnull Ġor Ġa ĠNaN Ġbeing Ġreturned ). Ċ Ġ* Ċ Ġ* ĠSimilar Ġto Ġ[ Real . plus ] Ġ& Ġother Ġoperations , Ġthis Ġfunction Ġattempts Ġto Ġretain Ġas Ġmuch Ġprecision Ġas Ċ Ġ* Ġpossible Ġby Ġfirst Ġperforming Ġperfect Ġroots Ġbefore Ġneeding Ġto Ġperform Ġa Ġnumerical Ġapproximation . Ċ Ġ* ĠThis Ġis Ġachieved Ġby Ġattempting Ġto Ġtake Ġperfect Ġinteger Ġroots Ġfor Ġinteger Ġand Ġr ational Ġtypes Ġand , Ċ Ġ* Ġif Ġthat 's Ġnot Ġpossible , Ġthen Ġconverting Ġto Ġa Ġdouble . ĠSee Ġthe Ġfollowing Ġconversion Ġtable Ġfor Ċ Ġ* Ġreference : Ċ Ġ* Ċ Ġ* Ġ| ------------------------------------------------ | Ċ Ġ* Ġ| Ġsqrt ĠĠĠĠĠĠ Ġ| Ġperfect Ġsquare Ġ| Ġall Ġother Ġvalues Ġ| Ċ Ġ* Ġ| ------------ |---------------- |---------------- -- | Ċ Ġ* Ġ| Ġinteger ĠĠĠ Ġ| Ġinteger ĠĠĠĠĠĠĠ Ġ| Ġir ration al ĠĠĠĠĠĠ Ġ| Ċ Ġ* Ġ| Ġr ational ĠĠ Ġ| Ġr ational ĠĠĠĠĠĠ Ġ| Ġir ration al ĠĠĠĠĠĠ Ġ| Ċ Ġ* Ġ| Ġir ration al Ġ| Ġir ration al ĠĠĠĠ Ġ| Ġir ration al ĠĠĠĠĠĠ Ġ| Ċ Ġ* Ġ| ------------------------------------------------ | Ċ Ġ*/ Ċ fun Ġsqrt ( real : ĠReal ): ĠReal ? Ġ{ ĊĠ Ġreturn Ġwhen Ġ( real . real Type Case ) Ġ{ ĊĠĠĠ ĠR ATION AL Ġ-> Ġreal . ration al . root ( base Ġ= Ġ 2 , Ġinvert Ġ= Ġfalse ) ĊĠĠĠ ĠI RR ATION AL Ġ-> Ġcreate I rr ational Real ( kotlin . math . sqrt ( real . ir ration al )) ĊĠĠĠ ĠINTEGER Ġ-> Ġroot ( real . integer , Ġbase Ġ= Ġ 2 ) ĊĠĠĠ ĠREAL TYPE _ NOT _ SET , Ġnull Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġreal : Ġ$ real .") ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġan Ġabsolute Ġvalue Ġof Ġthis Ġ[ Real ] Ġ( that Ġis , Ġa Ġnon - negative Ġ[ Real ]). Ċ Ġ* Ċ Ġ* Ġ[ is Negative ] Ġis Ġguaranteed Ġto Ġreturn Ġfalse Ġfor Ġthe Ġreturned Ġvalue . Ċ Ġ*/ Ċ fun Ġabs ( real : ĠReal ): ĠReal Ġ= Ġif Ġ( real . is Negative ()) Ġ- real Ġelse Ġreal Ċ Ċ private Ġfun ĠInt . divide ( rhs : ĠInt ): ĠReal Ġ= ĠReal . newBuilder (). apply Ġ{ ĊĠ Ġ// ĠIf Ġrhs Ġdiv ides Ġthis Ġinteger , Ġretain Ġthe Ġinteger . ĊĠ Ġval Ġlhs Ġ= Ġthis @ divide ĊĠ Ġif Ġ(( lhs Ġ% Ġrhs ) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠ Ġinteger Ġ= Ġlhs Ġ/ Ġrhs ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġ// ĠOtherwise , Ġkeep Ġprecision Ġby Ġturning Ġthe Ġdivision Ġinto Ġa Ġfraction . ĊĠĠĠ Ġr ational Ġ= ĠFraction . newBuilder (). apply Ġ{ ĊĠĠĠĠĠ Ġis Negative Ġ= Ġ( lhs Ġ< Ġ 0 ) Ġxor Ġ( rhs Ġ< Ġ 0 ) ĊĠĠĠĠĠ Ġnum erator Ġ= Ġkotlin . math . abs ( lhs ) ĊĠĠĠĠĠ Ġdenominator Ġ= Ġkotlin . math . abs ( rhs ) ĊĠĠĠ Ġ}. build (). to Pro per Form () ĊĠ Ġ} Ċ }. build () Ċ Ċ private Ġfun ĠInt . pow ( exp : ĠInt ): ĠReal Ġ{ ĊĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠ Ġexp Ġ== Ġ 0 Ġ-> ĠReal . newBuilder (). apply Ġ{ Ġinteger Ġ= Ġ 1 Ġ}. build () ĊĠĠĠ Ġexp Ġ== Ġ 1 Ġ-> ĠReal . newBuilder (). apply Ġ{ Ġinteger Ġ= Ġthis @ pow Ġ}. build () ĊĠĠĠ Ġexp Ġ< Ġ 0 Ġ-> ĠReal . newBuilder (). apply Ġ{ Ġr ational Ġ= Ġto Whole Number Fraction () Ġpow Ġexp Ġ}. build () ĊĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ// Ġexp Ġ> Ġ 1 ĊĠĠĠĠĠ Ġvar Ġcomputed Ġ= Ġthis ĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġexp Ġ- Ġ 1 ) Ġcomputed Ġ*= Ġthis ĊĠĠĠĠĠ ĠReal . newBuilder (). apply Ġ{ Ġinteger Ġ= Ġcomputed Ġ}. build () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠFraction . root ( base : ĠInt , Ġinvert : ĠBoolean ): ĠReal ? Ġ{ ĊĠ Ġcheck ( base Ġ> Ġ 0 ) Ġ{ Ġ" Expected Ġbase Ġof Ġ 1 Ġor Ġhigher , Ġnot : Ġ$ base " Ġ} ĊĊĠ Ġval Ġadjusted Fraction Ġ= Ġto Impro per Form () ĊĠ Ġval Ġadjusted Num Ġ= ĊĠĠĠ Ġif Ġ( adjusted Fraction . is Negative ) Ġ- adjusted Fraction . num erator Ġelse Ġadjusted Fraction . num erator ĊĠ Ġval Ġadjusted Denom Ġ= Ġadjusted Fraction . denom inator ĊĠ Ġval Ġroot ed Num erator Ġ= Ġif Ġ( invert ) Ġroot ( adjusted Denom , Ġbase ) Ġelse Ġroot ( adjusted Num , Ġbase ) ĊĠ Ġval Ġroot ed Denom inator Ġ= Ġif Ġ( invert ) Ġroot ( adjusted Num , Ġbase ) Ġelse Ġroot ( adjusted Denom , Ġbase ) ĊĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠ Ġroot ed Num erator Ġ== Ġnull Ġ|| Ġroot ed Denom inator Ġ== Ġnull Ġ-> Ġnull ĊĠĠĠ Ġroot ed Num erator . is Integer () Ġ&& Ġroot ed Denom inator . is Integer () Ġ-> Ġ{ ĊĠĠĠĠĠ ĠReal . newBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġr ational Ġ= ĠFraction . newBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis Negative Ġ= Ġroot ed Num erator . is Negative () Ġ|| Ġroot ed Denom inator . is Negative () ĊĠĠĠĠĠĠĠĠĠ Ġnum erator Ġ= Ġroot ed Num erator . integer . absolute Value ĊĠĠĠĠĠĠĠĠĠ Ġdenominator Ġ= Ġroot ed Denom inator . integer . absolute Value ĊĠĠĠĠĠĠĠ Ġ}. build (). to Pro per Form () ĊĠĠĠĠĠ Ġ}. build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ// ĠOne Ġor Ġboth Ġof Ġthe Ġcomponents Ġof Ġthe Ġfraction Ġcan 't Ġbe Ġroot ed , Ġso Ġcompute Ġan Ġir ration al ĊĠĠĠĠĠ Ġ// Ġversion . ĊĠĠĠĠĠ ĠReal . newBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġir ration al Ġ= Ġroot ed Num erator . toDouble () Ġ/ Ġroot ed Denom inator . toDouble () ĊĠĠĠĠĠ Ġ}. build () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġroot ( int : ĠInt , Ġbase : ĠInt ): ĠReal ? Ġ{ ĊĠ Ġ// ĠFirst , Ġcheck Ġif Ġthe Ġinteger Ġis Ġa Ġroot . ĠBase Ġreference Ġfor Ġpossible Ġmethods : ĊĠ Ġ// Ġhttps :// www . research gate . net / post / How - to - dec ide - if - a - given - number - will - have - integer - square - root - or - not . ĊĠ Ġif Ġ( int Ġ== Ġ 0 Ġ&& Ġbase Ġ== Ġ 0 ) Ġ{ ĊĠĠĠ Ġ// ĠThis Ġis Ġconsidered Ġa Ġconvention al Ġidentity Ġper Ġhttps :// stackoverflow . com / a / 1 9 9 5 5 9 9 6 Ġthat ĊĠĠĠ Ġ// Ġdoesn 't Ġmatch Ġmathematic s Ġdefinitions Ġ( but Ġit Ġdoes Ġbring Ġparity Ġwith Ġthe Ġsystem 's Ġpow () ĊĠĠĠ Ġ// Ġfunction ). ĊĠĠĠ Ġreturn ĠReal . newBuilder (). apply Ġ{ ĊĠĠĠĠĠ Ġinteger Ġ= Ġ 1 ĊĠĠĠ Ġ}. build () ĊĠ Ġ} ĊĊĠ Ġcheck ( base Ġ> Ġ 0 ) Ġ{ Ġ" Expected Ġbase Ġof Ġ 1 Ġor Ġhigher , Ġnot : Ġ$ base " Ġ} ĊĠ Ġif Ġ( int Ġ< Ġ 0 Ġ&& Ġ! base . is Odd ()) Ġreturn Ġnull ĊĊĠ Ġwhen Ġ{ ĊĠĠĠ Ġint Ġ== Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ// Ġ 0 ^ x Ġis Ġalways Ġzero . ĊĠĠĠĠĠ Ġreturn ĠReal . newBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġinteger Ġ= Ġ 0 ĊĠĠĠĠĠ Ġ}. build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġint Ġ== Ġ 1 Ġ|| Ġint Ġ== Ġ 0 Ġ|| Ġbase Ġ== Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ// Ġ 1 ^ x Ġand Ġx ^ 0 Ġare Ġalways Ġ 1 . ĊĠĠĠĠĠ Ġreturn ĠReal . newBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġinteger Ġ= Ġ 1 ĊĠĠĠĠĠ Ġ}. build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġbase Ġ== Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠ Ġ// Ġx ^ 1 Ġis Ġalways Ġx . ĊĠĠĠĠĠ Ġreturn ĠReal . newBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġinteger Ġ= Ġint ĊĠĠĠĠĠ Ġ}. build () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġrad ic and Ġ= Ġint . absolute Value ĊĠ Ġvar Ġpotential Root Ġ= Ġ 1 ĊĠ Ġwhile Ġ( potential Root . pow ( base ). integer Ġ< Ġrad ic and ) Ġ{ ĊĠĠĠ Ġpotential Root ++ ĊĠ Ġ} ĊĠ Ġif Ġ( potential Root . pow ( base ). integer Ġ== Ġrad ic and ) Ġ{ ĊĠĠĠ Ġ// ĠThere 's Ġan Ġexact Ġinteger Ġrepresentation Ġof Ġthe Ġroot . ĊĠĠĠ Ġif Ġ( int Ġ< Ġ 0 Ġ&& Ġbase . is Odd ()) Ġ{ ĊĠĠĠĠĠ Ġ// ĠO dd Ġroots Ġof Ġnegative Ġnumbers Ġretain Ġthe Ġnegative . ĊĠĠĠĠĠ Ġpotential Root Ġ= Ġ- potential Root ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠReal . newBuilder (). apply Ġ{ ĊĠĠĠĠĠ Ġinteger Ġ= Ġpotential Root ĊĠĠĠ Ġ}. build () ĊĠ Ġ} ĊĊĠ Ġ// ĠOtherwise , Ġcompute Ġthe Ġir ration al Ġsquare Ġroot . ĊĠ Ġreturn ĠReal . newBuilder (). apply Ġ{ ĊĠĠĠ Ġir ration al Ġ= Ġif Ġ( base Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠ Ġkotlin . math . sqrt ( int . toDouble ()) ĊĠĠĠ Ġ} Ġelse Ġint . toDouble (). pow ( 1 . 0 Ġ/ Ġbase . toDouble ()) ĊĠ Ġ}. build () Ċ } Ċ Ċ private Ġfun ĠInt . is Odd () Ġ= Ġthis Ġ% Ġ 2 Ġ== Ġ 1 Ċ Ċ private Ġfun Ġcreate Rational Real ( value : ĠFraction ): ĠReal Ġ= ĠReal . newBuilder (). apply Ġ{ ĊĠ Ġr ational Ġ= Ġvalue Ċ }. build () Ċ Ċ private Ġfun Ġcreate I rr ational Real ( value : ĠDouble ): ĠReal Ġ= ĠReal . newBuilder (). apply Ġ{ ĊĠ Ġir ration al Ġ= Ġvalue Ċ }. build () Ċ Ċ private Ġfun Ġcreate Integer Real ( value : ĠInt ): ĠReal Ġ= ĠReal . newBuilder (). apply Ġ{ ĊĠ Ġinteger Ġ= Ġvalue Ċ }. build () Ċ