Fraction

Arbitrary precision fraction in Swift.

Usage

Fraction can be converted from BinaryInteger, BinaryFloatingPoint or String.
It supports nearly all the methods and members that a BinaryFloatingPoint should have. But it is not binary as it uses Int10 as its numerator and denominator type.
Int10 is an arbitrary precision floating point created by the same author.

Example

Basic arithmetic.

let a: Fraction = 1/2
let b: Fraction = 3/2
print(pow(a, b)) //prints 7997214/22619537

Inverse trigonometric functions.

let a: Fraction = 1/2
print(artanh(a)) //prints 241031271779/438792236834

Precision

By default, Double is used to calculate in events like sqrt(_:). In these circumstances, precision will be lost, the result return is only an approximation. This is reasonable as it is impossible to find the exact result of, for example, sqrt(2).

Converting from String

print(Fraction("1/2")!) // 1/2
print(Fraction("0.5")!) // 1/2
print(Fraction("1")!)   // 1

Converting from BinaryFloatingPoint

If the length of decimal part the float is less or equal to 10 or it is a recruiting decimal, a precise fraction would be produced.

Otherwise, approximate x by

                   1
    d1 + ----------------------
                    1
       d2 + -------------------
                      1
          d3 + ----------------
                        1
             d4 + -------------
                         1
                d5 + ----------
                           1
                    d6 + ------
                             1
                       d7 + ---
                             d8

Install

Source code could be found in releases.
Please make sure you copy all three files of /Fraction/Fraction.swift, /Fraction/Int10.swift and /Fraction/Arithmetical.swift.

Speed

If you need the process to be fast while rarely encounter large values, it is suggested to change line 19 in Fraction.swift to typealias Integer = Int. After modifying a few things, Int is used to represent the numerator and denominator.

About Int10.

It is a structure of arbitrary-precise Signed Integer of radix 10.

let a = Int10("12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890")!
print(a) // prints 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890

let a = Int10("1000")!
print(a.factorial) // prints 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

GitHub

View Github