package Ġcom . k yle cor ry . sol . math Ċ Ċ import Ġcom . k yle cor ry . sol . math . filters . Low Pass Filter Ċ import Ġcom . k yle cor ry . sol . math . filters . Moving Average Filter Ċ import Ġkotlin . math .* Ċ Ċ object ĠSol Math Ġ{ ĊĊĠĠĠ Ġfun Ġwrap ( value : ĠFloat , Ġmin : ĠFloat , Ġmax : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap ( value . toDouble (), Ġmin . toDouble (), Ġmax . toDouble ()). toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrap ( value : ĠDouble , Ġmin : ĠDouble , Ġmax : ĠDouble ): ĠDouble Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( min Ġ>= Ġmax ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġmax Ġ- Ġmin ĊĊĠĠĠĠĠĠĠ Ġvar ĠnewValue Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( newValue Ġ> Ġmax ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ-= Ġrange ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( newValue Ġ< Ġmin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ+= Ġrange ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠnewValue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpower ( x : ĠInt , Ġpower : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( x Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġabs ( power )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ*= Ġx ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( power Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtotal ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpower ( x : ĠDouble , Ġpower : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġabs ( power )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ*= Ġx ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( power Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 Ġ/ Ġtotal ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtotal ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComputes Ġa Ġpolynomial ĊĠĠĠĠ Ġ* ĠEx . Ġ 1 Ġ+ Ġ 2 x Ġ+ Ġ 5 x ^ 2 Ġ+ Ġx ^ 4 ĊĠĠĠĠ Ġ* Ġpolynomial ( x , Ġ 1 , Ġ 2 , Ġ 5 , Ġ 0 , Ġ 1 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpolynomial ( x : ĠDouble , Ġvar arg Ġcoef s : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġrunning Total Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcoef s . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Total Ġ+= Ġpower ( x , Ġi ) Ġ* Ġcoef s [ i ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrunning Total ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcube ( a : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġa Ġ* Ġa Ġ* Ġa ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsquare ( a : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġa Ġ* Ġa ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcube ( a : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġa Ġ* Ġa Ġ* Ġa ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsquare ( a : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġa Ġ* Ġa ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinterpolate ( ĊĠĠĠĠĠĠĠ Ġn : ĠDouble , ĊĠĠĠĠĠĠĠ Ġy 1 : ĠDouble , ĊĠĠĠĠĠĠĠ Ġy 2 : ĠDouble , ĊĠĠĠĠĠĠĠ Ġy 3 : ĠDouble ĊĠĠĠ Ġ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġy 2 Ġ- Ġy 1 ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġy 3 Ġ- Ġy 2 ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġb Ġ- Ġa ĊĊĠĠĠĠĠĠĠ Ġreturn Ġy 2 Ġ+ Ġ( n Ġ/ Ġ 2 . 0 ) Ġ* Ġ( a Ġ+ Ġb Ġ+ Ġn Ġ* Ġc ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsin Degrees ( angle : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsin ( angle . to Radians ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsin Degrees ( angle : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsin ( angle . to Radians ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtan Degrees ( angle : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtan ( angle . to Radians ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtan Degrees ( angle : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtan ( angle . to Radians ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcos Degrees ( angle : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcos ( angle . to Radians ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcos Degrees ( angle : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcos ( angle . to Radians ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠDouble . to Radians (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMath . to Radians ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠFloat . to Radians (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMath . to Radians ( this . toDouble ()). toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠFloat . to Degrees (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMath . to Degrees ( this . toDouble ()). toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠDouble . to Degrees (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMath . to Degrees ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelta Angle ( angle 1 : ĠFloat , Ġangle 2 : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdelta Ġ= Ġangle 2 Ġ- Ġangle 1 ĊĠĠĠĠĠĠĠ Ġdelta Ġ+= Ġ 1 8 0 ĊĠĠĠĠĠĠĠ Ġdelta Ġ-= Ġfloor ( delta Ġ/ Ġ 3 6 0 ) Ġ* Ġ 3 6 0 ĊĠĠĠĠĠĠĠ Ġdelta Ġ-= Ġ 1 8 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( abs ( abs ( delta ) Ġ- Ġ 1 8 0 ) Ġ<= ĠFloat . MIN _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Ġ= Ġ 1 8 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdelta ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclamp ( value : ĠDouble , Ġminimum : ĠDouble , Ġmaximum : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . coerce In ( minimum , Ġmaximum ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclamp ( value : ĠFloat , Ġminimum : ĠFloat , Ġmaximum : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . coerce In ( minimum , Ġmaximum ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠDouble . round Places ( places : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( this Ġ* Ġ 1 0 . 0 . pow ( places )). round ToInt () Ġ/ Ġ 1 0 . 0 . pow ( places ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠFloat . round Places ( places : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( this Ġ* Ġ 1 0 f . pow ( places )). round ToInt () Ġ/ Ġ 1 0 f . pow ( places ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsmooth ( data : ĠList < Float >, Ġsmoothing : ĠFloat Ġ= Ġ 0 . 5 f ): ĠList < Float > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠLow Pass Filter ( smoothing , Ġdata . first ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdata . map Indexed Ġ{ Ġindex , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter . filter ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmoving Average ( data : ĠList < Float >, Ġwindow : ĠInt Ġ= Ġ 5 ): ĠList < Float > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠMoving Average Filter ( window ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdata . map Ġ{ Ġfilter . filter ( it . toDouble ()). toFloat () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Out liers ( ĊĠĠĠĠĠĠĠ Ġmeasurements : ĠList < Double >, ĊĠĠĠĠĠĠĠ Ġthreshold : ĠDouble , ĊĠĠĠĠĠĠĠ Ġreplace With Average : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġreplace Last : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ): ĠList < Double > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( measure ments . size Ġ< Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmeasurements ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfiltered Ġ= Ġmutable ListOf ( measure ments . first ()) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġmeasurements . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbefore Ġ= Ġmeasurements [ i Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġmeasurements [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġafter Ġ= Ġmeasurements [ i Ġ+ Ġ 1 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġif Ġ( replace With Average ) Ġ( before Ġ+ Ġafter ) Ġ/ Ġ 2 Ġelse Ġfiltered . last () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ- Ġbefore Ġ> Ġthreshold Ġ&& Ġcurrent Ġ- Ġafter Ġ> Ġthreshold ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered . add ( last ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( current Ġ- Ġbefore Ġ< Ġ- threshold Ġ&& Ġcurrent Ġ- Ġafter Ġ< Ġ- threshold ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered . add ( last ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered . add ( current ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( replace Last Ġ&& Ġabs ( filtered . last () Ġ- Ġmeasurements . last ()) Ġ> Ġthreshold ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered . add ( filtered . last ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered . add ( measure ments . last ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfiltered ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġl erp ( percent : ĠFloat , Ġstart : ĠFloat , Ġend : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstart Ġ+ Ġ( end Ġ- Ġstart ) Ġ* Ġpercent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġl erp ( percent : ĠDouble , Ġstart : ĠDouble , Ġend : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstart Ġ+ Ġ( end Ġ- Ġstart ) Ġ* Ġpercent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmap ( ĊĠĠĠĠĠĠĠ Ġvalue : ĠDouble , ĊĠĠĠĠĠĠĠ Ġoriginal Min : ĠDouble , ĊĠĠĠĠĠĠĠ Ġoriginal Max : ĠDouble , ĊĠĠĠĠĠĠĠ Ġnew Min : ĠDouble , ĊĠĠĠĠĠĠĠ Ġnew Max : ĠDouble ĊĠĠĠ Ġ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnormal Ġ= Ġnorm ( value , Ġoriginal Min , Ġoriginal Max ) ĊĠĠĠĠĠĠĠ Ġreturn Ġl erp ( normal , Ġnew Min , Ġnew Max ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmap ( ĊĠĠĠĠĠĠĠ Ġvalue : ĠFloat , ĊĠĠĠĠĠĠĠ Ġoriginal Min : ĠFloat , ĊĠĠĠĠĠĠĠ Ġoriginal Max : ĠFloat , ĊĠĠĠĠĠĠĠ Ġnew Min : ĠFloat , ĊĠĠĠĠĠĠĠ Ġnew Max : ĠFloat ĊĠĠĠ Ġ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnormal Ġ= Ġnorm ( value , Ġoriginal Min , Ġoriginal Max ) ĊĠĠĠĠĠĠĠ Ġreturn Ġl erp ( normal , Ġnew Min , Ġnew Max ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnorm ( value : ĠDouble , Ġminimum : ĠDouble , Ġmaximum : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġmaximum Ġ- Ġminimum ĊĠĠĠĠĠĠĠ Ġif Ġ( range Ġ== Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( value Ġ- Ġminimum ) Ġ/ Ġrange ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnorm ( value : ĠFloat , Ġminimum : ĠFloat , Ġmaximum : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġmaximum Ġ- Ġminimum ĊĠĠĠĠĠĠĠ Ġif Ġ( range Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( value Ġ- Ġminimum ) Ġ/ Ġrange ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscale To Fit ( ĊĠĠĠĠĠĠĠ Ġwidth : ĠFloat , ĊĠĠĠĠĠĠĠ Ġheight : ĠFloat , ĊĠĠĠĠĠĠĠ ĠmaxWidth : ĠFloat , ĊĠĠĠĠĠĠĠ ĠmaxHeight : ĠFloat ĊĠĠĠ Ġ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmin ( maxWidth Ġ/ Ġwidth , ĠmaxHeight Ġ/ Ġheight ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnormalize Angle ( angle : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap ( angle , Ġ 0 f , Ġ 3 6 0 f ) Ġ% Ġ 3 6 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnormalize Angle ( angle : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap ( angle , Ġ 0 . 0 , Ġ 3 6 0 . 0 ) Ġ% Ġ 3 6 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠComparable < T >> Ġarg max ( values : ĠList < T >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( values . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġmax Index Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġvalues . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( values [ i ] Ġ> Ġvalues [ max Index ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Index Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmax Index ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Close To ( a : ĠDouble , Ġb : ĠDouble , Ġtolerance : ĠDouble ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( a Ġ- Ġb ). absolute Value Ġ<= Ġtolerance ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Close To ( a : ĠFloat , Ġb : ĠFloat , Ġtolerance : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( a Ġ- Ġb ). absolute Value Ġ<= Ġtolerance ĊĠĠĠ Ġ} Ċ Ċ }