@@ -8,6 +8,7 @@ const std = @import("std");
8
8
const builtin = @import ("builtin" );
9
9
const math = std .math ;
10
10
const expect = std .testing .expect ;
11
+ const expectEqual = std .testing .expectEqual ;
11
12
const maxInt = std .math .maxInt ;
12
13
const arch = builtin .cpu .arch ;
13
14
const common = @import ("common.zig" );
@@ -179,36 +180,73 @@ pub fn log2l(x: c_longdouble) callconv(.c) c_longdouble {
179
180
}
180
181
}
181
182
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 ))));
190
193
}
191
194
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 )));
200
206
}
201
207
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
+
207
217
}
208
218
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 ));
212
225
try expect (math .isNan (log2 (-1.0 )));
226
+ try expect (math .isNan (log2 (- math .inf (f64 ))));
213
227
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
214
252
}
0 commit comments