@@ -141,37 +141,62 @@ DerivativeTests.test("${op}_${T}") {
141
141
// pow
142
142
let eps:${T} = 0.01
143
143
let ulps:${T} = eps/eps.ulp
144
- for a in -3...3 {
144
+
145
+ // Checks for negative base.
146
+ for a in -3..<0 {
145
147
let x = ${T}(a)
146
148
for b in -3...3 {
147
149
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)
162
153
%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)
165
156
%else: # if op == 'derivative'
166
- expectEqualWithTolerance(TestLiteralType(expectedDx + expectedDy), dpow)
157
+ expectEqualWithTolerance(TestLiteralType(expectedDx + expectedDy), dpow)
167
158
%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)
169
195
%if op == 'gradient':
170
- checkGradient({ pow($0, $1) }, x, y, ulps: ulps)
196
+ checkGradient({ pow($0, $1) }, x, y, ulps: ulps)
171
197
%else: # if op == 'derivative'
172
- checkDerivative({ pow($0, $1) }, x, y, ulps: ulps)
198
+ checkDerivative({ pow($0, $1) }, x, y, ulps: ulps)
173
199
%end
174
- }
175
200
}
176
201
}
177
202
}
0 commit comments