2014-08-27 128 views
22

在Swift中是否有與Java的BigInteger類相當的功能?我正試圖在Swift中進行大於UInt64最大數量的正整數計算。處理這些數字的最佳方法是什麼?BigInteger在Swift中相當於?

+1

十進制類型通常用於財務計算,而不只是任意精度。在Java中,您希望BigInteger(正如您的標題所示)不像您的問題主體指示的那樣是BigDecimal。可可不包含任何BigInteger類型。 – bames53 2014-08-27 19:26:29

回答

8

您可以使用Cocoa的NSDecimalNumber類。它不是無限的精確度,但它可以表示38位十進制數字的精度,這可能足以滿足您的需求。

+0

這是不同的精度'雙'? – nhgrif 2016-04-09 18:38:03

+0

float32大約有sd 7,float 64 sd 16,float80 sd34 – 2016-11-18 22:05:50

5

我寫了一個庫,允許你在Swift中使用大整數。類似於Java的BigInteger。還有操作員過載使工作更方便。 例子:

let a = BigInteger("111111111111111111111111111111111111111111111110000000001")! 
let b = 999_999_999 
let c = a + b // 111111111111111111111111111111111111111111111111000000000 

https://github.com/kirsteins/BigInteger

+1

這對於arm64的iOS也適用嗎?還有任何關於如何將這個包含在某個地方列出的iOS項目中的步驟? – 2015-01-13 10:24:42

+1

是的,它適用於arm64。這裏有一個關於如何添加框架依賴性的好指南https://github.com/stephencelis/SQLite.swift#installation。您可以使用BigInteger的本指南。 – Kirsteins 2015-01-13 10:51:35

+0

謝謝,我試着按照你建議的步驟操作,但是我添加它後無法在代碼中導入它。你可以錄製視頻或列出截圖的步驟? – 2015-01-13 17:12:35

8

我工作,也對BigNumber庫,你可以做一些大的運算量。實際上,該庫基於GNU Multiple Precision(GMP)庫,並且我編寫了一個Objective-C/Swift包裝器。 目前大整數數學,包括大量的操作符重載,是可能的。 一個代碼示例是這樣:

var err : NSError? 
var bi1 = BigInt(nr: 12468642135797531) 
var bi2 = BigInt(nr: "12345678901011121314151617181920", error: &err) 
var res = bi1 * bi2 
println("Multiply 2 BigInts: bi1 * bi2 = \(res.toString())") 

導致:

Multiply 2 BigInts: bi1 * bi2 = 153933852140173822960829726365674325601913839520 

你可以找到在圖書館:https://github.com/githotto/osxgmp

+0

它可以在應用程序中用於提交到Appstore嗎?我想這是不能由於許可限制。 – Kirsteins 2015-01-12 11:17:44

+0

我不是GNU和AppStore許可證/限制的專家,但恕我直言,只要你保持包含的引用完好無損,這樣原作者就可以被識別出來,這應該不成問題。順便說一句,我很高興聽到圖書館對你有用!也許你可以與我們分享它的用途是什麼?! – 2015-01-13 22:02:07

5

我已經寫了迅速的一個大整數和大雙的實施,這不需要任何額外的庫。只需將其複製到您的項目中。它支持大多數常用數學運算符(如加法,減法,乘法,取冪,模數和除法)的整數(BInt)和分數(BDouble)。一些優化的數學函數,如階乘或gcd也被實現。

下面是一些代碼示例:

// Create a new number: 
let num = BInt(232) 
print(num) // prints "232" 

// You can also use Strings to create a number: 
let veryBig = BInt("-827846184963421874362418746238453267452971345218746328715380000000000") 

// Every standard math operator works well, even with normal Integers 
// Visit the github page for more informations 
let v0 = (BInt(5) + BInt(4)) - BInt(3) 
let v1 = veryBig * 1000 
let v2 = vergBig^num 
let v3 = (veryBig^50000)/(BInt(2)^900) + 1 
let v4 = gcd(abs(veryBig), num) 

// BDouble is very similar, you can find a detailed description on Github 
let fraction = BDouble("27", over: "31") 
print(fraction) // prints "27/31" 

您可以自由使用它沒有給我的信用,如果你想請貢獻。

你可以在這裏找到:https://github.com/mkrd/Swift-Big-Integer

+0

幹得好!謝謝。 – 2017-07-04 13:19:16

+0

它可以將Data(NSData)轉換爲BigInt嗎? – 2017-10-04 08:41:38

4

這。

https://github.com/dankogai/swift-pons

其實BigInt有隻是它的一部分。除了BIGINT你:

  • 通用理性是需要形成INT8爲bigint的分子和分母
  • 一般複雜,或者取整數(高斯整數)或實數類型不僅double和float,但也合理。
  • 純粹快捷。不僅運行在OS X,iOS和tvOS上,還運行在Linux上。在遊樂場愉快地工作。

但最重要的是,它是協議爲本這樣可以延長,比如全整數

import PONS 

func fib<T:POInteger>(n:T)->T { // with a little better algorithm 
    if n < T(2) { return n } 
    var (a, b) = (T(0), T(1)) 
    for _ in 2...n { 
     (a, b) = (b, a+b) 
    } 
    return b 
} 

let F11 = fib(11 as Int8) 
let F13 = fib(13 as UInt8) 
let F23 = fib(23 as Int16) 
let F24 = fib(24 as UInt16) 
let F46 = fib(46 as Int32) 
let F47 = fib(47 as UInt32) 
let F92 = fib(92 as Int64) 
let F93 = fib(93 as UInt64) 
let F666 = fib(666 as BigInt) 

丹數發生器

+0

它可以將Data(NSData)轉換爲BigInt嗎? – 2017-10-04 08:35:13

3

我發現了一個原型BigInt有在官方斯威夫特repository:​​

您可能可以將其複製到您的項目中並使用它。也許有一天它會被添加到標準庫中。