2014-08-27 14 views
22

Gibt es in Swift eine Entsprechung zu Javas BigInteger-Klasse? Ich bin dabei, große Berechnungen in Swift mit positiven ganzen Zahlen durchzuführen, die größer sind als die maximale Anzahl von UInt64. Was ist der beste Weg, um mit diesen Zahlen umzugehen?BigInteger entspricht in Swift?

+1

Dezimaltypen sind in der Regel für die finanzielle Berechnung, nicht nur willkürliche Präzision. In Java möchten Sie BigInteger, wie Ihr Titel angibt, nicht BigDecimal, wie Ihr Fragenkörper anzeigt. Cocoa enthält keinen BigInteger-Typ. – bames53

Antwort

8

Sie können die Klasse NSDecimalNumber von Cocoa verwenden. Es ist keine unendliche Genauigkeit, aber es kann 38 Dezimalziffern der Genauigkeit darstellen, die für das, was Sie brauchen, ausreichen können.

+0

Ist das eine andere Präzision als 'Double'? – nhgrif

+0

float32 hat über SD 7, float 64 sd 16, float80 sd34 –

5

Ich schrieb eine Bibliothek, mit der Sie mit großen Zahlen in Swift arbeiten können. In ähnlicher Weise wie Java's BigInteger. Es gibt auch Bedienerüberlastungen, um die Arbeit bequemer zu machen. Beispiel:

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

https://github.com/kirsteins/BigInteger

+1

Funktioniert das auch auf iOS für arm64? Gibt es auch Schritte, wie Sie dies in das irgendwo aufgeführte iOS-Projekt einbinden können? –

+1

Ja, es funktioniert auf arm64. Hier finden Sie eine gute Anleitung zum Hinzufügen der Framework-Abhängigkeit https://github.com/stephencelis/SQLite.swift#installation. Sie können dieses Handbuch mit BigInteger verwenden. – Kirsteins

+0

Danke, ich versuche die von Ihnen vorgeschlagenen Schritte zu befolgen, aber ich kann sie nach dem Hinzufügen nicht in meinen Code importieren. Kannst du ein Video aufnehmen oder die Schritte mit Screenshots auflisten? –

8

Ich arbeite auch an einer bignumber Bibliothek, mit der Sie einige großen Anzahl Berechnungen zu tun. Tatsächlich basiert die Bibliothek auf der GNU Multiple Precision (GMP) Bibliothek und ich habe einen Objective-C/Swift Wrapper geschrieben. Gegenwärtig ist eine große Integer-Mathematik, einschließlich einer großen Überlastung der Operatoren, möglich. Ein Codebeispiel geht so:

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())") 

die Ergebnisse:

Multiply 2 BigInts: bi1 * bi2 = 153933852140173822960829726365674325601913839520 

Sie die Bibliothek finden: https://github.com/githotto/osxgmp

+0

Kann es in Apps verwendet werden, die an Appstore gesendet wurden? Ich schätze es kann wegen Lizenzbeschränkungen nicht sein. – Kirsteins

+0

Ich bin kein Experte in GNU- und AppStore-Lizenz/Einschränkungen, aber IMHO, solange Sie die enthaltenen Referenzen intakt halten, so dass die ursprünglichen Autoren identifiziert werden können, sollte es kein Problem sein. Übrigens freue ich mich zu hören, dass Ihnen die Bibliothek nützlich ist! Vielleicht können Sie mit uns teilen, für welche Zwecke es verwendet wird ?! –

+1

Normalerweise werden die GPLs so interpretiert, dass jede Software, die sie enthält (kompiliert oder verlinkt), ebenfalls GPL-basiert sein muss. Für meine Firma ist das kein Weg, irgendeinen GPL Code zu verwenden. Dies ist auch die Meinung unserer Anwälte. – vikingosegundo

5

Ich habe eine große ganze Zahl und große doppelte Ausführung für eine rasche geschrieben, Das erfordert keine zusätzliche Bibliothek. Kopieren Sie es einfach in Ihr Projekt. Es unterstützt ganze Zahlen (BInt) und Brüche (BDouble) mit den meisten gängigen mathematischen Operatoren wie Addition, Subtraktion, Multiplikation, Potenzierung, Modul und Division. Einige optimierte mathematische Funktionen wie Fakultät oder gcd sind ebenfalls implementiert.

Hier sind einige Code-Beispiele:

// 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" 

Sie können es frei nutzen, ohne mich zu geben Kredit, und bitte beitragen, wenn Sie wollen.

Sie können es hier finden: https://github.com/mkrd/Swift-Big-Integer

+0

Gute Arbeit! Vielen Dank. –

+0

kann es Daten (NSData) zu BigInt konvertieren? –

4

Hier ist es.

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

Eigentlich ist BigInt nur ein Teil davon. Zusätzlich Sie BigInt erhalten:

  • generic Rational, die als Zähler und Nenner
  • generic Komplexe, die entweder ganze Zahlen nimmt (Gaußschen ganzen Zahlen) oder reelle Zahl Typen nicht nur doppelt und Schwimmer, sondern auch Rational Int8 zu BigInt nimmt bilden .
  • Rein schnell. Läuft nicht nur unter OS X, iOS und tvOS, sondern auch unter Linux. Funktioniert glücklich in Playground.

Aber das Beste von allem, es ist protokollorientiert, so dass Sie ganze Zahl wie verlängern kann: einen Prototyp BigInt in der offiziellen Swift

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) 

Dan the Number Generator

+0

kann es Daten (NSData) zu BigInt konvertieren? –