authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-11-06 14:09:31-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-11-06 14:09:31-05:00
logd1b1f053b0fa8bf5bf716bae79fd656ce8aaec27
tree82795b82ea092ebe4c777ed75db4fe503704c9ad
parentb9391c9564dd56a46fbf83d8c536af1a3ad14678
parentff14451b4a328ca6862637a88912000d11aa2bf3
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #6941 from LemonBoy/floateqapprox

std: Implement more useful approxEq semantics

51 files changed, 574 insertions(+), 470 deletions(-)

lib/std/fmt/parse_float.zig+9-9
...@@ -370,7 +370,7 @@ test "fmt.parseFloat" {...@@ -370,7 +370,7 @@ test "fmt.parseFloat" {
370 const testing = std.testing;370 const testing = std.testing;
371 const expect = testing.expect;371 const expect = testing.expect;
372 const expectEqual = testing.expectEqual;372 const expectEqual = testing.expectEqual;
373 const approxEq = std.math.approxEq;373 const approxEqAbs = std.math.approxEqAbs;
374 const epsilon = 1e-7;374 const epsilon = 1e-7;
375375
376 inline for ([_]type{ f16, f32, f64, f128 }) |T| {376 inline for ([_]type{ f16, f32, f64, f128 }) |T| {
...@@ -392,8 +392,8 @@ test "fmt.parseFloat" {...@@ -392,8 +392,8 @@ test "fmt.parseFloat" {
392 expectEqual(try parseFloat(T, "-1e0"), -1.0);392 expectEqual(try parseFloat(T, "-1e0"), -1.0);
393 expectEqual(try parseFloat(T, "1.234e3"), 1234);393 expectEqual(try parseFloat(T, "1.234e3"), 1234);
394394
395 expect(approxEq(T, try parseFloat(T, "3.141"), 3.141, epsilon));395 expect(approxEqAbs(T, try parseFloat(T, "3.141"), 3.141, epsilon));
396 expect(approxEq(T, try parseFloat(T, "-3.141"), -3.141, epsilon));396 expect(approxEqAbs(T, try parseFloat(T, "-3.141"), -3.141, epsilon));
397397
398 expectEqual(try parseFloat(T, "1e-700"), 0);398 expectEqual(try parseFloat(T, "1e-700"), 0);
399 expectEqual(try parseFloat(T, "1e+700"), std.math.inf(T));399 expectEqual(try parseFloat(T, "1e+700"), std.math.inf(T));
...@@ -405,13 +405,13 @@ test "fmt.parseFloat" {...@@ -405,13 +405,13 @@ test "fmt.parseFloat" {
405 expectEqual(try parseFloat(T, "0.4e0066999999999999999999999999999999999999999999999999999"), std.math.inf(T));405 expectEqual(try parseFloat(T, "0.4e0066999999999999999999999999999999999999999999999999999"), std.math.inf(T));
406406
407 if (T != f16) {407 if (T != f16) {
408 expect(approxEq(T, try parseFloat(T, "1e-2"), 0.01, epsilon));408 expect(approxEqAbs(T, try parseFloat(T, "1e-2"), 0.01, epsilon));
409 expect(approxEq(T, try parseFloat(T, "1234e-2"), 12.34, epsilon));409 expect(approxEqAbs(T, try parseFloat(T, "1234e-2"), 12.34, epsilon));
410410
411 expect(approxEq(T, try parseFloat(T, "123142.1"), 123142.1, epsilon));411 expect(approxEqAbs(T, try parseFloat(T, "123142.1"), 123142.1, epsilon));
412 expect(approxEq(T, try parseFloat(T, "-123142.1124"), @as(T, -123142.1124), epsilon));412 expect(approxEqAbs(T, try parseFloat(T, "-123142.1124"), @as(T, -123142.1124), epsilon));
413 expect(approxEq(T, try parseFloat(T, "0.7062146892655368"), @as(T, 0.7062146892655368), epsilon));413 expect(approxEqAbs(T, try parseFloat(T, "0.7062146892655368"), @as(T, 0.7062146892655368), epsilon));
414 expect(approxEq(T, try parseFloat(T, "2.71828182845904523536"), @as(T, 2.718281828459045), epsilon));414 expect(approxEqAbs(T, try parseFloat(T, "2.71828182845904523536"), @as(T, 2.718281828459045), epsilon));
415 }415 }
416 }416 }
417}417}
lib/std/math.zig+87-2
...@@ -64,6 +64,8 @@ pub const f16_max = 65504;...@@ -64,6 +64,8 @@ pub const f16_max = 65504;
64pub const f16_epsilon = 0.0009765625; // 2**-1064pub const f16_epsilon = 0.0009765625; // 2**-10
65pub const f16_toint = 1.0 / f16_epsilon;65pub const f16_toint = 1.0 / f16_epsilon;
6666
67pub const epsilon = @import("math/epsilon.zig").epsilon;
68
67pub const nan_u16 = @as(u16, 0x7C01);69pub const nan_u16 = @as(u16, 0x7C01);
68pub const nan_f16 = @bitCast(f16, nan_u16);70pub const nan_f16 = @bitCast(f16, nan_u16);
6971
...@@ -104,9 +106,92 @@ pub const nan = @import("math/nan.zig").nan;...@@ -104,9 +106,92 @@ pub const nan = @import("math/nan.zig").nan;
104pub const snan = @import("math/nan.zig").snan;106pub const snan = @import("math/nan.zig").snan;
105pub const inf = @import("math/inf.zig").inf;107pub const inf = @import("math/inf.zig").inf;
106108
107pub fn approxEq(comptime T: type, x: T, y: T, epsilon: T) bool {109/// Performs an approximate comparison of two floating point values `x` and `y`.
110/// Returns true if the absolute difference between them is less or equal than
111/// the specified tolerance.
112///
113/// The `tolerance` parameter is the absolute tolerance used when determining if
114/// the two numbers are close enough, a good value for this parameter is a small
115/// multiple of `epsilon(T)`.
116///
117/// Note that this function is recommended for for comparing small numbers
118/// around zero, using `approxEqRel` is suggested otherwise.
119///
120/// NaN values are never considered equal to any value.
121pub fn approxEqAbs(comptime T: type, x: T, y: T, tolerance: T) bool {
122 assert(@typeInfo(T) == .Float);
123 assert(tolerance >= 0);
124
125 // Fast path for equal values (and signed zeros and infinites).
126 if (x == y)
127 return true;
128
129 if (isNan(x) or isNan(y))
130 return false;
131
132 return fabs(x - y) <= tolerance;
133}
134
135/// Performs an approximate comparison of two floating point values `x` and `y`.
136/// Returns true if the absolute difference between them is less or equal than
137/// `max(|x|, |y|) * tolerance`, where `tolerance` is a positive number greater
138/// than zero.
139///
140/// The `tolerance` parameter is the relative tolerance used when determining if
141/// the two numbers are close enough, a good value for this parameter is usually
142/// `sqrt(epsilon(T))`, meaning that the two numbers are considered equal if at
143/// least half of the digits are equal.
144///
145/// Note that for comparisons of small numbers around zero this function won't
146/// give meaningful results, use `approxEqAbs` instead.
147///
148/// NaN values are never considered equal to any value.
149pub fn approxEqRel(comptime T: type, x: T, y: T, tolerance: T) bool {
108 assert(@typeInfo(T) == .Float);150 assert(@typeInfo(T) == .Float);
109 return fabs(x - y) < epsilon;151 assert(tolerance > 0);
152
153 // Fast path for equal values (and signed zeros and infinites).
154 if (x == y)
155 return true;
156
157 if (isNan(x) or isNan(y))
158 return false;
159
160 return fabs(x - y) <= max(fabs(x), fabs(y)) * tolerance;
161}
162
163/// Deprecated, use `approxEqAbs` or `approxEqRel`.
164pub const approxEq = approxEqAbs;
165
166test "approxEqAbs and approxEqRel" {
167 inline for ([_]type{ f16, f32, f64, f128 }) |T| {
168 const eps_value = comptime epsilon(T);
169 const sqrt_eps_value = comptime sqrt(eps_value);
170 const nan_value = comptime nan(T);
171 const inf_value = comptime inf(T);
172 const min_value: T = switch (T) {
173 f16 => f16_min,
174 f32 => f32_min,
175 f64 => f64_min,
176 f128 => f128_min,
177 else => unreachable,
178 };
179
180 testing.expect(approxEqAbs(T, 0.0, 0.0, eps_value));
181 testing.expect(approxEqAbs(T, -0.0, -0.0, eps_value));
182 testing.expect(approxEqAbs(T, 0.0, -0.0, eps_value));
183 testing.expect(approxEqRel(T, 1.0, 1.0, sqrt_eps_value));
184 testing.expect(!approxEqRel(T, 1.0, 0.0, sqrt_eps_value));
185 testing.expect(!approxEqAbs(T, 1.0 + 2 * epsilon(T), 1.0, eps_value));
186 testing.expect(approxEqAbs(T, 1.0 + 1 * epsilon(T), 1.0, eps_value));
187 testing.expect(!approxEqRel(T, 1.0, nan_value, sqrt_eps_value));
188 testing.expect(!approxEqRel(T, nan_value, nan_value, sqrt_eps_value));
189 testing.expect(approxEqRel(T, inf_value, inf_value, sqrt_eps_value));
190 testing.expect(approxEqRel(T, min_value, min_value, sqrt_eps_value));
191 testing.expect(approxEqRel(T, -min_value, -min_value, sqrt_eps_value));
192 testing.expect(approxEqAbs(T, min_value, 0.0, eps_value * 2));
193 testing.expect(approxEqAbs(T, -min_value, 0.0, eps_value * 2));
194 }
110}195}
111196
112pub fn doNotOptimizeAway(value: anytype) void {197pub fn doNotOptimizeAway(value: anytype) void {
lib/std/math/acos.zig+12-12
...@@ -161,23 +161,23 @@ test "math.acos" {...@@ -161,23 +161,23 @@ test "math.acos" {
161test "math.acos32" {161test "math.acos32" {
162 const epsilon = 0.000001;162 const epsilon = 0.000001;
163163
164 expect(math.approxEq(f32, acos32(0.0), 1.570796, epsilon));164 expect(math.approxEqAbs(f32, acos32(0.0), 1.570796, epsilon));
165 expect(math.approxEq(f32, acos32(0.2), 1.369438, epsilon));165 expect(math.approxEqAbs(f32, acos32(0.2), 1.369438, epsilon));
166 expect(math.approxEq(f32, acos32(0.3434), 1.220262, epsilon));166 expect(math.approxEqAbs(f32, acos32(0.3434), 1.220262, epsilon));
167 expect(math.approxEq(f32, acos32(0.5), 1.047198, epsilon));167 expect(math.approxEqAbs(f32, acos32(0.5), 1.047198, epsilon));
168 expect(math.approxEq(f32, acos32(0.8923), 0.468382, epsilon));168 expect(math.approxEqAbs(f32, acos32(0.8923), 0.468382, epsilon));
169 expect(math.approxEq(f32, acos32(-0.2), 1.772154, epsilon));169 expect(math.approxEqAbs(f32, acos32(-0.2), 1.772154, epsilon));
170}170}
171171
172test "math.acos64" {172test "math.acos64" {
173 const epsilon = 0.000001;173 const epsilon = 0.000001;
174174
175 expect(math.approxEq(f64, acos64(0.0), 1.570796, epsilon));175 expect(math.approxEqAbs(f64, acos64(0.0), 1.570796, epsilon));
176 expect(math.approxEq(f64, acos64(0.2), 1.369438, epsilon));176 expect(math.approxEqAbs(f64, acos64(0.2), 1.369438, epsilon));
177 expect(math.approxEq(f64, acos64(0.3434), 1.220262, epsilon));177 expect(math.approxEqAbs(f64, acos64(0.3434), 1.220262, epsilon));
178 expect(math.approxEq(f64, acos64(0.5), 1.047198, epsilon));178 expect(math.approxEqAbs(f64, acos64(0.5), 1.047198, epsilon));
179 expect(math.approxEq(f64, acos64(0.8923), 0.468382, epsilon));179 expect(math.approxEqAbs(f64, acos64(0.8923), 0.468382, epsilon));
180 expect(math.approxEq(f64, acos64(-0.2), 1.772154, epsilon));180 expect(math.approxEqAbs(f64, acos64(-0.2), 1.772154, epsilon));
181}181}
182182
183test "math.acos32.special" {183test "math.acos32.special" {
lib/std/math/acosh.zig+8-8
...@@ -73,19 +73,19 @@ test "math.acosh" {...@@ -73,19 +73,19 @@ test "math.acosh" {
73test "math.acosh32" {73test "math.acosh32" {
74 const epsilon = 0.000001;74 const epsilon = 0.000001;
7575
76 expect(math.approxEq(f32, acosh32(1.5), 0.962424, epsilon));76 expect(math.approxEqAbs(f32, acosh32(1.5), 0.962424, epsilon));
77 expect(math.approxEq(f32, acosh32(37.45), 4.315976, epsilon));77 expect(math.approxEqAbs(f32, acosh32(37.45), 4.315976, epsilon));
78 expect(math.approxEq(f32, acosh32(89.123), 5.183133, epsilon));78 expect(math.approxEqAbs(f32, acosh32(89.123), 5.183133, epsilon));
79 expect(math.approxEq(f32, acosh32(123123.234375), 12.414088, epsilon));79 expect(math.approxEqAbs(f32, acosh32(123123.234375), 12.414088, epsilon));
80}80}
8181
82test "math.acosh64" {82test "math.acosh64" {
83 const epsilon = 0.000001;83 const epsilon = 0.000001;
8484
85 expect(math.approxEq(f64, acosh64(1.5), 0.962424, epsilon));85 expect(math.approxEqAbs(f64, acosh64(1.5), 0.962424, epsilon));
86 expect(math.approxEq(f64, acosh64(37.45), 4.315976, epsilon));86 expect(math.approxEqAbs(f64, acosh64(37.45), 4.315976, epsilon));
87 expect(math.approxEq(f64, acosh64(89.123), 5.183133, epsilon));87 expect(math.approxEqAbs(f64, acosh64(89.123), 5.183133, epsilon));
88 expect(math.approxEq(f64, acosh64(123123.234375), 12.414088, epsilon));88 expect(math.approxEqAbs(f64, acosh64(123123.234375), 12.414088, epsilon));
89}89}
9090
91test "math.acosh32.special" {91test "math.acosh32.special" {
lib/std/math/asin.zig+12-12
...@@ -154,23 +154,23 @@ test "math.asin" {...@@ -154,23 +154,23 @@ test "math.asin" {
154test "math.asin32" {154test "math.asin32" {
155 const epsilon = 0.000001;155 const epsilon = 0.000001;
156156
157 expect(math.approxEq(f32, asin32(0.0), 0.0, epsilon));157 expect(math.approxEqAbs(f32, asin32(0.0), 0.0, epsilon));
158 expect(math.approxEq(f32, asin32(0.2), 0.201358, epsilon));158 expect(math.approxEqAbs(f32, asin32(0.2), 0.201358, epsilon));
159 expect(math.approxEq(f32, asin32(-0.2), -0.201358, epsilon));159 expect(math.approxEqAbs(f32, asin32(-0.2), -0.201358, epsilon));
160 expect(math.approxEq(f32, asin32(0.3434), 0.350535, epsilon));160 expect(math.approxEqAbs(f32, asin32(0.3434), 0.350535, epsilon));
161 expect(math.approxEq(f32, asin32(0.5), 0.523599, epsilon));161 expect(math.approxEqAbs(f32, asin32(0.5), 0.523599, epsilon));
162 expect(math.approxEq(f32, asin32(0.8923), 1.102415, epsilon));162 expect(math.approxEqAbs(f32, asin32(0.8923), 1.102415, epsilon));
163}163}
164164
165test "math.asin64" {165test "math.asin64" {
166 const epsilon = 0.000001;166 const epsilon = 0.000001;
167167
168 expect(math.approxEq(f64, asin64(0.0), 0.0, epsilon));168 expect(math.approxEqAbs(f64, asin64(0.0), 0.0, epsilon));
169 expect(math.approxEq(f64, asin64(0.2), 0.201358, epsilon));169 expect(math.approxEqAbs(f64, asin64(0.2), 0.201358, epsilon));
170 expect(math.approxEq(f64, asin64(-0.2), -0.201358, epsilon));170 expect(math.approxEqAbs(f64, asin64(-0.2), -0.201358, epsilon));
171 expect(math.approxEq(f64, asin64(0.3434), 0.350535, epsilon));171 expect(math.approxEqAbs(f64, asin64(0.3434), 0.350535, epsilon));
172 expect(math.approxEq(f64, asin64(0.5), 0.523599, epsilon));172 expect(math.approxEqAbs(f64, asin64(0.5), 0.523599, epsilon));
173 expect(math.approxEq(f64, asin64(0.8923), 1.102415, epsilon));173 expect(math.approxEqAbs(f64, asin64(0.8923), 1.102415, epsilon));
174}174}
175175
176test "math.asin32.special" {176test "math.asin32.special" {
lib/std/math/asinh.zig+14-14
...@@ -101,25 +101,25 @@ test "math.asinh" {...@@ -101,25 +101,25 @@ test "math.asinh" {
101test "math.asinh32" {101test "math.asinh32" {
102 const epsilon = 0.000001;102 const epsilon = 0.000001;
103103
104 expect(math.approxEq(f32, asinh32(0.0), 0.0, epsilon));104 expect(math.approxEqAbs(f32, asinh32(0.0), 0.0, epsilon));
105 expect(math.approxEq(f32, asinh32(0.2), 0.198690, epsilon));105 expect(math.approxEqAbs(f32, asinh32(0.2), 0.198690, epsilon));
106 expect(math.approxEq(f32, asinh32(0.8923), 0.803133, epsilon));106 expect(math.approxEqAbs(f32, asinh32(0.8923), 0.803133, epsilon));
107 expect(math.approxEq(f32, asinh32(1.5), 1.194763, epsilon));107 expect(math.approxEqAbs(f32, asinh32(1.5), 1.194763, epsilon));
108 expect(math.approxEq(f32, asinh32(37.45), 4.316332, epsilon));108 expect(math.approxEqAbs(f32, asinh32(37.45), 4.316332, epsilon));
109 expect(math.approxEq(f32, asinh32(89.123), 5.183196, epsilon));109 expect(math.approxEqAbs(f32, asinh32(89.123), 5.183196, epsilon));
110 expect(math.approxEq(f32, asinh32(123123.234375), 12.414088, epsilon));110 expect(math.approxEqAbs(f32, asinh32(123123.234375), 12.414088, epsilon));
111}111}
112112
113test "math.asinh64" {113test "math.asinh64" {
114 const epsilon = 0.000001;114 const epsilon = 0.000001;
115115
116 expect(math.approxEq(f64, asinh64(0.0), 0.0, epsilon));116 expect(math.approxEqAbs(f64, asinh64(0.0), 0.0, epsilon));
117 expect(math.approxEq(f64, asinh64(0.2), 0.198690, epsilon));117 expect(math.approxEqAbs(f64, asinh64(0.2), 0.198690, epsilon));
118 expect(math.approxEq(f64, asinh64(0.8923), 0.803133, epsilon));118 expect(math.approxEqAbs(f64, asinh64(0.8923), 0.803133, epsilon));
119 expect(math.approxEq(f64, asinh64(1.5), 1.194763, epsilon));119 expect(math.approxEqAbs(f64, asinh64(1.5), 1.194763, epsilon));
120 expect(math.approxEq(f64, asinh64(37.45), 4.316332, epsilon));120 expect(math.approxEqAbs(f64, asinh64(37.45), 4.316332, epsilon));
121 expect(math.approxEq(f64, asinh64(89.123), 5.183196, epsilon));121 expect(math.approxEqAbs(f64, asinh64(89.123), 5.183196, epsilon));
122 expect(math.approxEq(f64, asinh64(123123.234375), 12.414088, epsilon));122 expect(math.approxEqAbs(f64, asinh64(123123.234375), 12.414088, epsilon));
123}123}
124124
125test "math.asinh32.special" {125test "math.asinh32.special" {
lib/std/math/atan.zig+14-14
...@@ -224,21 +224,21 @@ test "math.atan" {...@@ -224,21 +224,21 @@ test "math.atan" {
224test "math.atan32" {224test "math.atan32" {
225 const epsilon = 0.000001;225 const epsilon = 0.000001;
226226
227 expect(math.approxEq(f32, atan32(0.2), 0.197396, epsilon));227 expect(math.approxEqAbs(f32, atan32(0.2), 0.197396, epsilon));
228 expect(math.approxEq(f32, atan32(-0.2), -0.197396, epsilon));228 expect(math.approxEqAbs(f32, atan32(-0.2), -0.197396, epsilon));
229 expect(math.approxEq(f32, atan32(0.3434), 0.330783, epsilon));229 expect(math.approxEqAbs(f32, atan32(0.3434), 0.330783, epsilon));
230 expect(math.approxEq(f32, atan32(0.8923), 0.728545, epsilon));230 expect(math.approxEqAbs(f32, atan32(0.8923), 0.728545, epsilon));
231 expect(math.approxEq(f32, atan32(1.5), 0.982794, epsilon));231 expect(math.approxEqAbs(f32, atan32(1.5), 0.982794, epsilon));
232}232}
233233
234test "math.atan64" {234test "math.atan64" {
235 const epsilon = 0.000001;235 const epsilon = 0.000001;
236236
237 expect(math.approxEq(f64, atan64(0.2), 0.197396, epsilon));237 expect(math.approxEqAbs(f64, atan64(0.2), 0.197396, epsilon));
238 expect(math.approxEq(f64, atan64(-0.2), -0.197396, epsilon));238 expect(math.approxEqAbs(f64, atan64(-0.2), -0.197396, epsilon));
239 expect(math.approxEq(f64, atan64(0.3434), 0.330783, epsilon));239 expect(math.approxEqAbs(f64, atan64(0.3434), 0.330783, epsilon));
240 expect(math.approxEq(f64, atan64(0.8923), 0.728545, epsilon));240 expect(math.approxEqAbs(f64, atan64(0.8923), 0.728545, epsilon));
241 expect(math.approxEq(f64, atan64(1.5), 0.982794, epsilon));241 expect(math.approxEqAbs(f64, atan64(1.5), 0.982794, epsilon));
242}242}
243243
244test "math.atan32.special" {244test "math.atan32.special" {
...@@ -246,8 +246,8 @@ test "math.atan32.special" {...@@ -246,8 +246,8 @@ test "math.atan32.special" {
246246
247 expect(atan32(0.0) == 0.0);247 expect(atan32(0.0) == 0.0);
248 expect(atan32(-0.0) == -0.0);248 expect(atan32(-0.0) == -0.0);
249 expect(math.approxEq(f32, atan32(math.inf(f32)), math.pi / 2.0, epsilon));249 expect(math.approxEqAbs(f32, atan32(math.inf(f32)), math.pi / 2.0, epsilon));
250 expect(math.approxEq(f32, atan32(-math.inf(f32)), -math.pi / 2.0, epsilon));250 expect(math.approxEqAbs(f32, atan32(-math.inf(f32)), -math.pi / 2.0, epsilon));
251}251}
252252
253test "math.atan64.special" {253test "math.atan64.special" {
...@@ -255,6 +255,6 @@ test "math.atan64.special" {...@@ -255,6 +255,6 @@ test "math.atan64.special" {
255255
256 expect(atan64(0.0) == 0.0);256 expect(atan64(0.0) == 0.0);
257 expect(atan64(-0.0) == -0.0);257 expect(atan64(-0.0) == -0.0);
258 expect(math.approxEq(f64, atan64(math.inf(f64)), math.pi / 2.0, epsilon));258 expect(math.approxEqAbs(f64, atan64(math.inf(f64)), math.pi / 2.0, epsilon));
259 expect(math.approxEq(f64, atan64(-math.inf(f64)), -math.pi / 2.0, epsilon));259 expect(math.approxEqAbs(f64, atan64(-math.inf(f64)), -math.pi / 2.0, epsilon));
260}260}
lib/std/math/atan2.zig+42-42
...@@ -224,25 +224,25 @@ test "math.atan2" {...@@ -224,25 +224,25 @@ test "math.atan2" {
224test "math.atan2_32" {224test "math.atan2_32" {
225 const epsilon = 0.000001;225 const epsilon = 0.000001;
226226
227 expect(math.approxEq(f32, atan2_32(0.0, 0.0), 0.0, epsilon));227 expect(math.approxEqAbs(f32, atan2_32(0.0, 0.0), 0.0, epsilon));
228 expect(math.approxEq(f32, atan2_32(0.2, 0.2), 0.785398, epsilon));228 expect(math.approxEqAbs(f32, atan2_32(0.2, 0.2), 0.785398, epsilon));
229 expect(math.approxEq(f32, atan2_32(-0.2, 0.2), -0.785398, epsilon));229 expect(math.approxEqAbs(f32, atan2_32(-0.2, 0.2), -0.785398, epsilon));
230 expect(math.approxEq(f32, atan2_32(0.2, -0.2), 2.356194, epsilon));230 expect(math.approxEqAbs(f32, atan2_32(0.2, -0.2), 2.356194, epsilon));
231 expect(math.approxEq(f32, atan2_32(-0.2, -0.2), -2.356194, epsilon));231 expect(math.approxEqAbs(f32, atan2_32(-0.2, -0.2), -2.356194, epsilon));
232 expect(math.approxEq(f32, atan2_32(0.34, -0.4), 2.437099, epsilon));232 expect(math.approxEqAbs(f32, atan2_32(0.34, -0.4), 2.437099, epsilon));
233 expect(math.approxEq(f32, atan2_32(0.34, 1.243), 0.267001, epsilon));233 expect(math.approxEqAbs(f32, atan2_32(0.34, 1.243), 0.267001, epsilon));
234}234}
235235
236test "math.atan2_64" {236test "math.atan2_64" {
237 const epsilon = 0.000001;237 const epsilon = 0.000001;
238238
239 expect(math.approxEq(f64, atan2_64(0.0, 0.0), 0.0, epsilon));239 expect(math.approxEqAbs(f64, atan2_64(0.0, 0.0), 0.0, epsilon));
240 expect(math.approxEq(f64, atan2_64(0.2, 0.2), 0.785398, epsilon));240 expect(math.approxEqAbs(f64, atan2_64(0.2, 0.2), 0.785398, epsilon));
241 expect(math.approxEq(f64, atan2_64(-0.2, 0.2), -0.785398, epsilon));241 expect(math.approxEqAbs(f64, atan2_64(-0.2, 0.2), -0.785398, epsilon));
242 expect(math.approxEq(f64, atan2_64(0.2, -0.2), 2.356194, epsilon));242 expect(math.approxEqAbs(f64, atan2_64(0.2, -0.2), 2.356194, epsilon));
243 expect(math.approxEq(f64, atan2_64(-0.2, -0.2), -2.356194, epsilon));243 expect(math.approxEqAbs(f64, atan2_64(-0.2, -0.2), -2.356194, epsilon));
244 expect(math.approxEq(f64, atan2_64(0.34, -0.4), 2.437099, epsilon));244 expect(math.approxEqAbs(f64, atan2_64(0.34, -0.4), 2.437099, epsilon));
245 expect(math.approxEq(f64, atan2_64(0.34, 1.243), 0.267001, epsilon));245 expect(math.approxEqAbs(f64, atan2_64(0.34, 1.243), 0.267001, epsilon));
246}246}
247247
248test "math.atan2_32.special" {248test "math.atan2_32.special" {
...@@ -252,21 +252,21 @@ test "math.atan2_32.special" {...@@ -252,21 +252,21 @@ test "math.atan2_32.special" {
252 expect(math.isNan(atan2_32(math.nan(f32), 1.0)));252 expect(math.isNan(atan2_32(math.nan(f32), 1.0)));
253 expect(atan2_32(0.0, 5.0) == 0.0);253 expect(atan2_32(0.0, 5.0) == 0.0);
254 expect(atan2_32(-0.0, 5.0) == -0.0);254 expect(atan2_32(-0.0, 5.0) == -0.0);
255 expect(math.approxEq(f32, atan2_32(0.0, -5.0), math.pi, epsilon));255 expect(math.approxEqAbs(f32, atan2_32(0.0, -5.0), math.pi, epsilon));
256 //expect(math.approxEq(f32, atan2_32(-0.0, -5.0), -math.pi, epsilon)); TODO support negative zero?256 //expect(math.approxEqAbs(f32, atan2_32(-0.0, -5.0), -math.pi, .{.rel=0,.abs=epsilon})); TODO support negative zero?
257 expect(math.approxEq(f32, atan2_32(1.0, 0.0), math.pi / 2.0, epsilon));257 expect(math.approxEqAbs(f32, atan2_32(1.0, 0.0), math.pi / 2.0, epsilon));
258 expect(math.approxEq(f32, atan2_32(1.0, -0.0), math.pi / 2.0, epsilon));258 expect(math.approxEqAbs(f32, atan2_32(1.0, -0.0), math.pi / 2.0, epsilon));
259 expect(math.approxEq(f32, atan2_32(-1.0, 0.0), -math.pi / 2.0, epsilon));259 expect(math.approxEqAbs(f32, atan2_32(-1.0, 0.0), -math.pi / 2.0, epsilon));
260 expect(math.approxEq(f32, atan2_32(-1.0, -0.0), -math.pi / 2.0, epsilon));260 expect(math.approxEqAbs(f32, atan2_32(-1.0, -0.0), -math.pi / 2.0, epsilon));
261 expect(math.approxEq(f32, atan2_32(math.inf(f32), math.inf(f32)), math.pi / 4.0, epsilon));261 expect(math.approxEqAbs(f32, atan2_32(math.inf(f32), math.inf(f32)), math.pi / 4.0, epsilon));
262 expect(math.approxEq(f32, atan2_32(-math.inf(f32), math.inf(f32)), -math.pi / 4.0, epsilon));262 expect(math.approxEqAbs(f32, atan2_32(-math.inf(f32), math.inf(f32)), -math.pi / 4.0, epsilon));
263 expect(math.approxEq(f32, atan2_32(math.inf(f32), -math.inf(f32)), 3.0 * math.pi / 4.0, epsilon));263 expect(math.approxEqAbs(f32, atan2_32(math.inf(f32), -math.inf(f32)), 3.0 * math.pi / 4.0, epsilon));
264 expect(math.approxEq(f32, atan2_32(-math.inf(f32), -math.inf(f32)), -3.0 * math.pi / 4.0, epsilon));264 expect(math.approxEqAbs(f32, atan2_32(-math.inf(f32), -math.inf(f32)), -3.0 * math.pi / 4.0, epsilon));
265 expect(atan2_32(1.0, math.inf(f32)) == 0.0);265 expect(atan2_32(1.0, math.inf(f32)) == 0.0);
266 expect(math.approxEq(f32, atan2_32(1.0, -math.inf(f32)), math.pi, epsilon));266 expect(math.approxEqAbs(f32, atan2_32(1.0, -math.inf(f32)), math.pi, epsilon));
267 expect(math.approxEq(f32, atan2_32(-1.0, -math.inf(f32)), -math.pi, epsilon));267 expect(math.approxEqAbs(f32, atan2_32(-1.0, -math.inf(f32)), -math.pi, epsilon));
268 expect(math.approxEq(f32, atan2_32(math.inf(f32), 1.0), math.pi / 2.0, epsilon));268 expect(math.approxEqAbs(f32, atan2_32(math.inf(f32), 1.0), math.pi / 2.0, epsilon));
269 expect(math.approxEq(f32, atan2_32(-math.inf(f32), 1.0), -math.pi / 2.0, epsilon));269 expect(math.approxEqAbs(f32, atan2_32(-math.inf(f32), 1.0), -math.pi / 2.0, epsilon));
270}270}
271271
272test "math.atan2_64.special" {272test "math.atan2_64.special" {
...@@ -276,19 +276,19 @@ test "math.atan2_64.special" {...@@ -276,19 +276,19 @@ test "math.atan2_64.special" {
276 expect(math.isNan(atan2_64(math.nan(f64), 1.0)));276 expect(math.isNan(atan2_64(math.nan(f64), 1.0)));
277 expect(atan2_64(0.0, 5.0) == 0.0);277 expect(atan2_64(0.0, 5.0) == 0.0);
278 expect(atan2_64(-0.0, 5.0) == -0.0);278 expect(atan2_64(-0.0, 5.0) == -0.0);
279 expect(math.approxEq(f64, atan2_64(0.0, -5.0), math.pi, epsilon));279 expect(math.approxEqAbs(f64, atan2_64(0.0, -5.0), math.pi, epsilon));
280 //expect(math.approxEq(f64, atan2_64(-0.0, -5.0), -math.pi, epsilon)); TODO support negative zero?280 //expect(math.approxEqAbs(f64, atan2_64(-0.0, -5.0), -math.pi, .{.rel=0,.abs=epsilon})); TODO support negative zero?
281 expect(math.approxEq(f64, atan2_64(1.0, 0.0), math.pi / 2.0, epsilon));281 expect(math.approxEqAbs(f64, atan2_64(1.0, 0.0), math.pi / 2.0, epsilon));
282 expect(math.approxEq(f64, atan2_64(1.0, -0.0), math.pi / 2.0, epsilon));282 expect(math.approxEqAbs(f64, atan2_64(1.0, -0.0), math.pi / 2.0, epsilon));
283 expect(math.approxEq(f64, atan2_64(-1.0, 0.0), -math.pi / 2.0, epsilon));283 expect(math.approxEqAbs(f64, atan2_64(-1.0, 0.0), -math.pi / 2.0, epsilon));
284 expect(math.approxEq(f64, atan2_64(-1.0, -0.0), -math.pi / 2.0, epsilon));284 expect(math.approxEqAbs(f64, atan2_64(-1.0, -0.0), -math.pi / 2.0, epsilon));
285 expect(math.approxEq(f64, atan2_64(math.inf(f64), math.inf(f64)), math.pi / 4.0, epsilon));285 expect(math.approxEqAbs(f64, atan2_64(math.inf(f64), math.inf(f64)), math.pi / 4.0, epsilon));
286 expect(math.approxEq(f64, atan2_64(-math.inf(f64), math.inf(f64)), -math.pi / 4.0, epsilon));286 expect(math.approxEqAbs(f64, atan2_64(-math.inf(f64), math.inf(f64)), -math.pi / 4.0, epsilon));
287 expect(math.approxEq(f64, atan2_64(math.inf(f64), -math.inf(f64)), 3.0 * math.pi / 4.0, epsilon));287 expect(math.approxEqAbs(f64, atan2_64(math.inf(f64), -math.inf(f64)), 3.0 * math.pi / 4.0, epsilon));
288 expect(math.approxEq(f64, atan2_64(-math.inf(f64), -math.inf(f64)), -3.0 * math.pi / 4.0, epsilon));288 expect(math.approxEqAbs(f64, atan2_64(-math.inf(f64), -math.inf(f64)), -3.0 * math.pi / 4.0, epsilon));
289 expect(atan2_64(1.0, math.inf(f64)) == 0.0);289 expect(atan2_64(1.0, math.inf(f64)) == 0.0);
290 expect(math.approxEq(f64, atan2_64(1.0, -math.inf(f64)), math.pi, epsilon));290 expect(math.approxEqAbs(f64, atan2_64(1.0, -math.inf(f64)), math.pi, epsilon));
291 expect(math.approxEq(f64, atan2_64(-1.0, -math.inf(f64)), -math.pi, epsilon));291 expect(math.approxEqAbs(f64, atan2_64(-1.0, -math.inf(f64)), -math.pi, epsilon));
292 expect(math.approxEq(f64, atan2_64(math.inf(f64), 1.0), math.pi / 2.0, epsilon));292 expect(math.approxEqAbs(f64, atan2_64(math.inf(f64), 1.0), math.pi / 2.0, epsilon));
293 expect(math.approxEq(f64, atan2_64(-math.inf(f64), 1.0), -math.pi / 2.0, epsilon));293 expect(math.approxEqAbs(f64, atan2_64(-math.inf(f64), 1.0), -math.pi / 2.0, epsilon));
294}294}
lib/std/math/atanh.zig+6-6
...@@ -96,17 +96,17 @@ test "math.atanh" {...@@ -96,17 +96,17 @@ test "math.atanh" {
96test "math.atanh_32" {96test "math.atanh_32" {
97 const epsilon = 0.000001;97 const epsilon = 0.000001;
9898
99 expect(math.approxEq(f32, atanh_32(0.0), 0.0, epsilon));99 expect(math.approxEqAbs(f32, atanh_32(0.0), 0.0, epsilon));
100 expect(math.approxEq(f32, atanh_32(0.2), 0.202733, epsilon));100 expect(math.approxEqAbs(f32, atanh_32(0.2), 0.202733, epsilon));
101 expect(math.approxEq(f32, atanh_32(0.8923), 1.433099, epsilon));101 expect(math.approxEqAbs(f32, atanh_32(0.8923), 1.433099, epsilon));
102}102}
103103
104test "math.atanh_64" {104test "math.atanh_64" {
105 const epsilon = 0.000001;105 const epsilon = 0.000001;
106106
107 expect(math.approxEq(f64, atanh_64(0.0), 0.0, epsilon));107 expect(math.approxEqAbs(f64, atanh_64(0.0), 0.0, epsilon));
108 expect(math.approxEq(f64, atanh_64(0.2), 0.202733, epsilon));108 expect(math.approxEqAbs(f64, atanh_64(0.2), 0.202733, epsilon));
109 expect(math.approxEq(f64, atanh_64(0.8923), 1.433099, epsilon));109 expect(math.approxEqAbs(f64, atanh_64(0.8923), 1.433099, epsilon));
110}110}
111111
112test "math.atanh32.special" {112test "math.atanh32.special" {
lib/std/math/cbrt.zig+10-10
...@@ -133,22 +133,22 @@ test "math.cbrt32" {...@@ -133,22 +133,22 @@ test "math.cbrt32" {
133 const epsilon = 0.000001;133 const epsilon = 0.000001;
134134
135 expect(cbrt32(0.0) == 0.0);135 expect(cbrt32(0.0) == 0.0);
136 expect(math.approxEq(f32, cbrt32(0.2), 0.584804, epsilon));136 expect(math.approxEqAbs(f32, cbrt32(0.2), 0.584804, epsilon));
137 expect(math.approxEq(f32, cbrt32(0.8923), 0.962728, epsilon));137 expect(math.approxEqAbs(f32, cbrt32(0.8923), 0.962728, epsilon));
138 expect(math.approxEq(f32, cbrt32(1.5), 1.144714, epsilon));138 expect(math.approxEqAbs(f32, cbrt32(1.5), 1.144714, epsilon));
139 expect(math.approxEq(f32, cbrt32(37.45), 3.345676, epsilon));139 expect(math.approxEqAbs(f32, cbrt32(37.45), 3.345676, epsilon));
140 expect(math.approxEq(f32, cbrt32(123123.234375), 49.748501, epsilon));140 expect(math.approxEqAbs(f32, cbrt32(123123.234375), 49.748501, epsilon));
141}141}
142142
143test "math.cbrt64" {143test "math.cbrt64" {
144 const epsilon = 0.000001;144 const epsilon = 0.000001;
145145
146 expect(cbrt64(0.0) == 0.0);146 expect(cbrt64(0.0) == 0.0);
147 expect(math.approxEq(f64, cbrt64(0.2), 0.584804, epsilon));147 expect(math.approxEqAbs(f64, cbrt64(0.2), 0.584804, epsilon));
148 expect(math.approxEq(f64, cbrt64(0.8923), 0.962728, epsilon));148 expect(math.approxEqAbs(f64, cbrt64(0.8923), 0.962728, epsilon));
149 expect(math.approxEq(f64, cbrt64(1.5), 1.144714, epsilon));149 expect(math.approxEqAbs(f64, cbrt64(1.5), 1.144714, epsilon));
150 expect(math.approxEq(f64, cbrt64(37.45), 3.345676, epsilon));150 expect(math.approxEqAbs(f64, cbrt64(37.45), 3.345676, epsilon));
151 expect(math.approxEq(f64, cbrt64(123123.234375), 49.748501, epsilon));151 expect(math.approxEqAbs(f64, cbrt64(123123.234375), 49.748501, epsilon));
152}152}
153153
154test "math.cbrt.special" {154test "math.cbrt.special" {
lib/std/math/complex.zig+5-5
...@@ -138,8 +138,8 @@ test "complex.div" {...@@ -138,8 +138,8 @@ test "complex.div" {
138 const b = Complex(f32).new(2, 7);138 const b = Complex(f32).new(2, 7);
139 const c = a.div(b);139 const c = a.div(b);
140140
141 testing.expect(math.approxEq(f32, c.re, @as(f32, 31) / 53, epsilon) and141 testing.expect(math.approxEqAbs(f32, c.re, @as(f32, 31) / 53, epsilon) and
142 math.approxEq(f32, c.im, @as(f32, -29) / 53, epsilon));142 math.approxEqAbs(f32, c.im, @as(f32, -29) / 53, epsilon));
143}143}
144144
145test "complex.conjugate" {145test "complex.conjugate" {
...@@ -153,15 +153,15 @@ test "complex.reciprocal" {...@@ -153,15 +153,15 @@ test "complex.reciprocal" {
153 const a = Complex(f32).new(5, 3);153 const a = Complex(f32).new(5, 3);
154 const c = a.reciprocal();154 const c = a.reciprocal();
155155
156 testing.expect(math.approxEq(f32, c.re, @as(f32, 5) / 34, epsilon) and156 testing.expect(math.approxEqAbs(f32, c.re, @as(f32, 5) / 34, epsilon) and
157 math.approxEq(f32, c.im, @as(f32, -3) / 34, epsilon));157 math.approxEqAbs(f32, c.im, @as(f32, -3) / 34, epsilon));
158}158}
159159
160test "complex.magnitude" {160test "complex.magnitude" {
161 const a = Complex(f32).new(5, 3);161 const a = Complex(f32).new(5, 3);
162 const c = a.magnitude();162 const c = a.magnitude();
163163
164 testing.expect(math.approxEq(f32, c, 5.83095, epsilon));164 testing.expect(math.approxEqAbs(f32, c, 5.83095, epsilon));
165}165}
166166
167test "complex.cmath" {167test "complex.cmath" {
lib/std/math/complex/abs.zig+1-1
...@@ -20,5 +20,5 @@ const epsilon = 0.0001;...@@ -20,5 +20,5 @@ const epsilon = 0.0001;
20test "complex.cabs" {20test "complex.cabs" {
21 const a = Complex(f32).new(5, 3);21 const a = Complex(f32).new(5, 3);
22 const c = abs(a);22 const c = abs(a);
23 testing.expect(math.approxEq(f32, c, 5.83095, epsilon));23 testing.expect(math.approxEqAbs(f32, c, 5.83095, epsilon));
24}24}
lib/std/math/complex/acos.zig+2-2
...@@ -22,6 +22,6 @@ test "complex.cacos" {...@@ -22,6 +22,6 @@ test "complex.cacos" {
22 const a = Complex(f32).new(5, 3);22 const a = Complex(f32).new(5, 3);
23 const c = acos(a);23 const c = acos(a);
2424
25 testing.expect(math.approxEq(f32, c.re, 0.546975, epsilon));25 testing.expect(math.approxEqAbs(f32, c.re, 0.546975, epsilon));
26 testing.expect(math.approxEq(f32, c.im, -2.452914, epsilon));26 testing.expect(math.approxEqAbs(f32, c.im, -2.452914, epsilon));
27}27}
lib/std/math/complex/acosh.zig+2-2
...@@ -22,6 +22,6 @@ test "complex.cacosh" {...@@ -22,6 +22,6 @@ test "complex.cacosh" {
22 const a = Complex(f32).new(5, 3);22 const a = Complex(f32).new(5, 3);
23 const c = acosh(a);23 const c = acosh(a);
2424
25 testing.expect(math.approxEq(f32, c.re, 2.452914, epsilon));25 testing.expect(math.approxEqAbs(f32, c.re, 2.452914, epsilon));
26 testing.expect(math.approxEq(f32, c.im, 0.546975, epsilon));26 testing.expect(math.approxEqAbs(f32, c.im, 0.546975, epsilon));
27}27}
lib/std/math/complex/arg.zig+1-1
...@@ -20,5 +20,5 @@ const epsilon = 0.0001;...@@ -20,5 +20,5 @@ const epsilon = 0.0001;
20test "complex.carg" {20test "complex.carg" {
21 const a = Complex(f32).new(5, 3);21 const a = Complex(f32).new(5, 3);
22 const c = arg(a);22 const c = arg(a);
23 testing.expect(math.approxEq(f32, c, 0.540420, epsilon));23 testing.expect(math.approxEqAbs(f32, c, 0.540420, epsilon));
24}24}
lib/std/math/complex/asin.zig+2-2
...@@ -28,6 +28,6 @@ test "complex.casin" {...@@ -28,6 +28,6 @@ test "complex.casin" {
28 const a = Complex(f32).new(5, 3);28 const a = Complex(f32).new(5, 3);
29 const c = asin(a);29 const c = asin(a);
3030
31 testing.expect(math.approxEq(f32, c.re, 1.023822, epsilon));31 testing.expect(math.approxEqAbs(f32, c.re, 1.023822, epsilon));
32 testing.expect(math.approxEq(f32, c.im, 2.452914, epsilon));32 testing.expect(math.approxEqAbs(f32, c.im, 2.452914, epsilon));
33}33}
lib/std/math/complex/asinh.zig+2-2
...@@ -23,6 +23,6 @@ test "complex.casinh" {...@@ -23,6 +23,6 @@ test "complex.casinh" {
23 const a = Complex(f32).new(5, 3);23 const a = Complex(f32).new(5, 3);
24 const c = asinh(a);24 const c = asinh(a);
2525
26 testing.expect(math.approxEq(f32, c.re, 2.459831, epsilon));26 testing.expect(math.approxEqAbs(f32, c.re, 2.459831, epsilon));
27 testing.expect(math.approxEq(f32, c.im, 0.533999, epsilon));27 testing.expect(math.approxEqAbs(f32, c.im, 0.533999, epsilon));
28}28}
lib/std/math/complex/atan.zig+4-4
...@@ -130,14 +130,14 @@ test "complex.catan32" {...@@ -130,14 +130,14 @@ test "complex.catan32" {
130 const a = Complex(f32).new(5, 3);130 const a = Complex(f32).new(5, 3);
131 const c = atan(a);131 const c = atan(a);
132132
133 testing.expect(math.approxEq(f32, c.re, 1.423679, epsilon));133 testing.expect(math.approxEqAbs(f32, c.re, 1.423679, epsilon));
134 testing.expect(math.approxEq(f32, c.im, 0.086569, epsilon));134 testing.expect(math.approxEqAbs(f32, c.im, 0.086569, epsilon));
135}135}
136136
137test "complex.catan64" {137test "complex.catan64" {
138 const a = Complex(f64).new(5, 3);138 const a = Complex(f64).new(5, 3);
139 const c = atan(a);139 const c = atan(a);
140140
141 testing.expect(math.approxEq(f64, c.re, 1.423679, epsilon));141 testing.expect(math.approxEqAbs(f64, c.re, 1.423679, epsilon));
142 testing.expect(math.approxEq(f64, c.im, 0.086569, epsilon));142 testing.expect(math.approxEqAbs(f64, c.im, 0.086569, epsilon));
143}143}
lib/std/math/complex/atanh.zig+2-2
...@@ -23,6 +23,6 @@ test "complex.catanh" {...@@ -23,6 +23,6 @@ test "complex.catanh" {
23 const a = Complex(f32).new(5, 3);23 const a = Complex(f32).new(5, 3);
24 const c = atanh(a);24 const c = atanh(a);
2525
26 testing.expect(math.approxEq(f32, c.re, 0.146947, epsilon));26 testing.expect(math.approxEqAbs(f32, c.re, 0.146947, epsilon));
27 testing.expect(math.approxEq(f32, c.im, 1.480870, epsilon));27 testing.expect(math.approxEqAbs(f32, c.im, 1.480870, epsilon));
28}28}
lib/std/math/complex/cos.zig+2-2
...@@ -22,6 +22,6 @@ test "complex.ccos" {...@@ -22,6 +22,6 @@ test "complex.ccos" {
22 const a = Complex(f32).new(5, 3);22 const a = Complex(f32).new(5, 3);
23 const c = cos(a);23 const c = cos(a);
2424
25 testing.expect(math.approxEq(f32, c.re, 2.855815, epsilon));25 testing.expect(math.approxEqAbs(f32, c.re, 2.855815, epsilon));
26 testing.expect(math.approxEq(f32, c.im, 9.606383, epsilon));26 testing.expect(math.approxEqAbs(f32, c.im, 9.606383, epsilon));
27}27}
lib/std/math/complex/cosh.zig+4-4
...@@ -165,14 +165,14 @@ test "complex.ccosh32" {...@@ -165,14 +165,14 @@ test "complex.ccosh32" {
165 const a = Complex(f32).new(5, 3);165 const a = Complex(f32).new(5, 3);
166 const c = cosh(a);166 const c = cosh(a);
167167
168 testing.expect(math.approxEq(f32, c.re, -73.467300, epsilon));168 testing.expect(math.approxEqAbs(f32, c.re, -73.467300, epsilon));
169 testing.expect(math.approxEq(f32, c.im, 10.471557, epsilon));169 testing.expect(math.approxEqAbs(f32, c.im, 10.471557, epsilon));
170}170}
171171
172test "complex.ccosh64" {172test "complex.ccosh64" {
173 const a = Complex(f64).new(5, 3);173 const a = Complex(f64).new(5, 3);
174 const c = cosh(a);174 const c = cosh(a);
175175
176 testing.expect(math.approxEq(f64, c.re, -73.467300, epsilon));176 testing.expect(math.approxEqAbs(f64, c.re, -73.467300, epsilon));
177 testing.expect(math.approxEq(f64, c.im, 10.471557, epsilon));177 testing.expect(math.approxEqAbs(f64, c.im, 10.471557, epsilon));
178}178}
lib/std/math/complex/exp.zig+4-4
...@@ -131,14 +131,14 @@ test "complex.cexp32" {...@@ -131,14 +131,14 @@ test "complex.cexp32" {
131 const a = Complex(f32).new(5, 3);131 const a = Complex(f32).new(5, 3);
132 const c = exp(a);132 const c = exp(a);
133133
134 testing.expect(math.approxEq(f32, c.re, -146.927917, epsilon));134 testing.expect(math.approxEqAbs(f32, c.re, -146.927917, epsilon));
135 testing.expect(math.approxEq(f32, c.im, 20.944065, epsilon));135 testing.expect(math.approxEqAbs(f32, c.im, 20.944065, epsilon));
136}136}
137137
138test "complex.cexp64" {138test "complex.cexp64" {
139 const a = Complex(f64).new(5, 3);139 const a = Complex(f64).new(5, 3);
140 const c = exp(a);140 const c = exp(a);
141141
142 testing.expect(math.approxEq(f64, c.re, -146.927917, epsilon));142 testing.expect(math.approxEqAbs(f64, c.re, -146.927917, epsilon));
143 testing.expect(math.approxEq(f64, c.im, 20.944065, epsilon));143 testing.expect(math.approxEqAbs(f64, c.im, 20.944065, epsilon));
144}144}
lib/std/math/complex/log.zig+2-2
...@@ -24,6 +24,6 @@ test "complex.clog" {...@@ -24,6 +24,6 @@ test "complex.clog" {
24 const a = Complex(f32).new(5, 3);24 const a = Complex(f32).new(5, 3);
25 const c = log(a);25 const c = log(a);
2626
27 testing.expect(math.approxEq(f32, c.re, 1.763180, epsilon));27 testing.expect(math.approxEqAbs(f32, c.re, 1.763180, epsilon));
28 testing.expect(math.approxEq(f32, c.im, 0.540419, epsilon));28 testing.expect(math.approxEqAbs(f32, c.im, 0.540419, epsilon));
29}29}
lib/std/math/complex/pow.zig+2-2
...@@ -23,6 +23,6 @@ test "complex.cpow" {...@@ -23,6 +23,6 @@ test "complex.cpow" {
23 const b = Complex(f32).new(2.3, -1.3);23 const b = Complex(f32).new(2.3, -1.3);
24 const c = pow(Complex(f32), a, b);24 const c = pow(Complex(f32), a, b);
2525
26 testing.expect(math.approxEq(f32, c.re, 58.049110, epsilon));26 testing.expect(math.approxEqAbs(f32, c.re, 58.049110, epsilon));
27 testing.expect(math.approxEq(f32, c.im, -101.003433, epsilon));27 testing.expect(math.approxEqAbs(f32, c.im, -101.003433, epsilon));
28}28}
lib/std/math/complex/sin.zig+2-2
...@@ -23,6 +23,6 @@ test "complex.csin" {...@@ -23,6 +23,6 @@ test "complex.csin" {
23 const a = Complex(f32).new(5, 3);23 const a = Complex(f32).new(5, 3);
24 const c = sin(a);24 const c = sin(a);
2525
26 testing.expect(math.approxEq(f32, c.re, -9.654126, epsilon));26 testing.expect(math.approxEqAbs(f32, c.re, -9.654126, epsilon));
27 testing.expect(math.approxEq(f32, c.im, 2.841692, epsilon));27 testing.expect(math.approxEqAbs(f32, c.im, 2.841692, epsilon));
28}28}
lib/std/math/complex/sinh.zig+4-4
...@@ -164,14 +164,14 @@ test "complex.csinh32" {...@@ -164,14 +164,14 @@ test "complex.csinh32" {
164 const a = Complex(f32).new(5, 3);164 const a = Complex(f32).new(5, 3);
165 const c = sinh(a);165 const c = sinh(a);
166166
167 testing.expect(math.approxEq(f32, c.re, -73.460617, epsilon));167 testing.expect(math.approxEqAbs(f32, c.re, -73.460617, epsilon));
168 testing.expect(math.approxEq(f32, c.im, 10.472508, epsilon));168 testing.expect(math.approxEqAbs(f32, c.im, 10.472508, epsilon));
169}169}
170170
171test "complex.csinh64" {171test "complex.csinh64" {
172 const a = Complex(f64).new(5, 3);172 const a = Complex(f64).new(5, 3);
173 const c = sinh(a);173 const c = sinh(a);
174174
175 testing.expect(math.approxEq(f64, c.re, -73.460617, epsilon));175 testing.expect(math.approxEqAbs(f64, c.re, -73.460617, epsilon));
176 testing.expect(math.approxEq(f64, c.im, 10.472508, epsilon));176 testing.expect(math.approxEqAbs(f64, c.im, 10.472508, epsilon));
177}177}
lib/std/math/complex/sqrt.zig+4-4
...@@ -138,14 +138,14 @@ test "complex.csqrt32" {...@@ -138,14 +138,14 @@ test "complex.csqrt32" {
138 const a = Complex(f32).new(5, 3);138 const a = Complex(f32).new(5, 3);
139 const c = sqrt(a);139 const c = sqrt(a);
140140
141 testing.expect(math.approxEq(f32, c.re, 2.327117, epsilon));141 testing.expect(math.approxEqAbs(f32, c.re, 2.327117, epsilon));
142 testing.expect(math.approxEq(f32, c.im, 0.644574, epsilon));142 testing.expect(math.approxEqAbs(f32, c.im, 0.644574, epsilon));
143}143}
144144
145test "complex.csqrt64" {145test "complex.csqrt64" {
146 const a = Complex(f64).new(5, 3);146 const a = Complex(f64).new(5, 3);
147 const c = sqrt(a);147 const c = sqrt(a);
148148
149 testing.expect(math.approxEq(f64, c.re, 2.3271175190399496, epsilon));149 testing.expect(math.approxEqAbs(f64, c.re, 2.3271175190399496, epsilon));
150 testing.expect(math.approxEq(f64, c.im, 0.6445742373246469, epsilon));150 testing.expect(math.approxEqAbs(f64, c.im, 0.6445742373246469, epsilon));
151}151}
lib/std/math/complex/tan.zig+2-2
...@@ -23,6 +23,6 @@ test "complex.ctan" {...@@ -23,6 +23,6 @@ test "complex.ctan" {
23 const a = Complex(f32).new(5, 3);23 const a = Complex(f32).new(5, 3);
24 const c = tan(a);24 const c = tan(a);
2525
26 testing.expect(math.approxEq(f32, c.re, -0.002708233, epsilon));26 testing.expect(math.approxEqAbs(f32, c.re, -0.002708233, epsilon));
27 testing.expect(math.approxEq(f32, c.im, 1.004165, epsilon));27 testing.expect(math.approxEqAbs(f32, c.im, 1.004165, epsilon));
28}28}
lib/std/math/complex/tanh.zig+4-4
...@@ -113,14 +113,14 @@ test "complex.ctanh32" {...@@ -113,14 +113,14 @@ test "complex.ctanh32" {
113 const a = Complex(f32).new(5, 3);113 const a = Complex(f32).new(5, 3);
114 const c = tanh(a);114 const c = tanh(a);
115115
116 testing.expect(math.approxEq(f32, c.re, 0.999913, epsilon));116 testing.expect(math.approxEqAbs(f32, c.re, 0.999913, epsilon));
117 testing.expect(math.approxEq(f32, c.im, -0.000025, epsilon));117 testing.expect(math.approxEqAbs(f32, c.im, -0.000025, epsilon));
118}118}
119119
120test "complex.ctanh64" {120test "complex.ctanh64" {
121 const a = Complex(f64).new(5, 3);121 const a = Complex(f64).new(5, 3);
122 const c = tanh(a);122 const c = tanh(a);
123123
124 testing.expect(math.approxEq(f64, c.re, 0.999913, epsilon));124 testing.expect(math.approxEqAbs(f64, c.re, 0.999913, epsilon));
125 testing.expect(math.approxEq(f64, c.im, -0.000025, epsilon));125 testing.expect(math.approxEqAbs(f64, c.im, -0.000025, epsilon));
126}126}
lib/std/math/cos.zig+14-14
...@@ -95,25 +95,25 @@ test "math.cos" {...@@ -95,25 +95,25 @@ test "math.cos" {
95test "math.cos32" {95test "math.cos32" {
96 const epsilon = 0.000001;96 const epsilon = 0.000001;
9797
98 expect(math.approxEq(f32, cos_(f32, 0.0), 1.0, epsilon));98 expect(math.approxEqAbs(f32, cos_(f32, 0.0), 1.0, epsilon));
99 expect(math.approxEq(f32, cos_(f32, 0.2), 0.980067, epsilon));99 expect(math.approxEqAbs(f32, cos_(f32, 0.2), 0.980067, epsilon));
100 expect(math.approxEq(f32, cos_(f32, 0.8923), 0.627623, epsilon));100 expect(math.approxEqAbs(f32, cos_(f32, 0.8923), 0.627623, epsilon));
101 expect(math.approxEq(f32, cos_(f32, 1.5), 0.070737, epsilon));101 expect(math.approxEqAbs(f32, cos_(f32, 1.5), 0.070737, epsilon));
102 expect(math.approxEq(f32, cos_(f32, -1.5), 0.070737, epsilon));102 expect(math.approxEqAbs(f32, cos_(f32, -1.5), 0.070737, epsilon));
103 expect(math.approxEq(f32, cos_(f32, 37.45), 0.969132, epsilon));103 expect(math.approxEqAbs(f32, cos_(f32, 37.45), 0.969132, epsilon));
104 expect(math.approxEq(f32, cos_(f32, 89.123), 0.400798, epsilon));104 expect(math.approxEqAbs(f32, cos_(f32, 89.123), 0.400798, epsilon));
105}105}
106106
107test "math.cos64" {107test "math.cos64" {
108 const epsilon = 0.000001;108 const epsilon = 0.000001;
109109
110 expect(math.approxEq(f64, cos_(f64, 0.0), 1.0, epsilon));110 expect(math.approxEqAbs(f64, cos_(f64, 0.0), 1.0, epsilon));
111 expect(math.approxEq(f64, cos_(f64, 0.2), 0.980067, epsilon));111 expect(math.approxEqAbs(f64, cos_(f64, 0.2), 0.980067, epsilon));
112 expect(math.approxEq(f64, cos_(f64, 0.8923), 0.627623, epsilon));112 expect(math.approxEqAbs(f64, cos_(f64, 0.8923), 0.627623, epsilon));
113 expect(math.approxEq(f64, cos_(f64, 1.5), 0.070737, epsilon));113 expect(math.approxEqAbs(f64, cos_(f64, 1.5), 0.070737, epsilon));
114 expect(math.approxEq(f64, cos_(f64, -1.5), 0.070737, epsilon));114 expect(math.approxEqAbs(f64, cos_(f64, -1.5), 0.070737, epsilon));
115 expect(math.approxEq(f64, cos_(f64, 37.45), 0.969132, epsilon));115 expect(math.approxEqAbs(f64, cos_(f64, 37.45), 0.969132, epsilon));
116 expect(math.approxEq(f64, cos_(f64, 89.123), 0.40080, epsilon));116 expect(math.approxEqAbs(f64, cos_(f64, 89.123), 0.40080, epsilon));
117}117}
118118
119test "math.cos32.special" {119test "math.cos32.special" {
lib/std/math/cosh.zig+16-16
...@@ -100,27 +100,27 @@ test "math.cosh" {...@@ -100,27 +100,27 @@ test "math.cosh" {
100test "math.cosh32" {100test "math.cosh32" {
101 const epsilon = 0.000001;101 const epsilon = 0.000001;
102102
103 expect(math.approxEq(f32, cosh32(0.0), 1.0, epsilon));103 expect(math.approxEqAbs(f32, cosh32(0.0), 1.0, epsilon));
104 expect(math.approxEq(f32, cosh32(0.2), 1.020067, epsilon));104 expect(math.approxEqAbs(f32, cosh32(0.2), 1.020067, epsilon));
105 expect(math.approxEq(f32, cosh32(0.8923), 1.425225, epsilon));105 expect(math.approxEqAbs(f32, cosh32(0.8923), 1.425225, epsilon));
106 expect(math.approxEq(f32, cosh32(1.5), 2.352410, epsilon));106 expect(math.approxEqAbs(f32, cosh32(1.5), 2.352410, epsilon));
107 expect(math.approxEq(f32, cosh32(-0.0), 1.0, epsilon));107 expect(math.approxEqAbs(f32, cosh32(-0.0), 1.0, epsilon));
108 expect(math.approxEq(f32, cosh32(-0.2), 1.020067, epsilon));108 expect(math.approxEqAbs(f32, cosh32(-0.2), 1.020067, epsilon));
109 expect(math.approxEq(f32, cosh32(-0.8923), 1.425225, epsilon));109 expect(math.approxEqAbs(f32, cosh32(-0.8923), 1.425225, epsilon));
110 expect(math.approxEq(f32, cosh32(-1.5), 2.352410, epsilon));110 expect(math.approxEqAbs(f32, cosh32(-1.5), 2.352410, epsilon));
111}111}
112112
113test "math.cosh64" {113test "math.cosh64" {
114 const epsilon = 0.000001;114 const epsilon = 0.000001;
115115
116 expect(math.approxEq(f64, cosh64(0.0), 1.0, epsilon));116 expect(math.approxEqAbs(f64, cosh64(0.0), 1.0, epsilon));
117 expect(math.approxEq(f64, cosh64(0.2), 1.020067, epsilon));117 expect(math.approxEqAbs(f64, cosh64(0.2), 1.020067, epsilon));
118 expect(math.approxEq(f64, cosh64(0.8923), 1.425225, epsilon));118 expect(math.approxEqAbs(f64, cosh64(0.8923), 1.425225, epsilon));
119 expect(math.approxEq(f64, cosh64(1.5), 2.352410, epsilon));119 expect(math.approxEqAbs(f64, cosh64(1.5), 2.352410, epsilon));
120 expect(math.approxEq(f64, cosh64(-0.0), 1.0, epsilon));120 expect(math.approxEqAbs(f64, cosh64(-0.0), 1.0, epsilon));
121 expect(math.approxEq(f64, cosh64(-0.2), 1.020067, epsilon));121 expect(math.approxEqAbs(f64, cosh64(-0.2), 1.020067, epsilon));
122 expect(math.approxEq(f64, cosh64(-0.8923), 1.425225, epsilon));122 expect(math.approxEqAbs(f64, cosh64(-0.8923), 1.425225, epsilon));
123 expect(math.approxEq(f64, cosh64(-1.5), 2.352410, epsilon));123 expect(math.approxEqAbs(f64, cosh64(-1.5), 2.352410, epsilon));
124}124}
125125
126test "math.cosh32.special" {126test "math.cosh32.special" {
lib/std/math/epsilon.zig created+19
...@@ -0,0 +1,19 @@
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2015-2020 Zig Contributors
3// This file is part of [zig](https://ziglang.org/), which is MIT licensed.
4// The MIT license requires this copyright notice to be included in all copies
5// and substantial portions of the software.
6const math = @import("../math.zig");
7
8/// Returns the machine epsilon for type T.
9/// This is the smallest value of type T that satisfies the inequality 1.0 +
10/// epsilon != 1.0.
11pub fn epsilon(comptime T: type) T {
12 return switch (T) {
13 f16 => math.f16_epsilon,
14 f32 => math.f32_epsilon,
15 f64 => math.f64_epsilon,
16 f128 => math.f128_epsilon,
17 else => @compileError("epsilon not implemented for " ++ @typeName(T)),
18 };
19}
lib/std/math/exp.zig+8-8
...@@ -196,20 +196,20 @@ test "math.exp32" {...@@ -196,20 +196,20 @@ test "math.exp32" {
196 const epsilon = 0.000001;196 const epsilon = 0.000001;
197197
198 assert(exp32(0.0) == 1.0);198 assert(exp32(0.0) == 1.0);
199 assert(math.approxEq(f32, exp32(0.0), 1.0, epsilon));199 assert(math.approxEqAbs(f32, exp32(0.0), 1.0, epsilon));
200 assert(math.approxEq(f32, exp32(0.2), 1.221403, epsilon));200 assert(math.approxEqAbs(f32, exp32(0.2), 1.221403, epsilon));
201 assert(math.approxEq(f32, exp32(0.8923), 2.440737, epsilon));201 assert(math.approxEqAbs(f32, exp32(0.8923), 2.440737, epsilon));
202 assert(math.approxEq(f32, exp32(1.5), 4.481689, epsilon));202 assert(math.approxEqAbs(f32, exp32(1.5), 4.481689, epsilon));
203}203}
204204
205test "math.exp64" {205test "math.exp64" {
206 const epsilon = 0.000001;206 const epsilon = 0.000001;
207207
208 assert(exp64(0.0) == 1.0);208 assert(exp64(0.0) == 1.0);
209 assert(math.approxEq(f64, exp64(0.0), 1.0, epsilon));209 assert(math.approxEqAbs(f64, exp64(0.0), 1.0, epsilon));
210 assert(math.approxEq(f64, exp64(0.2), 1.221403, epsilon));210 assert(math.approxEqAbs(f64, exp64(0.2), 1.221403, epsilon));
211 assert(math.approxEq(f64, exp64(0.8923), 2.440737, epsilon));211 assert(math.approxEqAbs(f64, exp64(0.8923), 2.440737, epsilon));
212 assert(math.approxEq(f64, exp64(1.5), 4.481689, epsilon));212 assert(math.approxEqAbs(f64, exp64(1.5), 4.481689, epsilon));
213}213}
214214
215test "math.exp32.special" {215test "math.exp32.special" {
lib/std/math/exp2.zig+7-7
...@@ -434,19 +434,19 @@ test "math.exp2_32" {...@@ -434,19 +434,19 @@ test "math.exp2_32" {
434 const epsilon = 0.000001;434 const epsilon = 0.000001;
435435
436 expect(exp2_32(0.0) == 1.0);436 expect(exp2_32(0.0) == 1.0);
437 expect(math.approxEq(f32, exp2_32(0.2), 1.148698, epsilon));437 expect(math.approxEqAbs(f32, exp2_32(0.2), 1.148698, epsilon));
438 expect(math.approxEq(f32, exp2_32(0.8923), 1.856133, epsilon));438 expect(math.approxEqAbs(f32, exp2_32(0.8923), 1.856133, epsilon));
439 expect(math.approxEq(f32, exp2_32(1.5), 2.828427, epsilon));439 expect(math.approxEqAbs(f32, exp2_32(1.5), 2.828427, epsilon));
440 expect(math.approxEq(f32, exp2_32(37.45), 187747237888, epsilon));440 expect(math.approxEqAbs(f32, exp2_32(37.45), 187747237888, epsilon));
441}441}
442442
443test "math.exp2_64" {443test "math.exp2_64" {
444 const epsilon = 0.000001;444 const epsilon = 0.000001;
445445
446 expect(exp2_64(0.0) == 1.0);446 expect(exp2_64(0.0) == 1.0);
447 expect(math.approxEq(f64, exp2_64(0.2), 1.148698, epsilon));447 expect(math.approxEqAbs(f64, exp2_64(0.2), 1.148698, epsilon));
448 expect(math.approxEq(f64, exp2_64(0.8923), 1.856133, epsilon));448 expect(math.approxEqAbs(f64, exp2_64(0.8923), 1.856133, epsilon));
449 expect(math.approxEq(f64, exp2_64(1.5), 2.828427, epsilon));449 expect(math.approxEqAbs(f64, exp2_64(1.5), 2.828427, epsilon));
450}450}
451451
452test "math.exp2_32.special" {452test "math.exp2_32.special" {
lib/std/math/expm1.zig+8-8
...@@ -300,20 +300,20 @@ test "math.expm1_32" {...@@ -300,20 +300,20 @@ test "math.expm1_32" {
300 const epsilon = 0.000001;300 const epsilon = 0.000001;
301301
302 expect(expm1_32(0.0) == 0.0);302 expect(expm1_32(0.0) == 0.0);
303 expect(math.approxEq(f32, expm1_32(0.0), 0.0, epsilon));303 expect(math.approxEqAbs(f32, expm1_32(0.0), 0.0, epsilon));
304 expect(math.approxEq(f32, expm1_32(0.2), 0.221403, epsilon));304 expect(math.approxEqAbs(f32, expm1_32(0.2), 0.221403, epsilon));
305 expect(math.approxEq(f32, expm1_32(0.8923), 1.440737, epsilon));305 expect(math.approxEqAbs(f32, expm1_32(0.8923), 1.440737, epsilon));
306 expect(math.approxEq(f32, expm1_32(1.5), 3.481689, epsilon));306 expect(math.approxEqAbs(f32, expm1_32(1.5), 3.481689, epsilon));
307}307}
308308
309test "math.expm1_64" {309test "math.expm1_64" {
310 const epsilon = 0.000001;310 const epsilon = 0.000001;
311311
312 expect(expm1_64(0.0) == 0.0);312 expect(expm1_64(0.0) == 0.0);
313 expect(math.approxEq(f64, expm1_64(0.0), 0.0, epsilon));313 expect(math.approxEqAbs(f64, expm1_64(0.0), 0.0, epsilon));
314 expect(math.approxEq(f64, expm1_64(0.2), 0.221403, epsilon));314 expect(math.approxEqAbs(f64, expm1_64(0.2), 0.221403, epsilon));
315 expect(math.approxEq(f64, expm1_64(0.8923), 1.440737, epsilon));315 expect(math.approxEqAbs(f64, expm1_64(0.8923), 1.440737, epsilon));
316 expect(math.approxEq(f64, expm1_64(1.5), 3.481689, epsilon));316 expect(math.approxEqAbs(f64, expm1_64(1.5), 3.481689, epsilon));
317}317}
318318
319test "math.expm1_32.special" {319test "math.expm1_32.special" {
lib/std/math/fma.zig+14-14
...@@ -155,23 +155,23 @@ test "math.fma" {...@@ -155,23 +155,23 @@ test "math.fma" {
155test "math.fma32" {155test "math.fma32" {
156 const epsilon = 0.000001;156 const epsilon = 0.000001;
157157
158 expect(math.approxEq(f32, fma32(0.0, 5.0, 9.124), 9.124, epsilon));158 expect(math.approxEqAbs(f32, fma32(0.0, 5.0, 9.124), 9.124, epsilon));
159 expect(math.approxEq(f32, fma32(0.2, 5.0, 9.124), 10.124, epsilon));159 expect(math.approxEqAbs(f32, fma32(0.2, 5.0, 9.124), 10.124, epsilon));
160 expect(math.approxEq(f32, fma32(0.8923, 5.0, 9.124), 13.5855, epsilon));160 expect(math.approxEqAbs(f32, fma32(0.8923, 5.0, 9.124), 13.5855, epsilon));
161 expect(math.approxEq(f32, fma32(1.5, 5.0, 9.124), 16.624, epsilon));161 expect(math.approxEqAbs(f32, fma32(1.5, 5.0, 9.124), 16.624, epsilon));
162 expect(math.approxEq(f32, fma32(37.45, 5.0, 9.124), 196.374004, epsilon));162 expect(math.approxEqAbs(f32, fma32(37.45, 5.0, 9.124), 196.374004, epsilon));
163 expect(math.approxEq(f32, fma32(89.123, 5.0, 9.124), 454.739005, epsilon));163 expect(math.approxEqAbs(f32, fma32(89.123, 5.0, 9.124), 454.739005, epsilon));
164 expect(math.approxEq(f32, fma32(123123.234375, 5.0, 9.124), 615625.295875, epsilon));164 expect(math.approxEqAbs(f32, fma32(123123.234375, 5.0, 9.124), 615625.295875, epsilon));
165}165}
166166
167test "math.fma64" {167test "math.fma64" {
168 const epsilon = 0.000001;168 const epsilon = 0.000001;
169169
170 expect(math.approxEq(f64, fma64(0.0, 5.0, 9.124), 9.124, epsilon));170 expect(math.approxEqAbs(f64, fma64(0.0, 5.0, 9.124), 9.124, epsilon));
171 expect(math.approxEq(f64, fma64(0.2, 5.0, 9.124), 10.124, epsilon));171 expect(math.approxEqAbs(f64, fma64(0.2, 5.0, 9.124), 10.124, epsilon));
172 expect(math.approxEq(f64, fma64(0.8923, 5.0, 9.124), 13.5855, epsilon));172 expect(math.approxEqAbs(f64, fma64(0.8923, 5.0, 9.124), 13.5855, epsilon));
173 expect(math.approxEq(f64, fma64(1.5, 5.0, 9.124), 16.624, epsilon));173 expect(math.approxEqAbs(f64, fma64(1.5, 5.0, 9.124), 16.624, epsilon));
174 expect(math.approxEq(f64, fma64(37.45, 5.0, 9.124), 196.374, epsilon));174 expect(math.approxEqAbs(f64, fma64(37.45, 5.0, 9.124), 196.374, epsilon));
175 expect(math.approxEq(f64, fma64(89.123, 5.0, 9.124), 454.739, epsilon));175 expect(math.approxEqAbs(f64, fma64(89.123, 5.0, 9.124), 454.739, epsilon));
176 expect(math.approxEq(f64, fma64(123123.234375, 5.0, 9.124), 615625.295875, epsilon));176 expect(math.approxEqAbs(f64, fma64(123123.234375, 5.0, 9.124), 615625.295875, epsilon));
177}177}
lib/std/math/frexp.zig+4-4
...@@ -127,10 +127,10 @@ test "math.frexp32" {...@@ -127,10 +127,10 @@ test "math.frexp32" {
127 var r: frexp32_result = undefined;127 var r: frexp32_result = undefined;
128128
129 r = frexp32(1.3);129 r = frexp32(1.3);
130 expect(math.approxEq(f32, r.significand, 0.65, epsilon) and r.exponent == 1);130 expect(math.approxEqAbs(f32, r.significand, 0.65, epsilon) and r.exponent == 1);
131131
132 r = frexp32(78.0234);132 r = frexp32(78.0234);
133 expect(math.approxEq(f32, r.significand, 0.609558, epsilon) and r.exponent == 7);133 expect(math.approxEqAbs(f32, r.significand, 0.609558, epsilon) and r.exponent == 7);
134}134}
135135
136test "math.frexp64" {136test "math.frexp64" {
...@@ -138,10 +138,10 @@ test "math.frexp64" {...@@ -138,10 +138,10 @@ test "math.frexp64" {
138 var r: frexp64_result = undefined;138 var r: frexp64_result = undefined;
139139
140 r = frexp64(1.3);140 r = frexp64(1.3);
141 expect(math.approxEq(f64, r.significand, 0.65, epsilon) and r.exponent == 1);141 expect(math.approxEqAbs(f64, r.significand, 0.65, epsilon) and r.exponent == 1);
142142
143 r = frexp64(78.0234);143 r = frexp64(78.0234);
144 expect(math.approxEq(f64, r.significand, 0.609558, epsilon) and r.exponent == 7);144 expect(math.approxEqAbs(f64, r.significand, 0.609558, epsilon) and r.exponent == 7);
145}145}
146146
147test "math.frexp32.special" {147test "math.frexp32.special" {
lib/std/math/hypot.zig+14-14
...@@ -133,25 +133,25 @@ test "math.hypot" {...@@ -133,25 +133,25 @@ test "math.hypot" {
133test "math.hypot32" {133test "math.hypot32" {
134 const epsilon = 0.000001;134 const epsilon = 0.000001;
135135
136 expect(math.approxEq(f32, hypot32(0.0, -1.2), 1.2, epsilon));136 expect(math.approxEqAbs(f32, hypot32(0.0, -1.2), 1.2, epsilon));
137 expect(math.approxEq(f32, hypot32(0.2, -0.34), 0.394462, epsilon));137 expect(math.approxEqAbs(f32, hypot32(0.2, -0.34), 0.394462, epsilon));
138 expect(math.approxEq(f32, hypot32(0.8923, 2.636890), 2.783772, epsilon));138 expect(math.approxEqAbs(f32, hypot32(0.8923, 2.636890), 2.783772, epsilon));
139 expect(math.approxEq(f32, hypot32(1.5, 5.25), 5.460083, epsilon));139 expect(math.approxEqAbs(f32, hypot32(1.5, 5.25), 5.460083, epsilon));
140 expect(math.approxEq(f32, hypot32(37.45, 159.835), 164.163742, epsilon));140 expect(math.approxEqAbs(f32, hypot32(37.45, 159.835), 164.163742, epsilon));
141 expect(math.approxEq(f32, hypot32(89.123, 382.028905), 392.286865, epsilon));141 expect(math.approxEqAbs(f32, hypot32(89.123, 382.028905), 392.286865, epsilon));
142 expect(math.approxEq(f32, hypot32(123123.234375, 529428.707813), 543556.875, epsilon));142 expect(math.approxEqAbs(f32, hypot32(123123.234375, 529428.707813), 543556.875, epsilon));
143}143}
144144
145test "math.hypot64" {145test "math.hypot64" {
146 const epsilon = 0.000001;146 const epsilon = 0.000001;
147147
148 expect(math.approxEq(f64, hypot64(0.0, -1.2), 1.2, epsilon));148 expect(math.approxEqAbs(f64, hypot64(0.0, -1.2), 1.2, epsilon));
149 expect(math.approxEq(f64, hypot64(0.2, -0.34), 0.394462, epsilon));149 expect(math.approxEqAbs(f64, hypot64(0.2, -0.34), 0.394462, epsilon));
150 expect(math.approxEq(f64, hypot64(0.8923, 2.636890), 2.783772, epsilon));150 expect(math.approxEqAbs(f64, hypot64(0.8923, 2.636890), 2.783772, epsilon));
151 expect(math.approxEq(f64, hypot64(1.5, 5.25), 5.460082, epsilon));151 expect(math.approxEqAbs(f64, hypot64(1.5, 5.25), 5.460082, epsilon));
152 expect(math.approxEq(f64, hypot64(37.45, 159.835), 164.163728, epsilon));152 expect(math.approxEqAbs(f64, hypot64(37.45, 159.835), 164.163728, epsilon));
153 expect(math.approxEq(f64, hypot64(89.123, 382.028905), 392.286876, epsilon));153 expect(math.approxEqAbs(f64, hypot64(89.123, 382.028905), 392.286876, epsilon));
154 expect(math.approxEq(f64, hypot64(123123.234375, 529428.707813), 543556.885247, epsilon));154 expect(math.approxEqAbs(f64, hypot64(123123.234375, 529428.707813), 543556.885247, epsilon));
155}155}
156156
157test "math.hypot32.special" {157test "math.hypot32.special" {
lib/std/math/ln.zig+12-12
...@@ -159,23 +159,23 @@ test "math.ln" {...@@ -159,23 +159,23 @@ test "math.ln" {
159test "math.ln32" {159test "math.ln32" {
160 const epsilon = 0.000001;160 const epsilon = 0.000001;
161161
162 expect(math.approxEq(f32, ln_32(0.2), -1.609438, epsilon));162 expect(math.approxEqAbs(f32, ln_32(0.2), -1.609438, epsilon));
163 expect(math.approxEq(f32, ln_32(0.8923), -0.113953, epsilon));163 expect(math.approxEqAbs(f32, ln_32(0.8923), -0.113953, epsilon));
164 expect(math.approxEq(f32, ln_32(1.5), 0.405465, epsilon));164 expect(math.approxEqAbs(f32, ln_32(1.5), 0.405465, epsilon));
165 expect(math.approxEq(f32, ln_32(37.45), 3.623007, epsilon));165 expect(math.approxEqAbs(f32, ln_32(37.45), 3.623007, epsilon));
166 expect(math.approxEq(f32, ln_32(89.123), 4.490017, epsilon));166 expect(math.approxEqAbs(f32, ln_32(89.123), 4.490017, epsilon));
167 expect(math.approxEq(f32, ln_32(123123.234375), 11.720941, epsilon));167 expect(math.approxEqAbs(f32, ln_32(123123.234375), 11.720941, epsilon));
168}168}
169169
170test "math.ln64" {170test "math.ln64" {
171 const epsilon = 0.000001;171 const epsilon = 0.000001;
172172
173 expect(math.approxEq(f64, ln_64(0.2), -1.609438, epsilon));173 expect(math.approxEqAbs(f64, ln_64(0.2), -1.609438, epsilon));
174 expect(math.approxEq(f64, ln_64(0.8923), -0.113953, epsilon));174 expect(math.approxEqAbs(f64, ln_64(0.8923), -0.113953, epsilon));
175 expect(math.approxEq(f64, ln_64(1.5), 0.405465, epsilon));175 expect(math.approxEqAbs(f64, ln_64(1.5), 0.405465, epsilon));
176 expect(math.approxEq(f64, ln_64(37.45), 3.623007, epsilon));176 expect(math.approxEqAbs(f64, ln_64(37.45), 3.623007, epsilon));
177 expect(math.approxEq(f64, ln_64(89.123), 4.490017, epsilon));177 expect(math.approxEqAbs(f64, ln_64(89.123), 4.490017, epsilon));
178 expect(math.approxEq(f64, ln_64(123123.234375), 11.720941, epsilon));178 expect(math.approxEqAbs(f64, ln_64(123123.234375), 11.720941, epsilon));
179}179}
180180
181test "math.ln32.special" {181test "math.ln32.special" {
lib/std/math/log.zig+3-3
...@@ -61,9 +61,9 @@ test "math.log integer" {...@@ -61,9 +61,9 @@ test "math.log integer" {
61test "math.log float" {61test "math.log float" {
62 const epsilon = 0.000001;62 const epsilon = 0.000001;
6363
64 expect(math.approxEq(f32, log(f32, 6, 0.23947), -0.797723, epsilon));64 expect(math.approxEqAbs(f32, log(f32, 6, 0.23947), -0.797723, epsilon));
65 expect(math.approxEq(f32, log(f32, 89, 0.23947), -0.318432, epsilon));65 expect(math.approxEqAbs(f32, log(f32, 89, 0.23947), -0.318432, epsilon));
66 expect(math.approxEq(f64, log(f64, 123897, 12389216414), 1.981724596, epsilon));66 expect(math.approxEqAbs(f64, log(f64, 123897, 12389216414), 1.981724596, epsilon));
67}67}
6868
69test "math.log float_special" {69test "math.log float_special" {
lib/std/math/log10.zig+12-12
...@@ -187,23 +187,23 @@ test "math.log10" {...@@ -187,23 +187,23 @@ test "math.log10" {
187test "math.log10_32" {187test "math.log10_32" {
188 const epsilon = 0.000001;188 const epsilon = 0.000001;
189189
190 testing.expect(math.approxEq(f32, log10_32(0.2), -0.698970, epsilon));190 testing.expect(math.approxEqAbs(f32, log10_32(0.2), -0.698970, epsilon));
191 testing.expect(math.approxEq(f32, log10_32(0.8923), -0.049489, epsilon));191 testing.expect(math.approxEqAbs(f32, log10_32(0.8923), -0.049489, epsilon));
192 testing.expect(math.approxEq(f32, log10_32(1.5), 0.176091, epsilon));192 testing.expect(math.approxEqAbs(f32, log10_32(1.5), 0.176091, epsilon));
193 testing.expect(math.approxEq(f32, log10_32(37.45), 1.573452, epsilon));193 testing.expect(math.approxEqAbs(f32, log10_32(37.45), 1.573452, epsilon));
194 testing.expect(math.approxEq(f32, log10_32(89.123), 1.94999, epsilon));194 testing.expect(math.approxEqAbs(f32, log10_32(89.123), 1.94999, epsilon));
195 testing.expect(math.approxEq(f32, log10_32(123123.234375), 5.09034, epsilon));195 testing.expect(math.approxEqAbs(f32, log10_32(123123.234375), 5.09034, epsilon));
196}196}
197197
198test "math.log10_64" {198test "math.log10_64" {
199 const epsilon = 0.000001;199 const epsilon = 0.000001;
200200
201 testing.expect(math.approxEq(f64, log10_64(0.2), -0.698970, epsilon));201 testing.expect(math.approxEqAbs(f64, log10_64(0.2), -0.698970, epsilon));
202 testing.expect(math.approxEq(f64, log10_64(0.8923), -0.049489, epsilon));202 testing.expect(math.approxEqAbs(f64, log10_64(0.8923), -0.049489, epsilon));
203 testing.expect(math.approxEq(f64, log10_64(1.5), 0.176091, epsilon));203 testing.expect(math.approxEqAbs(f64, log10_64(1.5), 0.176091, epsilon));
204 testing.expect(math.approxEq(f64, log10_64(37.45), 1.573452, epsilon));204 testing.expect(math.approxEqAbs(f64, log10_64(37.45), 1.573452, epsilon));
205 testing.expect(math.approxEq(f64, log10_64(89.123), 1.94999, epsilon));205 testing.expect(math.approxEqAbs(f64, log10_64(89.123), 1.94999, epsilon));
206 testing.expect(math.approxEq(f64, log10_64(123123.234375), 5.09034, epsilon));206 testing.expect(math.approxEqAbs(f64, log10_64(123123.234375), 5.09034, epsilon));
207}207}
208208
209test "math.log10_32.special" {209test "math.log10_32.special" {
lib/std/math/log1p.zig+14-14
...@@ -195,25 +195,25 @@ test "math.log1p" {...@@ -195,25 +195,25 @@ test "math.log1p" {
195test "math.log1p_32" {195test "math.log1p_32" {
196 const epsilon = 0.000001;196 const epsilon = 0.000001;
197197
198 expect(math.approxEq(f32, log1p_32(0.0), 0.0, epsilon));198 expect(math.approxEqAbs(f32, log1p_32(0.0), 0.0, epsilon));
199 expect(math.approxEq(f32, log1p_32(0.2), 0.182322, epsilon));199 expect(math.approxEqAbs(f32, log1p_32(0.2), 0.182322, epsilon));
200 expect(math.approxEq(f32, log1p_32(0.8923), 0.637793, epsilon));200 expect(math.approxEqAbs(f32, log1p_32(0.8923), 0.637793, epsilon));
201 expect(math.approxEq(f32, log1p_32(1.5), 0.916291, epsilon));201 expect(math.approxEqAbs(f32, log1p_32(1.5), 0.916291, epsilon));
202 expect(math.approxEq(f32, log1p_32(37.45), 3.649359, epsilon));202 expect(math.approxEqAbs(f32, log1p_32(37.45), 3.649359, epsilon));
203 expect(math.approxEq(f32, log1p_32(89.123), 4.501175, epsilon));203 expect(math.approxEqAbs(f32, log1p_32(89.123), 4.501175, epsilon));
204 expect(math.approxEq(f32, log1p_32(123123.234375), 11.720949, epsilon));204 expect(math.approxEqAbs(f32, log1p_32(123123.234375), 11.720949, epsilon));
205}205}
206206
207test "math.log1p_64" {207test "math.log1p_64" {
208 const epsilon = 0.000001;208 const epsilon = 0.000001;
209209
210 expect(math.approxEq(f64, log1p_64(0.0), 0.0, epsilon));210 expect(math.approxEqAbs(f64, log1p_64(0.0), 0.0, epsilon));
211 expect(math.approxEq(f64, log1p_64(0.2), 0.182322, epsilon));211 expect(math.approxEqAbs(f64, log1p_64(0.2), 0.182322, epsilon));
212 expect(math.approxEq(f64, log1p_64(0.8923), 0.637793, epsilon));212 expect(math.approxEqAbs(f64, log1p_64(0.8923), 0.637793, epsilon));
213 expect(math.approxEq(f64, log1p_64(1.5), 0.916291, epsilon));213 expect(math.approxEqAbs(f64, log1p_64(1.5), 0.916291, epsilon));
214 expect(math.approxEq(f64, log1p_64(37.45), 3.649359, epsilon));214 expect(math.approxEqAbs(f64, log1p_64(37.45), 3.649359, epsilon));
215 expect(math.approxEq(f64, log1p_64(89.123), 4.501175, epsilon));215 expect(math.approxEqAbs(f64, log1p_64(89.123), 4.501175, epsilon));
216 expect(math.approxEq(f64, log1p_64(123123.234375), 11.720949, epsilon));216 expect(math.approxEqAbs(f64, log1p_64(123123.234375), 11.720949, epsilon));
217}217}
218218
219test "math.log1p_32.special" {219test "math.log1p_32.special" {
lib/std/math/log2.zig+10-10
...@@ -185,21 +185,21 @@ test "math.log2" {...@@ -185,21 +185,21 @@ test "math.log2" {
185test "math.log2_32" {185test "math.log2_32" {
186 const epsilon = 0.000001;186 const epsilon = 0.000001;
187187
188 expect(math.approxEq(f32, log2_32(0.2), -2.321928, epsilon));188 expect(math.approxEqAbs(f32, log2_32(0.2), -2.321928, epsilon));
189 expect(math.approxEq(f32, log2_32(0.8923), -0.164399, epsilon));189 expect(math.approxEqAbs(f32, log2_32(0.8923), -0.164399, epsilon));
190 expect(math.approxEq(f32, log2_32(1.5), 0.584962, epsilon));190 expect(math.approxEqAbs(f32, log2_32(1.5), 0.584962, epsilon));
191 expect(math.approxEq(f32, log2_32(37.45), 5.226894, epsilon));191 expect(math.approxEqAbs(f32, log2_32(37.45), 5.226894, epsilon));
192 expect(math.approxEq(f32, log2_32(123123.234375), 16.909744, epsilon));192 expect(math.approxEqAbs(f32, log2_32(123123.234375), 16.909744, epsilon));
193}193}
194194
195test "math.log2_64" {195test "math.log2_64" {
196 const epsilon = 0.000001;196 const epsilon = 0.000001;
197197
198 expect(math.approxEq(f64, log2_64(0.2), -2.321928, epsilon));198 expect(math.approxEqAbs(f64, log2_64(0.2), -2.321928, epsilon));
199 expect(math.approxEq(f64, log2_64(0.8923), -0.164399, epsilon));199 expect(math.approxEqAbs(f64, log2_64(0.8923), -0.164399, epsilon));
200 expect(math.approxEq(f64, log2_64(1.5), 0.584962, epsilon));200 expect(math.approxEqAbs(f64, log2_64(1.5), 0.584962, epsilon));
201 expect(math.approxEq(f64, log2_64(37.45), 5.226894, epsilon));201 expect(math.approxEqAbs(f64, log2_64(37.45), 5.226894, epsilon));
202 expect(math.approxEq(f64, log2_64(123123.234375), 16.909744, epsilon));202 expect(math.approxEqAbs(f64, log2_64(123123.234375), 16.909744, epsilon));
203}203}
204204
205test "math.log2_32.special" {205test "math.log2_32.special" {
lib/std/math/modf.zig+20-20
...@@ -143,24 +143,24 @@ test "math.modf32" {...@@ -143,24 +143,24 @@ test "math.modf32" {
143 var r: modf32_result = undefined;143 var r: modf32_result = undefined;
144144
145 r = modf32(1.0);145 r = modf32(1.0);
146 expect(math.approxEq(f32, r.ipart, 1.0, epsilon));146 expect(math.approxEqAbs(f32, r.ipart, 1.0, epsilon));
147 expect(math.approxEq(f32, r.fpart, 0.0, epsilon));147 expect(math.approxEqAbs(f32, r.fpart, 0.0, epsilon));
148148
149 r = modf32(2.545);149 r = modf32(2.545);
150 expect(math.approxEq(f32, r.ipart, 2.0, epsilon));150 expect(math.approxEqAbs(f32, r.ipart, 2.0, epsilon));
151 expect(math.approxEq(f32, r.fpart, 0.545, epsilon));151 expect(math.approxEqAbs(f32, r.fpart, 0.545, epsilon));
152152
153 r = modf32(3.978123);153 r = modf32(3.978123);
154 expect(math.approxEq(f32, r.ipart, 3.0, epsilon));154 expect(math.approxEqAbs(f32, r.ipart, 3.0, epsilon));
155 expect(math.approxEq(f32, r.fpart, 0.978123, epsilon));155 expect(math.approxEqAbs(f32, r.fpart, 0.978123, epsilon));
156156
157 r = modf32(43874.3);157 r = modf32(43874.3);
158 expect(math.approxEq(f32, r.ipart, 43874, epsilon));158 expect(math.approxEqAbs(f32, r.ipart, 43874, epsilon));
159 expect(math.approxEq(f32, r.fpart, 0.300781, epsilon));159 expect(math.approxEqAbs(f32, r.fpart, 0.300781, epsilon));
160160
161 r = modf32(1234.340780);161 r = modf32(1234.340780);
162 expect(math.approxEq(f32, r.ipart, 1234, epsilon));162 expect(math.approxEqAbs(f32, r.ipart, 1234, epsilon));
163 expect(math.approxEq(f32, r.fpart, 0.340820, epsilon));163 expect(math.approxEqAbs(f32, r.fpart, 0.340820, epsilon));
164}164}
165165
166test "math.modf64" {166test "math.modf64" {
...@@ -168,24 +168,24 @@ test "math.modf64" {...@@ -168,24 +168,24 @@ test "math.modf64" {
168 var r: modf64_result = undefined;168 var r: modf64_result = undefined;
169169
170 r = modf64(1.0);170 r = modf64(1.0);
171 expect(math.approxEq(f64, r.ipart, 1.0, epsilon));171 expect(math.approxEqAbs(f64, r.ipart, 1.0, epsilon));
172 expect(math.approxEq(f64, r.fpart, 0.0, epsilon));172 expect(math.approxEqAbs(f64, r.fpart, 0.0, epsilon));
173173
174 r = modf64(2.545);174 r = modf64(2.545);
175 expect(math.approxEq(f64, r.ipart, 2.0, epsilon));175 expect(math.approxEqAbs(f64, r.ipart, 2.0, epsilon));
176 expect(math.approxEq(f64, r.fpart, 0.545, epsilon));176 expect(math.approxEqAbs(f64, r.fpart, 0.545, epsilon));
177177
178 r = modf64(3.978123);178 r = modf64(3.978123);
179 expect(math.approxEq(f64, r.ipart, 3.0, epsilon));179 expect(math.approxEqAbs(f64, r.ipart, 3.0, epsilon));
180 expect(math.approxEq(f64, r.fpart, 0.978123, epsilon));180 expect(math.approxEqAbs(f64, r.fpart, 0.978123, epsilon));
181181
182 r = modf64(43874.3);182 r = modf64(43874.3);
183 expect(math.approxEq(f64, r.ipart, 43874, epsilon));183 expect(math.approxEqAbs(f64, r.ipart, 43874, epsilon));
184 expect(math.approxEq(f64, r.fpart, 0.3, epsilon));184 expect(math.approxEqAbs(f64, r.fpart, 0.3, epsilon));
185185
186 r = modf64(1234.340780);186 r = modf64(1234.340780);
187 expect(math.approxEq(f64, r.ipart, 1234, epsilon));187 expect(math.approxEqAbs(f64, r.ipart, 1234, epsilon));
188 expect(math.approxEq(f64, r.fpart, 0.340780, epsilon));188 expect(math.approxEqAbs(f64, r.fpart, 0.340780, epsilon));
189}189}
190190
191test "math.modf32.special" {191test "math.modf32.special" {
lib/std/math/pow.zig+14-14
...@@ -191,19 +191,19 @@ fn isOddInteger(x: f64) bool {...@@ -191,19 +191,19 @@ fn isOddInteger(x: f64) bool {
191test "math.pow" {191test "math.pow" {
192 const epsilon = 0.000001;192 const epsilon = 0.000001;
193193
194 expect(math.approxEq(f32, pow(f32, 0.0, 3.3), 0.0, epsilon));194 expect(math.approxEqAbs(f32, pow(f32, 0.0, 3.3), 0.0, epsilon));
195 expect(math.approxEq(f32, pow(f32, 0.8923, 3.3), 0.686572, epsilon));195 expect(math.approxEqAbs(f32, pow(f32, 0.8923, 3.3), 0.686572, epsilon));
196 expect(math.approxEq(f32, pow(f32, 0.2, 3.3), 0.004936, epsilon));196 expect(math.approxEqAbs(f32, pow(f32, 0.2, 3.3), 0.004936, epsilon));
197 expect(math.approxEq(f32, pow(f32, 1.5, 3.3), 3.811546, epsilon));197 expect(math.approxEqAbs(f32, pow(f32, 1.5, 3.3), 3.811546, epsilon));
198 expect(math.approxEq(f32, pow(f32, 37.45, 3.3), 155736.703125, epsilon));198 expect(math.approxEqAbs(f32, pow(f32, 37.45, 3.3), 155736.703125, epsilon));
199 expect(math.approxEq(f32, pow(f32, 89.123, 3.3), 2722489.5, epsilon));199 expect(math.approxEqAbs(f32, pow(f32, 89.123, 3.3), 2722489.5, epsilon));
200200
201 expect(math.approxEq(f64, pow(f64, 0.0, 3.3), 0.0, epsilon));201 expect(math.approxEqAbs(f64, pow(f64, 0.0, 3.3), 0.0, epsilon));
202 expect(math.approxEq(f64, pow(f64, 0.8923, 3.3), 0.686572, epsilon));202 expect(math.approxEqAbs(f64, pow(f64, 0.8923, 3.3), 0.686572, epsilon));
203 expect(math.approxEq(f64, pow(f64, 0.2, 3.3), 0.004936, epsilon));203 expect(math.approxEqAbs(f64, pow(f64, 0.2, 3.3), 0.004936, epsilon));
204 expect(math.approxEq(f64, pow(f64, 1.5, 3.3), 3.811546, epsilon));204 expect(math.approxEqAbs(f64, pow(f64, 1.5, 3.3), 3.811546, epsilon));
205 expect(math.approxEq(f64, pow(f64, 37.45, 3.3), 155736.7160616, epsilon));205 expect(math.approxEqAbs(f64, pow(f64, 37.45, 3.3), 155736.7160616, epsilon));
206 expect(math.approxEq(f64, pow(f64, 89.123, 3.3), 2722490.231436, epsilon));206 expect(math.approxEqAbs(f64, pow(f64, 89.123, 3.3), 2722490.231436, epsilon));
207}207}
208208
209test "math.pow.special" {209test "math.pow.special" {
...@@ -230,8 +230,8 @@ test "math.pow.special" {...@@ -230,8 +230,8 @@ test "math.pow.special" {
230 expect(pow(f32, -0.0, 1.0) == -0.0);230 expect(pow(f32, -0.0, 1.0) == -0.0);
231 expect(pow(f32, 0.0, 2.0) == 0.0);231 expect(pow(f32, 0.0, 2.0) == 0.0);
232 expect(pow(f32, -0.0, 2.0) == 0.0);232 expect(pow(f32, -0.0, 2.0) == 0.0);
233 expect(math.approxEq(f32, pow(f32, -1.0, math.inf(f32)), 1.0, epsilon));233 expect(math.approxEqAbs(f32, pow(f32, -1.0, math.inf(f32)), 1.0, epsilon));
234 expect(math.approxEq(f32, pow(f32, -1.0, -math.inf(f32)), 1.0, epsilon));234 expect(math.approxEqAbs(f32, pow(f32, -1.0, -math.inf(f32)), 1.0, epsilon));
235 expect(math.isPositiveInf(pow(f32, 1.2, math.inf(f32))));235 expect(math.isPositiveInf(pow(f32, 1.2, math.inf(f32))));
236 expect(math.isPositiveInf(pow(f32, -1.2, math.inf(f32))));236 expect(math.isPositiveInf(pow(f32, -1.2, math.inf(f32))));
237 expect(pow(f32, 1.2, -math.inf(f32)) == 0.0);237 expect(pow(f32, 1.2, -math.inf(f32)) == 0.0);
lib/std/math/sin.zig+14-14
...@@ -97,25 +97,25 @@ test "math.sin" {...@@ -97,25 +97,25 @@ test "math.sin" {
97test "math.sin32" {97test "math.sin32" {
98 const epsilon = 0.000001;98 const epsilon = 0.000001;
9999
100 expect(math.approxEq(f32, sin_(f32, 0.0), 0.0, epsilon));100 expect(math.approxEqAbs(f32, sin_(f32, 0.0), 0.0, epsilon));
101 expect(math.approxEq(f32, sin_(f32, 0.2), 0.198669, epsilon));101 expect(math.approxEqAbs(f32, sin_(f32, 0.2), 0.198669, epsilon));
102 expect(math.approxEq(f32, sin_(f32, 0.8923), 0.778517, epsilon));102 expect(math.approxEqAbs(f32, sin_(f32, 0.8923), 0.778517, epsilon));
103 expect(math.approxEq(f32, sin_(f32, 1.5), 0.997495, epsilon));103 expect(math.approxEqAbs(f32, sin_(f32, 1.5), 0.997495, epsilon));
104 expect(math.approxEq(f32, sin_(f32, -1.5), -0.997495, epsilon));104 expect(math.approxEqAbs(f32, sin_(f32, -1.5), -0.997495, epsilon));
105 expect(math.approxEq(f32, sin_(f32, 37.45), -0.246544, epsilon));105 expect(math.approxEqAbs(f32, sin_(f32, 37.45), -0.246544, epsilon));
106 expect(math.approxEq(f32, sin_(f32, 89.123), 0.916166, epsilon));106 expect(math.approxEqAbs(f32, sin_(f32, 89.123), 0.916166, epsilon));
107}107}
108108
109test "math.sin64" {109test "math.sin64" {
110 const epsilon = 0.000001;110 const epsilon = 0.000001;
111111
112 expect(math.approxEq(f64, sin_(f64, 0.0), 0.0, epsilon));112 expect(math.approxEqAbs(f64, sin_(f64, 0.0), 0.0, epsilon));
113 expect(math.approxEq(f64, sin_(f64, 0.2), 0.198669, epsilon));113 expect(math.approxEqAbs(f64, sin_(f64, 0.2), 0.198669, epsilon));
114 expect(math.approxEq(f64, sin_(f64, 0.8923), 0.778517, epsilon));114 expect(math.approxEqAbs(f64, sin_(f64, 0.8923), 0.778517, epsilon));
115 expect(math.approxEq(f64, sin_(f64, 1.5), 0.997495, epsilon));115 expect(math.approxEqAbs(f64, sin_(f64, 1.5), 0.997495, epsilon));
116 expect(math.approxEq(f64, sin_(f64, -1.5), -0.997495, epsilon));116 expect(math.approxEqAbs(f64, sin_(f64, -1.5), -0.997495, epsilon));
117 expect(math.approxEq(f64, sin_(f64, 37.45), -0.246543, epsilon));117 expect(math.approxEqAbs(f64, sin_(f64, 37.45), -0.246543, epsilon));
118 expect(math.approxEq(f64, sin_(f64, 89.123), 0.916166, epsilon));118 expect(math.approxEqAbs(f64, sin_(f64, 89.123), 0.916166, epsilon));
119}119}
120120
121test "math.sin32.special" {121test "math.sin32.special" {
lib/std/math/sinh.zig+16-16
...@@ -105,27 +105,27 @@ test "math.sinh" {...@@ -105,27 +105,27 @@ test "math.sinh" {
105test "math.sinh32" {105test "math.sinh32" {
106 const epsilon = 0.000001;106 const epsilon = 0.000001;
107107
108 expect(math.approxEq(f32, sinh32(0.0), 0.0, epsilon));108 expect(math.approxEqAbs(f32, sinh32(0.0), 0.0, epsilon));
109 expect(math.approxEq(f32, sinh32(0.2), 0.201336, epsilon));109 expect(math.approxEqAbs(f32, sinh32(0.2), 0.201336, epsilon));
110 expect(math.approxEq(f32, sinh32(0.8923), 1.015512, epsilon));110 expect(math.approxEqAbs(f32, sinh32(0.8923), 1.015512, epsilon));
111 expect(math.approxEq(f32, sinh32(1.5), 2.129279, epsilon));111 expect(math.approxEqAbs(f32, sinh32(1.5), 2.129279, epsilon));
112 expect(math.approxEq(f32, sinh32(-0.0), -0.0, epsilon));112 expect(math.approxEqAbs(f32, sinh32(-0.0), -0.0, epsilon));
113 expect(math.approxEq(f32, sinh32(-0.2), -0.201336, epsilon));113 expect(math.approxEqAbs(f32, sinh32(-0.2), -0.201336, epsilon));
114 expect(math.approxEq(f32, sinh32(-0.8923), -1.015512, epsilon));114 expect(math.approxEqAbs(f32, sinh32(-0.8923), -1.015512, epsilon));
115 expect(math.approxEq(f32, sinh32(-1.5), -2.129279, epsilon));115 expect(math.approxEqAbs(f32, sinh32(-1.5), -2.129279, epsilon));
116}116}
117117
118test "math.sinh64" {118test "math.sinh64" {
119 const epsilon = 0.000001;119 const epsilon = 0.000001;
120120
121 expect(math.approxEq(f64, sinh64(0.0), 0.0, epsilon));121 expect(math.approxEqAbs(f64, sinh64(0.0), 0.0, epsilon));
122 expect(math.approxEq(f64, sinh64(0.2), 0.201336, epsilon));122 expect(math.approxEqAbs(f64, sinh64(0.2), 0.201336, epsilon));
123 expect(math.approxEq(f64, sinh64(0.8923), 1.015512, epsilon));123 expect(math.approxEqAbs(f64, sinh64(0.8923), 1.015512, epsilon));
124 expect(math.approxEq(f64, sinh64(1.5), 2.129279, epsilon));124 expect(math.approxEqAbs(f64, sinh64(1.5), 2.129279, epsilon));
125 expect(math.approxEq(f64, sinh64(-0.0), -0.0, epsilon));125 expect(math.approxEqAbs(f64, sinh64(-0.0), -0.0, epsilon));
126 expect(math.approxEq(f64, sinh64(-0.2), -0.201336, epsilon));126 expect(math.approxEqAbs(f64, sinh64(-0.2), -0.201336, epsilon));
127 expect(math.approxEq(f64, sinh64(-0.8923), -1.015512, epsilon));127 expect(math.approxEqAbs(f64, sinh64(-0.8923), -1.015512, epsilon));
128 expect(math.approxEq(f64, sinh64(-1.5), -2.129279, epsilon));128 expect(math.approxEqAbs(f64, sinh64(-1.5), -2.129279, epsilon));
129}129}
130130
131test "math.sinh32.special" {131test "math.sinh32.special" {
lib/std/math/tan.zig+12-12
...@@ -87,23 +87,23 @@ test "math.tan" {...@@ -87,23 +87,23 @@ test "math.tan" {
87test "math.tan32" {87test "math.tan32" {
88 const epsilon = 0.000001;88 const epsilon = 0.000001;
8989
90 expect(math.approxEq(f32, tan_(f32, 0.0), 0.0, epsilon));90 expect(math.approxEqAbs(f32, tan_(f32, 0.0), 0.0, epsilon));
91 expect(math.approxEq(f32, tan_(f32, 0.2), 0.202710, epsilon));91 expect(math.approxEqAbs(f32, tan_(f32, 0.2), 0.202710, epsilon));
92 expect(math.approxEq(f32, tan_(f32, 0.8923), 1.240422, epsilon));92 expect(math.approxEqAbs(f32, tan_(f32, 0.8923), 1.240422, epsilon));
93 expect(math.approxEq(f32, tan_(f32, 1.5), 14.101420, epsilon));93 expect(math.approxEqAbs(f32, tan_(f32, 1.5), 14.101420, epsilon));
94 expect(math.approxEq(f32, tan_(f32, 37.45), -0.254397, epsilon));94 expect(math.approxEqAbs(f32, tan_(f32, 37.45), -0.254397, epsilon));
95 expect(math.approxEq(f32, tan_(f32, 89.123), 2.285852, epsilon));95 expect(math.approxEqAbs(f32, tan_(f32, 89.123), 2.285852, epsilon));
96}96}
9797
98test "math.tan64" {98test "math.tan64" {
99 const epsilon = 0.000001;99 const epsilon = 0.000001;
100100
101 expect(math.approxEq(f64, tan_(f64, 0.0), 0.0, epsilon));101 expect(math.approxEqAbs(f64, tan_(f64, 0.0), 0.0, epsilon));
102 expect(math.approxEq(f64, tan_(f64, 0.2), 0.202710, epsilon));102 expect(math.approxEqAbs(f64, tan_(f64, 0.2), 0.202710, epsilon));
103 expect(math.approxEq(f64, tan_(f64, 0.8923), 1.240422, epsilon));103 expect(math.approxEqAbs(f64, tan_(f64, 0.8923), 1.240422, epsilon));
104 expect(math.approxEq(f64, tan_(f64, 1.5), 14.101420, epsilon));104 expect(math.approxEqAbs(f64, tan_(f64, 1.5), 14.101420, epsilon));
105 expect(math.approxEq(f64, tan_(f64, 37.45), -0.254397, epsilon));105 expect(math.approxEqAbs(f64, tan_(f64, 37.45), -0.254397, epsilon));
106 expect(math.approxEq(f64, tan_(f64, 89.123), 2.2858376, epsilon));106 expect(math.approxEqAbs(f64, tan_(f64, 89.123), 2.2858376, epsilon));
107}107}
108108
109test "math.tan32.special" {109test "math.tan32.special" {
lib/std/math/tanh.zig+10-10
...@@ -131,21 +131,21 @@ test "math.tanh" {...@@ -131,21 +131,21 @@ test "math.tanh" {
131test "math.tanh32" {131test "math.tanh32" {
132 const epsilon = 0.000001;132 const epsilon = 0.000001;
133133
134 expect(math.approxEq(f32, tanh32(0.0), 0.0, epsilon));134 expect(math.approxEqAbs(f32, tanh32(0.0), 0.0, epsilon));
135 expect(math.approxEq(f32, tanh32(0.2), 0.197375, epsilon));135 expect(math.approxEqAbs(f32, tanh32(0.2), 0.197375, epsilon));
136 expect(math.approxEq(f32, tanh32(0.8923), 0.712528, epsilon));136 expect(math.approxEqAbs(f32, tanh32(0.8923), 0.712528, epsilon));
137 expect(math.approxEq(f32, tanh32(1.5), 0.905148, epsilon));137 expect(math.approxEqAbs(f32, tanh32(1.5), 0.905148, epsilon));
138 expect(math.approxEq(f32, tanh32(37.45), 1.0, epsilon));138 expect(math.approxEqAbs(f32, tanh32(37.45), 1.0, epsilon));
139}139}
140140
141test "math.tanh64" {141test "math.tanh64" {
142 const epsilon = 0.000001;142 const epsilon = 0.000001;
143143
144 expect(math.approxEq(f64, tanh64(0.0), 0.0, epsilon));144 expect(math.approxEqAbs(f64, tanh64(0.0), 0.0, epsilon));
145 expect(math.approxEq(f64, tanh64(0.2), 0.197375, epsilon));145 expect(math.approxEqAbs(f64, tanh64(0.2), 0.197375, epsilon));
146 expect(math.approxEq(f64, tanh64(0.8923), 0.712528, epsilon));146 expect(math.approxEqAbs(f64, tanh64(0.8923), 0.712528, epsilon));
147 expect(math.approxEq(f64, tanh64(1.5), 0.905148, epsilon));147 expect(math.approxEqAbs(f64, tanh64(1.5), 0.905148, epsilon));
148 expect(math.approxEq(f64, tanh64(37.45), 1.0, epsilon));148 expect(math.approxEqAbs(f64, tanh64(37.45), 1.0, epsilon));
149}149}
150150
151test "math.tanh32.special" {151test "math.tanh32.special" {
lib/std/special/c.zig+12-12
...@@ -912,14 +912,14 @@ test "sqrt" {...@@ -912,14 +912,14 @@ test "sqrt" {
912 const epsilon = 0.000001;912 const epsilon = 0.000001;
913913
914 std.testing.expect(sqrt(0.0) == 0.0);914 std.testing.expect(sqrt(0.0) == 0.0);
915 std.testing.expect(std.math.approxEq(f64, sqrt(2.0), 1.414214, epsilon));915 std.testing.expect(std.math.approxEqAbs(f64, sqrt(2.0), 1.414214, epsilon));
916 std.testing.expect(std.math.approxEq(f64, sqrt(3.6), 1.897367, epsilon));916 std.testing.expect(std.math.approxEqAbs(f64, sqrt(3.6), 1.897367, epsilon));
917 std.testing.expect(sqrt(4.0) == 2.0);917 std.testing.expect(sqrt(4.0) == 2.0);
918 std.testing.expect(std.math.approxEq(f64, sqrt(7.539840), 2.745877, epsilon));918 std.testing.expect(std.math.approxEqAbs(f64, sqrt(7.539840), 2.745877, epsilon));
919 std.testing.expect(std.math.approxEq(f64, sqrt(19.230934), 4.385309, epsilon));919 std.testing.expect(std.math.approxEqAbs(f64, sqrt(19.230934), 4.385309, epsilon));
920 std.testing.expect(sqrt(64.0) == 8.0);920 std.testing.expect(sqrt(64.0) == 8.0);
921 std.testing.expect(std.math.approxEq(f64, sqrt(64.1), 8.006248, epsilon));921 std.testing.expect(std.math.approxEqAbs(f64, sqrt(64.1), 8.006248, epsilon));
922 std.testing.expect(std.math.approxEq(f64, sqrt(8942.230469), 94.563367, epsilon));922 std.testing.expect(std.math.approxEqAbs(f64, sqrt(8942.230469), 94.563367, epsilon));
923}923}
924924
925test "sqrt special" {925test "sqrt special" {
...@@ -1010,14 +1010,14 @@ test "sqrtf" {...@@ -1010,14 +1010,14 @@ test "sqrtf" {
1010 const epsilon = 0.000001;1010 const epsilon = 0.000001;
10111011
1012 std.testing.expect(sqrtf(0.0) == 0.0);1012 std.testing.expect(sqrtf(0.0) == 0.0);
1013 std.testing.expect(std.math.approxEq(f32, sqrtf(2.0), 1.414214, epsilon));1013 std.testing.expect(std.math.approxEqAbs(f32, sqrtf(2.0), 1.414214, epsilon));
1014 std.testing.expect(std.math.approxEq(f32, sqrtf(3.6), 1.897367, epsilon));1014 std.testing.expect(std.math.approxEqAbs(f32, sqrtf(3.6), 1.897367, epsilon));
1015 std.testing.expect(sqrtf(4.0) == 2.0);1015 std.testing.expect(sqrtf(4.0) == 2.0);
1016 std.testing.expect(std.math.approxEq(f32, sqrtf(7.539840), 2.745877, epsilon));1016 std.testing.expect(std.math.approxEqAbs(f32, sqrtf(7.539840), 2.745877, epsilon));
1017 std.testing.expect(std.math.approxEq(f32, sqrtf(19.230934), 4.385309, epsilon));1017 std.testing.expect(std.math.approxEqAbs(f32, sqrtf(19.230934), 4.385309, epsilon));
1018 std.testing.expect(sqrtf(64.0) == 8.0);1018 std.testing.expect(sqrtf(64.0) == 8.0);
1019 std.testing.expect(std.math.approxEq(f32, sqrtf(64.1), 8.006248, epsilon));1019 std.testing.expect(std.math.approxEqAbs(f32, sqrtf(64.1), 8.006248, epsilon));
1020 std.testing.expect(std.math.approxEq(f32, sqrtf(8942.230469), 94.563370, epsilon));1020 std.testing.expect(std.math.approxEqAbs(f32, sqrtf(8942.230469), 94.563370, epsilon));
1021}1021}
10221022
1023test "sqrtf special" {1023test "sqrtf special" {
test/stage1/behavior/floatop.zig+56-56
...@@ -21,7 +21,7 @@ fn testSqrt() void {...@@ -21,7 +21,7 @@ fn testSqrt() void {
21 var a: f32 = 9;21 var a: f32 = 9;
22 expect(@sqrt(a) == 3);22 expect(@sqrt(a) == 3);
23 var b: f32 = 1.1;23 var b: f32 = 1.1;
24 expect(math.approxEq(f32, @sqrt(b), 1.0488088481701516, epsilon));24 expect(math.approxEqAbs(f32, @sqrt(b), 1.0488088481701516, epsilon));
25 }25 }
26 {26 {
27 var a: f64 = 25;27 var a: f64 = 25;
...@@ -39,24 +39,24 @@ fn testSqrt() void {...@@ -39,24 +39,24 @@ fn testSqrt() void {
39 {39 {
40 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 3.3, 4.4 };40 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 3.3, 4.4 };
41 var result = @sqrt(v);41 var result = @sqrt(v);
42 expect(math.approxEq(f32, @sqrt(@as(f32, 1.1)), result[0], epsilon));42 expect(math.approxEqAbs(f32, @sqrt(@as(f32, 1.1)), result[0], epsilon));
43 expect(math.approxEq(f32, @sqrt(@as(f32, 2.2)), result[1], epsilon));43 expect(math.approxEqAbs(f32, @sqrt(@as(f32, 2.2)), result[1], epsilon));
44 expect(math.approxEq(f32, @sqrt(@as(f32, 3.3)), result[2], epsilon));44 expect(math.approxEqAbs(f32, @sqrt(@as(f32, 3.3)), result[2], epsilon));
45 expect(math.approxEq(f32, @sqrt(@as(f32, 4.4)), result[3], epsilon));45 expect(math.approxEqAbs(f32, @sqrt(@as(f32, 4.4)), result[3], epsilon));
46 }46 }
47}47}
4848
49test "more @sqrt f16 tests" {49test "more @sqrt f16 tests" {
50 // TODO these are not all passing at comptime50 // TODO these are not all passing at comptime
51 expect(@sqrt(@as(f16, 0.0)) == 0.0);51 expect(@sqrt(@as(f16, 0.0)) == 0.0);
52 expect(math.approxEq(f16, @sqrt(@as(f16, 2.0)), 1.414214, epsilon));52 expect(math.approxEqAbs(f16, @sqrt(@as(f16, 2.0)), 1.414214, epsilon));
53 expect(math.approxEq(f16, @sqrt(@as(f16, 3.6)), 1.897367, epsilon));53 expect(math.approxEqAbs(f16, @sqrt(@as(f16, 3.6)), 1.897367, epsilon));
54 expect(@sqrt(@as(f16, 4.0)) == 2.0);54 expect(@sqrt(@as(f16, 4.0)) == 2.0);
55 expect(math.approxEq(f16, @sqrt(@as(f16, 7.539840)), 2.745877, epsilon));55 expect(math.approxEqAbs(f16, @sqrt(@as(f16, 7.539840)), 2.745877, epsilon));
56 expect(math.approxEq(f16, @sqrt(@as(f16, 19.230934)), 4.385309, epsilon));56 expect(math.approxEqAbs(f16, @sqrt(@as(f16, 19.230934)), 4.385309, epsilon));
57 expect(@sqrt(@as(f16, 64.0)) == 8.0);57 expect(@sqrt(@as(f16, 64.0)) == 8.0);
58 expect(math.approxEq(f16, @sqrt(@as(f16, 64.1)), 8.006248, epsilon));58 expect(math.approxEqAbs(f16, @sqrt(@as(f16, 64.1)), 8.006248, epsilon));
59 expect(math.approxEq(f16, @sqrt(@as(f16, 8942.230469)), 94.563370, epsilon));59 expect(math.approxEqAbs(f16, @sqrt(@as(f16, 8942.230469)), 94.563370, epsilon));
6060
61 // special cases61 // special cases
62 expect(math.isPositiveInf(@sqrt(@as(f16, math.inf(f16)))));62 expect(math.isPositiveInf(@sqrt(@as(f16, math.inf(f16)))));
...@@ -89,10 +89,10 @@ fn testSin() void {...@@ -89,10 +89,10 @@ fn testSin() void {
89 {89 {
90 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 3.3, 4.4 };90 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 3.3, 4.4 };
91 var result = @sin(v);91 var result = @sin(v);
92 expect(math.approxEq(f32, @sin(@as(f32, 1.1)), result[0], epsilon));92 expect(math.approxEqAbs(f32, @sin(@as(f32, 1.1)), result[0], epsilon));
93 expect(math.approxEq(f32, @sin(@as(f32, 2.2)), result[1], epsilon));93 expect(math.approxEqAbs(f32, @sin(@as(f32, 2.2)), result[1], epsilon));
94 expect(math.approxEq(f32, @sin(@as(f32, 3.3)), result[2], epsilon));94 expect(math.approxEqAbs(f32, @sin(@as(f32, 3.3)), result[2], epsilon));
95 expect(math.approxEq(f32, @sin(@as(f32, 4.4)), result[3], epsilon));95 expect(math.approxEqAbs(f32, @sin(@as(f32, 4.4)), result[3], epsilon));
96 }96 }
97}97}
9898
...@@ -119,10 +119,10 @@ fn testCos() void {...@@ -119,10 +119,10 @@ fn testCos() void {
119 {119 {
120 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 3.3, 4.4 };120 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 3.3, 4.4 };
121 var result = @cos(v);121 var result = @cos(v);
122 expect(math.approxEq(f32, @cos(@as(f32, 1.1)), result[0], epsilon));122 expect(math.approxEqAbs(f32, @cos(@as(f32, 1.1)), result[0], epsilon));
123 expect(math.approxEq(f32, @cos(@as(f32, 2.2)), result[1], epsilon));123 expect(math.approxEqAbs(f32, @cos(@as(f32, 2.2)), result[1], epsilon));
124 expect(math.approxEq(f32, @cos(@as(f32, 3.3)), result[2], epsilon));124 expect(math.approxEqAbs(f32, @cos(@as(f32, 3.3)), result[2], epsilon));
125 expect(math.approxEq(f32, @cos(@as(f32, 4.4)), result[3], epsilon));125 expect(math.approxEqAbs(f32, @cos(@as(f32, 4.4)), result[3], epsilon));
126 }126 }
127}127}
128128
...@@ -149,10 +149,10 @@ fn testExp() void {...@@ -149,10 +149,10 @@ fn testExp() void {
149 {149 {
150 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 0.3, 0.4 };150 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 0.3, 0.4 };
151 var result = @exp(v);151 var result = @exp(v);
152 expect(math.approxEq(f32, @exp(@as(f32, 1.1)), result[0], epsilon));152 expect(math.approxEqAbs(f32, @exp(@as(f32, 1.1)), result[0], epsilon));
153 expect(math.approxEq(f32, @exp(@as(f32, 2.2)), result[1], epsilon));153 expect(math.approxEqAbs(f32, @exp(@as(f32, 2.2)), result[1], epsilon));
154 expect(math.approxEq(f32, @exp(@as(f32, 0.3)), result[2], epsilon));154 expect(math.approxEqAbs(f32, @exp(@as(f32, 0.3)), result[2], epsilon));
155 expect(math.approxEq(f32, @exp(@as(f32, 0.4)), result[3], epsilon));155 expect(math.approxEqAbs(f32, @exp(@as(f32, 0.4)), result[3], epsilon));
156 }156 }
157}157}
158158
...@@ -179,10 +179,10 @@ fn testExp2() void {...@@ -179,10 +179,10 @@ fn testExp2() void {
179 {179 {
180 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 0.3, 0.4 };180 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 0.3, 0.4 };
181 var result = @exp2(v);181 var result = @exp2(v);
182 expect(math.approxEq(f32, @exp2(@as(f32, 1.1)), result[0], epsilon));182 expect(math.approxEqAbs(f32, @exp2(@as(f32, 1.1)), result[0], epsilon));
183 expect(math.approxEq(f32, @exp2(@as(f32, 2.2)), result[1], epsilon));183 expect(math.approxEqAbs(f32, @exp2(@as(f32, 2.2)), result[1], epsilon));
184 expect(math.approxEq(f32, @exp2(@as(f32, 0.3)), result[2], epsilon));184 expect(math.approxEqAbs(f32, @exp2(@as(f32, 0.3)), result[2], epsilon));
185 expect(math.approxEq(f32, @exp2(@as(f32, 0.4)), result[3], epsilon));185 expect(math.approxEqAbs(f32, @exp2(@as(f32, 0.4)), result[3], epsilon));
186 }186 }
187}187}
188188
...@@ -198,7 +198,7 @@ fn testLog() void {...@@ -198,7 +198,7 @@ fn testLog() void {
198 // https://github.com/ziglang/zig/issues/4026198 // https://github.com/ziglang/zig/issues/4026
199 {199 {
200 var a: f16 = e;200 var a: f16 = e;
201 expect(math.approxEq(f16, @log(a), 1, epsilon));201 expect(math.approxEqAbs(f16, @log(a), 1, epsilon));
202 }202 }
203 {203 {
204 var a: f32 = e;204 var a: f32 = e;
...@@ -211,10 +211,10 @@ fn testLog() void {...@@ -211,10 +211,10 @@ fn testLog() void {
211 {211 {
212 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 0.3, 0.4 };212 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 0.3, 0.4 };
213 var result = @log(v);213 var result = @log(v);
214 expect(math.approxEq(f32, @log(@as(f32, 1.1)), result[0], epsilon));214 expect(math.approxEqAbs(f32, @log(@as(f32, 1.1)), result[0], epsilon));
215 expect(math.approxEq(f32, @log(@as(f32, 2.2)), result[1], epsilon));215 expect(math.approxEqAbs(f32, @log(@as(f32, 2.2)), result[1], epsilon));
216 expect(math.approxEq(f32, @log(@as(f32, 0.3)), result[2], epsilon));216 expect(math.approxEqAbs(f32, @log(@as(f32, 0.3)), result[2], epsilon));
217 expect(math.approxEq(f32, @log(@as(f32, 0.4)), result[3], epsilon));217 expect(math.approxEqAbs(f32, @log(@as(f32, 0.4)), result[3], epsilon));
218 }218 }
219}219}
220220
...@@ -241,10 +241,10 @@ fn testLog2() void {...@@ -241,10 +241,10 @@ fn testLog2() void {
241 {241 {
242 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 0.3, 0.4 };242 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 0.3, 0.4 };
243 var result = @log2(v);243 var result = @log2(v);
244 expect(math.approxEq(f32, @log2(@as(f32, 1.1)), result[0], epsilon));244 expect(math.approxEqAbs(f32, @log2(@as(f32, 1.1)), result[0], epsilon));
245 expect(math.approxEq(f32, @log2(@as(f32, 2.2)), result[1], epsilon));245 expect(math.approxEqAbs(f32, @log2(@as(f32, 2.2)), result[1], epsilon));
246 expect(math.approxEq(f32, @log2(@as(f32, 0.3)), result[2], epsilon));246 expect(math.approxEqAbs(f32, @log2(@as(f32, 0.3)), result[2], epsilon));
247 expect(math.approxEq(f32, @log2(@as(f32, 0.4)), result[3], epsilon));247 expect(math.approxEqAbs(f32, @log2(@as(f32, 0.4)), result[3], epsilon));
248 }248 }
249}249}
250250
...@@ -271,10 +271,10 @@ fn testLog10() void {...@@ -271,10 +271,10 @@ fn testLog10() void {
271 {271 {
272 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 0.3, 0.4 };272 var v: Vector(4, f32) = [_]f32{ 1.1, 2.2, 0.3, 0.4 };
273 var result = @log10(v);273 var result = @log10(v);
274 expect(math.approxEq(f32, @log10(@as(f32, 1.1)), result[0], epsilon));274 expect(math.approxEqAbs(f32, @log10(@as(f32, 1.1)), result[0], epsilon));
275 expect(math.approxEq(f32, @log10(@as(f32, 2.2)), result[1], epsilon));275 expect(math.approxEqAbs(f32, @log10(@as(f32, 2.2)), result[1], epsilon));
276 expect(math.approxEq(f32, @log10(@as(f32, 0.3)), result[2], epsilon));276 expect(math.approxEqAbs(f32, @log10(@as(f32, 0.3)), result[2], epsilon));
277 expect(math.approxEq(f32, @log10(@as(f32, 0.4)), result[3], epsilon));277 expect(math.approxEqAbs(f32, @log10(@as(f32, 0.4)), result[3], epsilon));
278 }278 }
279}279}
280280
...@@ -307,10 +307,10 @@ fn testFabs() void {...@@ -307,10 +307,10 @@ fn testFabs() void {
307 {307 {
308 var v: Vector(4, f32) = [_]f32{ 1.1, -2.2, 0.3, -0.4 };308 var v: Vector(4, f32) = [_]f32{ 1.1, -2.2, 0.3, -0.4 };
309 var result = @fabs(v);309 var result = @fabs(v);
310 expect(math.approxEq(f32, @fabs(@as(f32, 1.1)), result[0], epsilon));310 expect(math.approxEqAbs(f32, @fabs(@as(f32, 1.1)), result[0], epsilon));
311 expect(math.approxEq(f32, @fabs(@as(f32, -2.2)), result[1], epsilon));311 expect(math.approxEqAbs(f32, @fabs(@as(f32, -2.2)), result[1], epsilon));
312 expect(math.approxEq(f32, @fabs(@as(f32, 0.3)), result[2], epsilon));312 expect(math.approxEqAbs(f32, @fabs(@as(f32, 0.3)), result[2], epsilon));
313 expect(math.approxEq(f32, @fabs(@as(f32, -0.4)), result[3], epsilon));313 expect(math.approxEqAbs(f32, @fabs(@as(f32, -0.4)), result[3], epsilon));
314 }314 }
315}315}
316316
...@@ -337,10 +337,10 @@ fn testFloor() void {...@@ -337,10 +337,10 @@ fn testFloor() void {
337 {337 {
338 var v: Vector(4, f32) = [_]f32{ 1.1, -2.2, 0.3, -0.4 };338 var v: Vector(4, f32) = [_]f32{ 1.1, -2.2, 0.3, -0.4 };
339 var result = @floor(v);339 var result = @floor(v);
340 expect(math.approxEq(f32, @floor(@as(f32, 1.1)), result[0], epsilon));340 expect(math.approxEqAbs(f32, @floor(@as(f32, 1.1)), result[0], epsilon));
341 expect(math.approxEq(f32, @floor(@as(f32, -2.2)), result[1], epsilon));341 expect(math.approxEqAbs(f32, @floor(@as(f32, -2.2)), result[1], epsilon));
342 expect(math.approxEq(f32, @floor(@as(f32, 0.3)), result[2], epsilon));342 expect(math.approxEqAbs(f32, @floor(@as(f32, 0.3)), result[2], epsilon));
343 expect(math.approxEq(f32, @floor(@as(f32, -0.4)), result[3], epsilon));343 expect(math.approxEqAbs(f32, @floor(@as(f32, -0.4)), result[3], epsilon));
344 }344 }
345}345}
346346
...@@ -367,10 +367,10 @@ fn testCeil() void {...@@ -367,10 +367,10 @@ fn testCeil() void {
367 {367 {
368 var v: Vector(4, f32) = [_]f32{ 1.1, -2.2, 0.3, -0.4 };368 var v: Vector(4, f32) = [_]f32{ 1.1, -2.2, 0.3, -0.4 };
369 var result = @ceil(v);369 var result = @ceil(v);
370 expect(math.approxEq(f32, @ceil(@as(f32, 1.1)), result[0], epsilon));370 expect(math.approxEqAbs(f32, @ceil(@as(f32, 1.1)), result[0], epsilon));
371 expect(math.approxEq(f32, @ceil(@as(f32, -2.2)), result[1], epsilon));371 expect(math.approxEqAbs(f32, @ceil(@as(f32, -2.2)), result[1], epsilon));
372 expect(math.approxEq(f32, @ceil(@as(f32, 0.3)), result[2], epsilon));372 expect(math.approxEqAbs(f32, @ceil(@as(f32, 0.3)), result[2], epsilon));
373 expect(math.approxEq(f32, @ceil(@as(f32, -0.4)), result[3], epsilon));373 expect(math.approxEqAbs(f32, @ceil(@as(f32, -0.4)), result[3], epsilon));
374 }374 }
375}375}
376376
...@@ -397,10 +397,10 @@ fn testTrunc() void {...@@ -397,10 +397,10 @@ fn testTrunc() void {
397 {397 {
398 var v: Vector(4, f32) = [_]f32{ 1.1, -2.2, 0.3, -0.4 };398 var v: Vector(4, f32) = [_]f32{ 1.1, -2.2, 0.3, -0.4 };
399 var result = @trunc(v);399 var result = @trunc(v);
400 expect(math.approxEq(f32, @trunc(@as(f32, 1.1)), result[0], epsilon));400 expect(math.approxEqAbs(f32, @trunc(@as(f32, 1.1)), result[0], epsilon));
401 expect(math.approxEq(f32, @trunc(@as(f32, -2.2)), result[1], epsilon));401 expect(math.approxEqAbs(f32, @trunc(@as(f32, -2.2)), result[1], epsilon));
402 expect(math.approxEq(f32, @trunc(@as(f32, 0.3)), result[2], epsilon));402 expect(math.approxEqAbs(f32, @trunc(@as(f32, 0.3)), result[2], epsilon));
403 expect(math.approxEq(f32, @trunc(@as(f32, -0.4)), result[3], epsilon));403 expect(math.approxEqAbs(f32, @trunc(@as(f32, -0.4)), result[3], epsilon));
404 }404 }
405}405}
406406