Ответ 1
Вы можете использовать класс NSDecimalNumber
из Cocoa. Это не бесконечная точность, но она может представлять собой 38 десятичных цифр точности, которых может быть достаточно для того, что вам нужно.
Есть ли эквивалент класса Java BigInteger в Swift? Я связываю большие вычисления в Swift с положительными целыми числами, большими, чем максимальное число UInt64. Каков наилучший способ обработки этих чисел?
Вы можете использовать класс NSDecimalNumber
из Cocoa. Это не бесконечная точность, но она может представлять собой 38 десятичных цифр точности, которых может быть достаточно для того, что вам нужно.
Я также работаю над библиотекой 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
Я написал библиотеку, которая позволяет работать с большими целыми числами в Swift. Аналогично Java BigInteger. Существуют также перегрузки операторов, чтобы сделать работу более удобной. Пример:
let a = BigInteger("111111111111111111111111111111111111111111111110000000001")!
let b = 999_999_999
let c = a + b // 111111111111111111111111111111111111111111111111000000000
Я написал большую целую и большую двойную реализацию для быстрой, что не требует дополнительной библиотеки. Просто скопируйте его в свой проект. Он поддерживает целые числа (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
Вот он.
https://github.com/dankogai/swift-pons
На самом деле BigInt является лишь частью этого. В дополнение к BigInt вы получаете:
Но лучше всего, он ориентирован на протокол, поэтому вы можете расширить целое число, например:
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)
Дэн генератор чисел
Я нашел прототип BigInt в официальном репозитории Swift: https://github.com/apple/swift/blob/master/test/Prototypes/BigInt.swift
Возможно, вы можете просто скопировать его в свой проект и использовать его. Может быть, когда-нибудь он будет добавлен в стандартную библиотеку.