mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This finishes up revisions to SE-0003 - only var function parameters are disallowed for Swift 3.
80 lines
1.9 KiB
Swift
80 lines
1.9 KiB
Swift
// RUN: %target-run-simple-swift
|
|
// REQUIRES: executable_test
|
|
//
|
|
// vU1024Divide() is only available on OS X.
|
|
// REQUIRES: OS=macosx
|
|
|
|
import Accelerate
|
|
|
|
extension vU1024: IntegerLiteralConvertible, CustomStringConvertible, Equatable {
|
|
public init(integerLiteral: Int) {
|
|
var integerLiteral = integerLiteral
|
|
self.init()
|
|
memcpy(&self, &integerLiteral, sizeof(Int.self))
|
|
}
|
|
|
|
init(_ int: Int) {
|
|
self.init(integerLiteral: int)
|
|
}
|
|
|
|
public var description: String {
|
|
if self == 0 {
|
|
return "0"
|
|
}
|
|
var digits: [Character] = []
|
|
var intermediate = self
|
|
var digit: vU1024 = 0
|
|
repeat {
|
|
(intermediate, digit) = quorem(intermediate, 10)
|
|
digits.append(Character(UnicodeScalar(Int(digit) + 48)))
|
|
} while intermediate != 0
|
|
return String(digits.reversed())
|
|
}
|
|
}
|
|
|
|
extension Int {
|
|
init(_ u1024: vU1024) {
|
|
var u1024 = u1024
|
|
// NB: Doesn't overflow check
|
|
self.init()
|
|
memcpy(&self, &u1024, sizeof(Int.self))
|
|
}
|
|
}
|
|
|
|
func *(x: vU1024, y: vU1024) -> vU1024 {
|
|
var x = x
|
|
var y = y
|
|
var result = vU1024()
|
|
vU1024HalfMultiply(&x, &y, &result)
|
|
return result
|
|
}
|
|
|
|
func quorem(x: vU1024, _ y: vU1024) -> (vU1024, vU1024) {
|
|
var x = x
|
|
var y = y
|
|
var quo = vU1024()
|
|
var rem = vU1024()
|
|
vU1024Divide(&x, &y, &quo, &rem)
|
|
return (quo, rem)
|
|
}
|
|
|
|
public func ==(x: vU1024, y: vU1024) -> Bool {
|
|
var x = x
|
|
var y = y
|
|
return memcmp(&x, &y, sizeof(vU1024.self)) == 0
|
|
}
|
|
|
|
func factorial(x: Int) -> vU1024 {
|
|
var result: vU1024 = 1
|
|
|
|
for i in 1...x {
|
|
result = result * vU1024(i)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// CHECK: 7257415615307998967396728211129263114716991681296451376543577798900561843401706157852350749242617459511490991237838520776666022565442753025328900773207510902400430280058295603966612599658257104398558294257568966313439612262571094946806711205568880457193340212661452800000000000000000000000000000000000000000
|
|
print(factorial(170))
|
|
|