1const std = @import("std");
2const math = std.math;
3const testing = std.testing;
4
5const div_f128 = @import("divtf3.zig").div_f128;
6
7fn compareResultLD(result: f128, expectedHi: u64, expectedLo: u64) bool {
8 const rep: u128 = @bitCast(result);
9 const hi: u64 = @truncate(rep >> 64);
10 const lo: u64 = @truncate(rep);
11
12 if (hi == expectedHi and lo == expectedLo) {
13 return true;
14 }
15 // test other possible NaN representation(signal NaN)
16 else if (expectedHi == 0x7fff800000000000 and expectedLo == 0) {
17 if ((hi & 0x7fff000000000000) == 0x7fff000000000000 and
18 ((hi & 0xffffffffffff) > 0 or lo > 0))
19 {
20 return true;
21 }
22 }
23 return false;
24}
25
26fn test__divtf3(a: f128, b: f128, expectedHi: u64, expectedLo: u64) !void {
27 const x = div_f128(a, b);
28 const ret = compareResultLD(x, expectedHi, expectedLo);
29 try testing.expect(ret == true);
30}
31
32test "divtf3" {
33 try test__divtf3(math.nan(f128), 0x1.23456789abcdefp+5, 0x7fff800000000000, 0);
34 try test__divtf3(0x1.23456789abcdefp+5, math.nan(f128), 0x7fff800000000000, 0);
35 try test__divtf3(math.inf(f128), 0x1.23456789abcdefp+5, 0x7fff000000000000, 0);
36 try test__divtf3(-math.inf(f128), 0x1.23456789abcdefp+5, 0xffff000000000000, 0);
37 try test__divtf3(0x1.23456789abcdefp+5, math.inf(f128), 0, 0);
38 try test__divtf3(0x1.23456789abcdefp+5, -math.inf(f128), 0x8000000000000000, 0);
39 try test__divtf3(math.inf(f128), math.inf(f128), 0x7fff800000000000, 0);
40 try test__divtf3(0.0, 0.0, 0x7fff800000000000, 0);
41 try test__divtf3(-0.0, 0.0, 0x7fff800000000000, 0);
42 try test__divtf3(0.0, 1.0, 0, 0);
43 try test__divtf3(-0.0, 1.0, 0x8000000000000000, 0);
44 try test__divtf3(1.0, 0.0, 0x7fff000000000000, 0);
45 try test__divtf3(1.0, -0.0, 0xffff000000000000, 0);
46
47 try test__divtf3(0x1.a23b45362464523375893ab4cdefp+5, 0x1.eedcbaba3a94546558237654321fp-1, 0x4004b0b72924d407, 0x0717e84356c6eba2);
48 try test__divtf3(0x1.a2b34c56d745382f9abf2c3dfeffp-50, 0x1.ed2c3ba15935332532287654321fp-9, 0x3fd5b2af3f828c9b, 0x40e51f64cde8b1f2);
49 try test__divtf3(0x1.2345f6aaaa786555f42432abcdefp+456, 0x1.edacbba9874f765463544dd3621fp+6400, 0x28c62e15dc464466, 0xb5a07586348557ac);
50 try test__divtf3(0x1.2d3456f789ba6322bc665544edefp-234, 0x1.eddcdba39f3c8b7a36564354321fp-4455, 0x507b38442b539266, 0x22ce0f1d024e1252);
51 try test__divtf3(0x1.2345f6b77b7a8953365433abcdefp+234, 0x1.edcba987d6bb3aa467754354321fp-4055, 0x50bf2e02f0798d36, 0x5e6fcb6b60044078);
52 try test__divtf3(6.72420628622418701252535563464350521E-4932, 2.0, 0x0001000000000000, 0);
53 try test__divtf3(1.0, 0x1.ffffffffffffffffffffffffffffp-1, 0x3FFF000000000000, 1);
54
55 try test__divtf3(std.math.floatMin(f128), 2.0, 0x0000800000000000, 0x0000000000000000);
56 try test__divtf3(std.math.floatMin(f128), 4.0, 0x0000400000000000, 0x0000000000000000);
57 try test__divtf3(1.0, 0x1.0000000000000000000000000001p16382, 0x0000ffffffffffff, 0xfffffffffffffffe);
58 try test__divtf3(1.2, std.math.floatMax(f128), 0x00004ccccccccccc, 0xcccccccccccccccd);
59}