Changed use of `(0..<n).map { Scalar($0) }` to `(1…n).map { Scalar($0) }` avoiding divide-by-zero

This commit is contained in:
Vincent Esche 2019-09-23 16:36:22 +02:00
parent 9933ae5bcd
commit 8d748416da
1 changed files with 51 additions and 63 deletions

View File

@ -32,8 +32,8 @@ class ArithmeticTests: XCTestCase {
func test_add_array_array_float() {
typealias Scalar = Float
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let rhs: [Scalar] = (0..<n).map { Scalar($0 * 3) }
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: [Scalar] = []
measure {
@ -48,8 +48,8 @@ class ArithmeticTests: XCTestCase {
func test_add_array_array_double() {
typealias Scalar = Double
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let rhs: [Scalar] = (0..<n).map { Scalar($0 * 3) }
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: [Scalar] = []
measure {
@ -70,8 +70,8 @@ class ArithmeticTests: XCTestCase {
func test_sub_array_array_float() {
typealias Scalar = Float
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let rhs: [Scalar] = (0..<n).map { Scalar($0 * 3) }
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: [Scalar] = []
measure {
@ -86,8 +86,8 @@ class ArithmeticTests: XCTestCase {
func test_sub_array_array_double() {
typealias Scalar = Double
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let rhs: [Scalar] = (0..<n).map { Scalar($0 * 3) }
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: [Scalar] = []
measure {
@ -108,8 +108,8 @@ class ArithmeticTests: XCTestCase {
func test_mul_array_array_float() {
typealias Scalar = Float
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let rhs: [Scalar] = (0..<n).map { Scalar($0 / 1_000) }
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: [Scalar] = []
measure {
@ -124,8 +124,8 @@ class ArithmeticTests: XCTestCase {
func test_mul_array_array_double() {
typealias Scalar = Double
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let rhs: [Scalar] = (0..<n).map { Scalar($0 / 1_000) }
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: [Scalar] = []
measure {
@ -146,8 +146,8 @@ class ArithmeticTests: XCTestCase {
func test_div_array_array_float() {
typealias Scalar = Float
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let rhs: [Scalar] = (0..<n).map { Scalar($0 + 1) }
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: [Scalar] = []
measure {
@ -162,8 +162,8 @@ class ArithmeticTests: XCTestCase {
func test_div_array_array_double() {
typealias Scalar = Double
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let rhs: [Scalar] = (0..<n).map { Scalar($0 + 1) }
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: [Scalar] = []
measure {
@ -184,7 +184,7 @@ class ArithmeticTests: XCTestCase {
func test_mod_array_array_float() {
typealias Scalar = Float
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let lhs: [Scalar] = (1...n).map { Scalar($0) }
let rhs: [Scalar] = Array(repeating: 42, count: n)
var actual: [Scalar] = []
@ -200,7 +200,7 @@ class ArithmeticTests: XCTestCase {
func test_mod_array_array_double() {
typealias Scalar = Double
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let lhs: [Scalar] = (1...n).map { Scalar($0) }
let rhs: [Scalar] = Array(repeating: 42, count: n)
var actual: [Scalar] = []
@ -218,7 +218,7 @@ class ArithmeticTests: XCTestCase {
func test_remainder_array_array_float() {
typealias Scalar = Float
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let lhs: [Scalar] = (1...n).map { Scalar($0) }
let rhs: [Scalar] = Array(repeating: -42, count: n)
var actual: [Scalar] = []
@ -234,7 +234,7 @@ class ArithmeticTests: XCTestCase {
func test_remainder_array_array_double() {
typealias Scalar = Double
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let lhs: [Scalar] = (1...n).map { Scalar($0) }
let rhs: [Scalar] = Array(repeating: -42, count: n)
var actual: [Scalar] = []
@ -252,7 +252,7 @@ class ArithmeticTests: XCTestCase {
func test_sqrt_array_array_float() {
typealias Scalar = Float
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let lhs: [Scalar] = (1...n).map { Scalar($0) }
var actual: [Scalar] = []
measure {
@ -267,7 +267,7 @@ class ArithmeticTests: XCTestCase {
func test_sqrt_array_array_double() {
typealias Scalar = Double
let lhs: [Scalar] = (0..<n).map { Scalar($0) }
let lhs: [Scalar] = (1...n).map { Scalar($0) }
var actual: [Scalar] = []
measure {
@ -284,8 +284,8 @@ class ArithmeticTests: XCTestCase {
func test_dot_array_array_float() {
typealias Scalar = Float
let lhs: [Scalar] = Array(repeating: 0.25, count: n)
let rhs: [Scalar] = Array(repeating: 0.75, count: n)
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: Scalar = 0
measure {
@ -296,14 +296,14 @@ class ArithmeticTests: XCTestCase {
$0 + $1.0 * $1.1
}
XCTAssertEqual(actual, expected, accuracy: 1e-8)
XCTAssertEqual(actual, expected, accuracy: 1e-1)
}
func test_dot_array_array_double() {
typealias Scalar = Double
let lhs: [Scalar] = Array(repeating: 0.25, count: n)
let rhs: [Scalar] = Array(repeating: 0.75, count: n)
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: Scalar = 0
measure {
@ -319,46 +319,34 @@ class ArithmeticTests: XCTestCase {
// MARK: - Summation
func test_sum() {
let values = (0...n).map { _ in Double(arc4random()) / Double(UInt32.max) }
var actual = 0.0
func test_sum_array_double() {
typealias Scalar = Double
let values: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: Scalar = 0.0
measure {
actual = sum(values)
}
var expected = 0.0
for value in values {
expected += value
}
let expected: Scalar = values.reduce(0, +)
XCTAssertEqual(actual, expected, accuracy: 1e-8)
}
func test_sum_slice() {
let values = (0...n).map { _ in Double(arc4random()) / Double(UInt32.max) }
var actual = 0.0
func test_sum_array_float() {
typealias Scalar = Float
let values: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: Scalar = 0.0
measure {
actual = sum(values[0..<n / 2])
actual = sum(values)
}
var expected = 0.0
for value in values[0..<n / 2] {
expected += value
}
let expected: Scalar = values.reduce(0, +)
XCTAssertEqual(actual, expected, accuracy: 1e-8)
}
// MARK: - Square Root
func test_sqrt() {
let values = (0...n).map { _ in Double(arc4random()) }
measureAndValidateMappedFunctionWithAccuracy(source: values, member: sqrt, mapped: sqrt, accuracy: 1e-4)
}
func test_sqrt_empty() {
let values = [Double]()
XCTAssertEqual(sqrt(values), [])
XCTAssertEqual(actual, expected, accuracy: 1e-1)
}
// MARK: - Distance
@ -366,8 +354,8 @@ class ArithmeticTests: XCTestCase {
func test_dist_array_array_double() {
typealias Scalar = Double
let lhs: [Scalar] = Array(repeating: 0.25, count: n)
let rhs: [Scalar] = Array(repeating: 0.75, count: n)
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: Scalar = 0.0
measure {
@ -382,8 +370,8 @@ class ArithmeticTests: XCTestCase {
func test_dist_array_array_float() {
typealias Scalar = Float
let lhs: [Scalar] = Array(repeating: 0.25, count: n)
let rhs: [Scalar] = Array(repeating: 0.75, count: n)
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: Scalar = 0.0
measure {
@ -400,8 +388,8 @@ class ArithmeticTests: XCTestCase {
func test_distsq_array_array_double() {
typealias Scalar = Double
let lhs: [Scalar] = Array(repeating: 0.25, count: n)
let rhs: [Scalar] = Array(repeating: 0.75, count: n)
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: Scalar = 0.0
measure {
@ -416,8 +404,8 @@ class ArithmeticTests: XCTestCase {
func test_distsq_array_array_float() {
typealias Scalar = Float
let lhs: [Scalar] = Array(repeating: 0.25, count: n)
let rhs: [Scalar] = Array(repeating: 0.75, count: n)
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
var actual: Scalar = 0.0
measure {