## BigNum

### main

Arbitrary-precision arithmetic for Swift, in Swift

# swift-bignum

Arbitrary-precision arithmetic for Swift, in Swift

## Synopsis

```import BigNum
BigRat.sqrt(2, precision:128)  // 240615969168004511545033772477625056927/170141183460469231731687303715884105728
BigFloat.exp(1, precision:128) // 2.718281828459045235360287471352662497759```

## Description

This module offers two flavors of Arbitrary-precision types that conforms to FloatingPoint.

• `BigRat` - Arbitrary-precision rational number.
• `BigFloat` - Arbitrary-precision floating point.

In addition to all arithmetic operations that FloatingPoint supports. Most of the functions in `<math.h>` are offered as static functions. As you see in the synopsis above, all arithmetic functions and operators that are lossy can take `precision:Int` as an optional argument. When omitted the value of `BigRat.precision` or `BigFloat.precision` is used (default:64).

```BigFloat.sqrt(2) // 1.41421356237309504876
BigFloat.precision = 128
BigFloat.sqrt(2) // 1.414213562373095048801688724209698078569```

`BigInt`, an arbitrary-precision interger type is internally used and re-exported so you don't have to `import BigInt` just for that. `BigInt` is also extended with `.over()` method so instead of constructing `BigRat` directly, you can:

`BigInt(3260954456333195553).over(BigInt(2305843009213693952)) // == BigRat.sqrt(2)`

## Usage

### Build

```\$ git clone https://github.com/dankogai/swift-bignum.git
\$ cd swift-bignum # the following assumes your \$PWD is here
\$ swift build```

### REPL

Simply

`\$ scripts/run-repl.sh`

or

```\$ swift run --repl
```

```Welcome to Apple Swift version 4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1). Type :help for assistance.
1> import BigNum
2> BigRat.sqrt(2, precision:128)
\$R0: BigNum.BigRat = {
num = {
magnitude = {
kind = array
storage = 2 values {
[0] = 6448461645324402335
[1] = 13043817825332782212
}
}
sign = plus
}
den = {
magnitude = {
kind = array
storage = 2 values {
[0] = 0
[1] = 9223372036854775808
}
}
sign = plus
}
}```

Simply add the package from Package Dependencies tab of the Project. Enter `https://github.com/dankogai/swift-bignum` in the search field and click `[Add Package]`

Now you are able to `import BigNum`.

Now all you have to do is build and enjoy!

If you enconter errors like `Missing required module '_NumericShims'`, try cleaning up your `~/Library/Developer/Xcode/DerivedData`.

Add the following to the `dependencies` section:

```.package(
url: "https://github.com/dankogai/swift-bignum.git", .branch("main")
)```

and the following to the `.target` argument:

```.target(
name: "YourSwiftyPackage",
dependencies: ["BigNum"])```

Now all you have to do is:

`import BigNum`

# Prerequisite

Swift 5 or better, OS X or Linux to build.

• Depends on attaswift/BigInt for internal representation of `BigFloat` and `BigRat`.
• Depends on apple/swift-numerics since version 5.1 for the `ElementaryFunctions` protocol.
• Prior versions depended on dankogai/swift-floatingpoint for the `FloatingPointMath` protocols but it is replaced by the `ElementaryFunctions`.

### Description

• Swift Tools 5.0.0

### Dependencies

Last updated: Mon Mar 13 2023 08:08:02 GMT-0500 (GMT-05:00)