| 1 | const std = @import("std"); |
| 2 | const math = std.math; |
| 3 | const testing = std.testing; |
| 4 | |
| 5 | const div_f128 = @import("divtf3.zig").div_f128; |
| 6 | |
| 7 | fn 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 | |
| 26 | fn 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 | |
| 32 | test "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 | } |