Skip to content

Commit 650e358

Browse files
LewisGaulandrewrk
authored andcommitted
Add tests for log2()
1 parent 936cf57 commit 650e358

File tree

1 file changed

+62
-24
lines changed

1 file changed

+62
-24
lines changed

lib/compiler_rt/log2.zig

Lines changed: 62 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const std = @import("std");
88
const builtin = @import("builtin");
99
const math = std.math;
1010
const expect = std.testing.expect;
11+
const expectEqual = std.testing.expectEqual;
1112
const maxInt = std.math.maxInt;
1213
const arch = builtin.cpu.arch;
1314
const common = @import("common.zig");
@@ -179,36 +180,73 @@ pub fn log2l(x: c_longdouble) callconv(.c) c_longdouble {
179180
}
180181
}
181182

182-
test "log2_32" {
183-
const epsilon = 0.000001;
184-
185-
try expect(math.approxEqAbs(f32, log2f(0.2), -2.321928, epsilon));
186-
try expect(math.approxEqAbs(f32, log2f(0.8923), -0.164399, epsilon));
187-
try expect(math.approxEqAbs(f32, log2f(1.5), 0.584962, epsilon));
188-
try expect(math.approxEqAbs(f32, log2f(37.45), 5.226894, epsilon));
189-
try expect(math.approxEqAbs(f32, log2f(123123.234375), 16.909744, epsilon));
183+
test "log2f() special" {
184+
try expectEqual(log2f(0.0), -math.inf(f32));
185+
try expectEqual(log2f(-0.0), -math.inf(f32));
186+
try expectEqual(log2f(1.0), 0.0);
187+
try expectEqual(log2f(2.0), 1.0);
188+
try expectEqual(log2f(math.inf(f32)), math.inf(f32));
189+
try expect(math.isNan(log2f(-1.0)));
190+
try expect(math.isNan(log2f(-math.inf(f32))));
191+
try expect(math.isNan(log2f(math.nan(f32))));
192+
try expect(math.isNan(log2f(math.snan(f32))));
190193
}
191194

192-
test "log2_64" {
193-
const epsilon = 0.000001;
194-
195-
try expect(math.approxEqAbs(f64, log2(0.2), -2.321928, epsilon));
196-
try expect(math.approxEqAbs(f64, log2(0.8923), -0.164399, epsilon));
197-
try expect(math.approxEqAbs(f64, log2(1.5), 0.584962, epsilon));
198-
try expect(math.approxEqAbs(f64, log2(37.45), 5.226894, epsilon));
199-
try expect(math.approxEqAbs(f64, log2(123123.234375), 16.909744, epsilon));
195+
test "log2f() sanity" {
196+
try expect(math.isNan(log2f(-0x1.0223a0p+3)));
197+
try expectEqual(log2f(0x1.161868p+2), 0x1.0f49acp+1);
198+
try expect(math.isNan(log2f(-0x1.0c34b4p+3)));
199+
try expect(math.isNan(log2f(-0x1.a206f0p+2)));
200+
try expectEqual(log2f(0x1.288bbcp+3), 0x1.9b2676p+1);
201+
try expectEqual(log2f(0x1.52efd0p-1), -0x1.30b494p-1); // Disagrees with GCC in last bit
202+
try expect(math.isNan(log2f(-0x1.a05cc8p-2)));
203+
try expectEqual(log2f(0x1.1f9efap-1), -0x1.a9f89ap-1);
204+
try expectEqual(log2f(0x1.8c5db0p-1), -0x1.7a2c96p-2);
205+
try expect(math.isNan(log2f(-0x1.5b86eap-1)));
200206
}
201207

202-
test "log2_32.special" {
203-
try expect(math.isPositiveInf(log2f(math.inf(f32))));
204-
try expect(math.isNegativeInf(log2f(0.0)));
205-
try expect(math.isNan(log2f(-1.0)));
206-
try expect(math.isNan(log2f(math.nan(f32))));
208+
test "log2f() boundary" {
209+
try expectEqual(log2f(0x1.fffffep+127), 0x1p+7); // Max input value
210+
try expectEqual(log2f(0x1p-149), -0x1.2ap+7); // Min positive input value
211+
try expect(math.isNan(log2f(-0x1p-149))); // Min negative input value
212+
try expectEqual(log2f(0x1.000002p+0), 0x1.715474p-23); // Last value before result reaches +0
213+
try expectEqual(log2f(0x1.fffffep-1), -0x1.715478p-24); // Last value before result reaches -0
214+
try expectEqual(log2f(0x1p-126), -0x1.f8p+6); // First subnormal
215+
try expect(math.isNan(log2f(-0x1p-126))); // First negative subnormal
216+
207217
}
208218

209-
test "log2_64.special" {
210-
try expect(math.isPositiveInf(log2(math.inf(f64))));
211-
try expect(math.isNegativeInf(log2(0.0)));
219+
test "log2() special" {
220+
try expectEqual(log2(0.0), -math.inf(f64));
221+
try expectEqual(log2(-0.0), -math.inf(f64));
222+
try expectEqual(log2(1.0), 0.0);
223+
try expectEqual(log2(2.0), 1.0);
224+
try expectEqual(log2(math.inf(f64)), math.inf(f64));
212225
try expect(math.isNan(log2(-1.0)));
226+
try expect(math.isNan(log2(-math.inf(f64))));
213227
try expect(math.isNan(log2(math.nan(f64))));
228+
try expect(math.isNan(log2(math.snan(f64))));
229+
}
230+
231+
test "log2() sanity" {
232+
try expect(math.isNan(log2(-0x1.02239f3c6a8f1p+3)));
233+
try expectEqual(log2(0x1.161868e18bc67p+2), 0x1.0f49ac3838580p+1);
234+
try expect(math.isNan(log2(-0x1.0c34b3e01e6e7p+3)));
235+
try expect(math.isNan(log2(-0x1.a206f0a19dcc4p+2)));
236+
try expectEqual(log2(0x1.288bbb0d6a1e6p+3), 0x1.9b26760c2a57ep+1);
237+
try expectEqual(log2(0x1.52efd0cd80497p-1), -0x1.30b490ef684c7p-1);
238+
try expect(math.isNan(log2(-0x1.a05cc754481d1p-2)));
239+
try expectEqual(log2(0x1.1f9ef934745cbp-1), -0x1.a9f89b5f5acb8p-1);
240+
try expectEqual(log2(0x1.8c5db097f7442p-1), -0x1.7a2c947173f06p-2);
241+
try expect(math.isNan(log2(-0x1.5b86ea8118a0ep-1)));
242+
}
243+
244+
test "log2() boundary" {
245+
try expectEqual(log2(0x1.fffffffffffffp+1023), 0x1p+10); // Max input value
246+
try expectEqual(log2(0x1p-1074), -0x1.0c8p+10); // Min positive input value
247+
try expect(math.isNan(log2(-0x1p-1074))); // Min negative input value
248+
try expectEqual(log2(0x1.0000000000001p+0), 0x1.71547652b82fdp-52); // Last value before result reaches +0
249+
try expectEqual(log2(0x1.fffffffffffffp-1), -0x1.71547652b82fep-53); // Last value before result reaches -0
250+
try expectEqual(log2(0x1p-1022), -0x1.ffp+9); // First subnormal
251+
try expect(math.isNan(log2(-0x1p-1022))); // First negative subnormal
214252
}

0 commit comments

Comments
 (0)