Skip to content

Commit 24939a5

Browse files
committed
Splitting pow's derivative test cases.
We now have 3 sections for the tests: negative base, 0 base and positive base.
1 parent dbc3396 commit 24939a5

File tree

1 file changed

+47
-22
lines changed

1 file changed

+47
-22
lines changed

test/AutoDiff/stdlib/tgmath_derivatives.swift.gyb

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -141,37 +141,62 @@ DerivativeTests.test("${op}_${T}") {
141141
// pow
142142
let eps:${T} = 0.01
143143
let ulps:${T} = eps/eps.ulp
144-
for a in -3...3 {
144+
145+
// Checks for negative base.
146+
for a in -3..<0 {
145147
let x = ${T}(a)
146148
for b in -3...3 {
147149
let y = ${T}(b)
148-
var expectedValues: (dx: ${T}, dy: ${T})?
149-
if x.isZero {
150-
if y.isLess(than: 0) {
151-
expectedValues = (dx: ${T}.infinity, dy: ${T}.nan)
152-
} else if y.isZero {
153-
expectedValues = (dx: ${T}.nan, dy: ${T}.zero)
154-
} else if !y.isEqual(to: 1) {
155-
expectedValues = (dx: ${T}.zero, dy: ${T}.zero)
156-
}
157-
} else if x.isLess(than: 2) {
158-
expectedValues = (dx: y * pow(x, y - 1), ${T}.zero)
159-
}
160-
if let (expectedDx, expectedDy) = expectedValues {
161-
let dpow = ${op}(at: x, y, in: pow)
150+
let expectedDx = y * pow(x, y - 1)
151+
let expectedDy = ${T}.zero
152+
let dpow = ${op}(at: x, y, in: pow)
162153
%if op == 'gradient':
163-
expectEqualWithTolerance(TestLiteralType(expectedDx), dpow.0)
164-
expectEqualWithTolerance(TestLiteralType(expectedDy), dpow.1)
154+
expectEqualWithTolerance(TestLiteralType(expectedDx), dpow.0)
155+
expectEqualWithTolerance(TestLiteralType(expectedDy), dpow.1)
165156
%else: # if op == 'derivative'
166-
expectEqualWithTolerance(TestLiteralType(expectedDx + expectedDy), dpow)
157+
expectEqualWithTolerance(TestLiteralType(expectedDx + expectedDy), dpow)
167158
%end
168-
} else {
159+
}
160+
}
161+
162+
// Checks for 0 base.
163+
for b in -3...3 {
164+
let y = ${T}(b)
165+
var expectedValues: (dx: ${T}, dy: ${T})?
166+
if y.isLess(than: 0) {
167+
expectedValues = (dx: ${T}.infinity, dy: ${T}.nan)
168+
} else if y.isZero {
169+
expectedValues = (dx: ${T}.nan, dy: ${T}.zero)
170+
} else if !y.isEqual(to: 1) {
171+
expectedValues = (dx: ${T}.zero, dy: ${T}.zero)
172+
}
173+
if let (expectedDx, expectedDy) = expectedValues {
174+
let dpow = ${op}(at: 0.0, y, in: pow)
175+
%if op == 'gradient':
176+
expectEqualWithTolerance(TestLiteralType(expectedDx), dpow.0)
177+
expectEqualWithTolerance(TestLiteralType(expectedDy), dpow.1)
178+
%else: # if op == 'derivative'
179+
expectEqualWithTolerance(TestLiteralType(expectedDx + expectedDy), dpow)
180+
%end
181+
} else {
182+
%if op == 'gradient':
183+
checkGradient({ pow($0, $1) }, 0.0, y, ulps: ulps)
184+
%else: # if op == 'derivative'
185+
checkDerivative({ pow($0, $1) }, 0.0, y, ulps: ulps)
186+
%end
187+
}
188+
}
189+
190+
// Checks for positive base.
191+
for a in 1...3 {
192+
let x = ${T}(a)
193+
for b in -3...3 {
194+
let y = ${T}(b)
169195
%if op == 'gradient':
170-
checkGradient({ pow($0, $1) }, x, y, ulps: ulps)
196+
checkGradient({ pow($0, $1) }, x, y, ulps: ulps)
171197
%else: # if op == 'derivative'
172-
checkDerivative({ pow($0, $1) }, x, y, ulps: ulps)
198+
checkDerivative({ pow($0, $1) }, x, y, ulps: ulps)
173199
%end
174-
}
175200
}
176201
}
177202
}

0 commit comments

Comments
 (0)