<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">For anybody who is interested:&nbsp;<a href="https://gist.github.com/hooman/6e08c48e1e06ee19e06e5b09f664f9be" class="">This gist</a>&nbsp;contains a Rational number implementation for Swift 3.0. It is a single file that you can paste in a playground and take a look, or remove the last few lines and drop the file into your own module. The recommended way to create a rational number is specifying Rational type as in:<div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(79, 129, 135);" class=""><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">let</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> r: </span><span style="font-variant-ligatures: no-common-ligatures" class="">Rational</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> = </span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">18</span><span style="font-variant-ligatures: no-common-ligatures; color: #31595d" class="">/</span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">64</span></div><div style="margin: 0px; line-height: normal; color: rgb(0, 132, 0);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">// or</span></div><div style="margin: 0px; line-height: normal; color: rgb(0, 0, 0);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">let</span><span style="font-variant-ligatures: no-common-ligatures" class=""> x = </span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">5</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #31595d" class="">+</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">2</span><span style="font-variant-ligatures: no-common-ligatures; color: #31595d" class="">/</span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">3</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">as</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #4f8187" class="">Rational</span></div><div class=""><span style="font-variant-ligatures: no-common-ligatures; color: #4f8187" class=""><br class=""></span></div></div></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(79, 129, 135);" class=""><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px;" class="">or use tolerance operator `</span><span style="color: rgb(49, 89, 93);" class="">±</span><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px;" class="">` to convert from floating point:</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(79, 129, 135);" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class=""><div style="margin: 0px; line-height: normal;" class=""><div style="color: rgb(39, 42, 216); font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">let</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> r2 = </span><span style="font-variant-ligatures: no-common-ligatures" class="">2.109</span><span style="font-variant-ligatures: no-common-ligatures; color: #31595d" class="">±</span><span style="font-variant-ligatures: no-common-ligatures" class="">0.0005</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #008400" class="">// 2</span><span style="line-height: normal; font-family: Monaco; font-variant-ligatures: no-common-ligatures; color: rgb(0, 132, 0);" class="">⁷</span><span style="font-variant-ligatures: no-common-ligatures; color: #008400" class="">⁄</span><span style="line-height: normal; font-family: Monaco; font-variant-ligatures: no-common-ligatures; color: rgb(0, 132, 0);" class="">₆₄</span></div><div style="color: rgb(39, 42, 216); font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class=""><span style="line-height: normal; font-family: Monaco; font-variant-ligatures: no-common-ligatures; color: rgb(0, 132, 0);" class=""><br class=""></span></div><div style="margin: 0px; line-height: normal;" class=""><span style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px;" class="">Rational type conforms to</span>&nbsp;AbsoluteValuable (hence Equatable, Comparable,&nbsp;ExpressibleByIntegerLiteral,&nbsp;SignedNumber), Strideable, and CustomStringConvertible.</div><div style="margin: 0px; line-height: normal;" class=""><br class=""></div>It always uses fully-reduced representation for simplicity and clarity of comparisons and uses LCM&nbsp;(lowest common multiple) for addition &amp; subtraction to reduce the chance of overflow in the middle&nbsp;of computations. The disadvantage of these design choices are: It is not guaranteed to keep the nominator&nbsp;and denominator as specified during construction, and GCD / LCM computations reduce its performance.&nbsp;</div><div style="margin: 0px; line-height: normal;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">The performance trade-off is not huge and is usually acceptable for typical rational number use cases.&nbsp;Preserving denominator can be addressed with a number formatter for rational numbers that I will&nbsp;add later. GCD is computed with&nbsp;Stein's algorithm (binary GCD algorithm).</div><div style="margin: 0px; line-height: normal;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">Hooman</div><div style="margin: 0px; line-height: normal;" class=""><br class=""><div style="margin: 0px; line-height: normal;" class="">&nbsp;</div></div></div></body></html>