zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

divxf3_test.zig (2844B) - Raw


      1 const std = @import("std");
      2 const math = std.math;
      3 const testing = std.testing;
      4 
      5 const __divxf3 = @import("divxf3.zig").__divxf3;
      6 
      7 fn compareResult(result: f80, expected: u80) bool {
      8     const rep: u80 = @bitCast(result);
      9 
     10     if (rep == expected) return true;
     11     // test other possible NaN representations (signal NaN)
     12     if (math.isNan(result) and math.isNan(@as(f80, @bitCast(expected)))) return true;
     13 
     14     return false;
     15 }
     16 
     17 fn expect__divxf3_result(a: f80, b: f80, expected: u80) !void {
     18     const x = __divxf3(a, b);
     19     const ret = compareResult(x, expected);
     20     try testing.expect(ret == true);
     21 }
     22 
     23 fn test__divxf3(a: f80, b: f80) !void {
     24     const integerBit = 1 << math.floatFractionalBits(f80);
     25     const x = __divxf3(a, b);
     26 
     27     // Next float (assuming normal, non-zero result)
     28     const x_plus_eps: f80 = @bitCast((@as(u80, @bitCast(x)) + 1) | integerBit);
     29     // Prev float (assuming normal, non-zero result)
     30     const x_minus_eps: f80 = @bitCast((@as(u80, @bitCast(x)) - 1) | integerBit);
     31 
     32     // Make sure result is more accurate than the adjacent floats
     33     const err_x = @abs(@mulAdd(f80, x, b, -a));
     34     const err_x_plus_eps = @abs(@mulAdd(f80, x_plus_eps, b, -a));
     35     const err_x_minus_eps = @abs(@mulAdd(f80, x_minus_eps, b, -a));
     36 
     37     try testing.expect(err_x_minus_eps > err_x);
     38     try testing.expect(err_x_plus_eps > err_x);
     39 }
     40 
     41 test "divxf3" {
     42     // NaN / any = NaN
     43     try expect__divxf3_result(math.nan(f80), 0x1.23456789abcdefp+5, 0x7fffC000000000000000);
     44     // inf / any(except inf and nan) = inf
     45     try expect__divxf3_result(math.inf(f80), 0x1.23456789abcdefp+5, 0x7fff8000000000000000);
     46     // inf / inf = nan
     47     try expect__divxf3_result(math.inf(f80), math.inf(f80), 0x7fffC000000000000000);
     48     // inf / nan = nan
     49     try expect__divxf3_result(math.inf(f80), math.nan(f80), 0x7fffC000000000000000);
     50 
     51     try test__divxf3(0x1.a23b45362464523375893ab4cdefp+5, 0x1.eedcbaba3a94546558237654321fp-1);
     52     try test__divxf3(0x1.a2b34c56d745382f9abf2c3dfeffp-50, 0x1.ed2c3ba15935332532287654321fp-9);
     53     try test__divxf3(0x1.2345f6aaaa786555f42432abcdefp+456, 0x1.edacbba9874f765463544dd3621fp+6400);
     54     try test__divxf3(0x1.2d3456f789ba6322bc665544edefp-234, 0x1.eddcdba39f3c8b7a36564354321fp-4455);
     55     try test__divxf3(0x1.2345f6b77b7a8953365433abcdefp+234, 0x1.edcba987d6bb3aa467754354321fp-4055);
     56     try test__divxf3(0x1.a23b45362464523375893ab4cdefp+5, 0x1.a2b34c56d745382f9abf2c3dfeffp-50);
     57     try test__divxf3(0x1.a23b45362464523375893ab4cdefp+5, 0x1.1234567890abcdef987654321123p0);
     58     try test__divxf3(0x1.a23b45362464523375893ab4cdefp+5, 0x1.12394205810257120adae8929f23p+16);
     59     try test__divxf3(0x1.a23b45362464523375893ab4cdefp+5, 0x1.febdcefa1231245f9abf2c3dfeffp-50);
     60 
     61     // Result rounds down to zero
     62     try expect__divxf3_result(6.72420628622418701252535563464350521E-4932, 2.0, 0x0);
     63 }