Added `sq` & `sqInPlace` to ‘Arithmetic.swift’
This commit is contained in:
parent
e4c37fb282
commit
1a198b0396
|
@ -700,6 +700,36 @@ func powInPlace<X: UnsafeMutableMemoryAccessible>(_ lhs: inout X, _ rhs: Double)
|
||||||
return powInPlace(&lhs, rhs)
|
return powInPlace(&lhs, rhs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//// MARK: - Square
|
||||||
|
|
||||||
|
public func sq<L: UnsafeMemoryAccessible>(_ lhs: L) -> [Float] where L.Element == Float {
|
||||||
|
var results = Array(lhs)
|
||||||
|
sqInPlace(&results)
|
||||||
|
return results
|
||||||
|
}
|
||||||
|
|
||||||
|
public func sq<L: UnsafeMemoryAccessible>(_ lhs: L) -> [Double] where L.Element == Double {
|
||||||
|
var results = Array(lhs)
|
||||||
|
sqInPlace(&results)
|
||||||
|
return results
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Square: In Place
|
||||||
|
|
||||||
|
func sqInPlace<L: UnsafeMutableMemoryAccessible>(_ lhs: inout L) where L.Element == Float {
|
||||||
|
let elementCount: vDSP_Length = numericCast(lhs.count)
|
||||||
|
withUnsafeMutableMemory(&lhs) { lm in
|
||||||
|
vDSP_vsq(lm.pointer, numericCast(lm.stride), lm.pointer, numericCast(lm.stride), elementCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func sqInPlace<L: UnsafeMutableMemoryAccessible>(_ lhs: inout L) where L.Element == Double {
|
||||||
|
let elementCount: vDSP_Length = numericCast(lhs.count)
|
||||||
|
withUnsafeMutableMemory(&lhs) { lm in
|
||||||
|
vDSP_vsqD(lm.pointer, numericCast(lm.stride), lm.pointer, numericCast(lm.stride), elementCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Square Root
|
// MARK: - Square Root
|
||||||
|
|
||||||
/// Elemen-wise square root.
|
/// Elemen-wise square root.
|
||||||
|
|
|
@ -529,6 +529,38 @@ class ArithmeticTests: XCTestCase {
|
||||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Square
|
||||||
|
|
||||||
|
func test_sq_array_float() {
|
||||||
|
typealias Scalar = Float
|
||||||
|
|
||||||
|
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||||
|
|
||||||
|
var actual: [Scalar] = []
|
||||||
|
measure {
|
||||||
|
actual = Surge.sq(lhs)
|
||||||
|
}
|
||||||
|
|
||||||
|
let expected = lhs.map { pow($0, 2.0) }
|
||||||
|
|
||||||
|
XCTAssertEqual(actual, expected, accuracy: 1e-5)
|
||||||
|
}
|
||||||
|
|
||||||
|
func test_sq_array_double() {
|
||||||
|
typealias Scalar = Double
|
||||||
|
|
||||||
|
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||||
|
|
||||||
|
var actual: [Scalar] = []
|
||||||
|
measure {
|
||||||
|
actual = Surge.sq(lhs)
|
||||||
|
}
|
||||||
|
|
||||||
|
let expected = lhs.map { pow($0, 2.0) }
|
||||||
|
|
||||||
|
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Square Root
|
// MARK: - Square Root
|
||||||
|
|
||||||
func test_sqrt_array_array_float() {
|
func test_sqrt_array_array_float() {
|
||||||
|
|
Loading…
Reference in New Issue