mirror of
https://github.com/ziglang/zig.git
synced 2024-11-27 23:52:31 +00:00
840 lines
43 KiB
Zig
840 lines
43 KiB
Zig
const std = @import("std");
|
|
const builtin = @import("builtin");
|
|
const testing = std.testing;
|
|
const math = std.math;
|
|
|
|
const __floatunsihf = @import("floatunsihf.zig").__floatunsihf;
|
|
|
|
// Conversion to f32
|
|
const __floatsisf = @import("floatsisf.zig").__floatsisf;
|
|
const __floatunsisf = @import("floatunsisf.zig").__floatunsisf;
|
|
const __floatdisf = @import("floatdisf.zig").__floatdisf;
|
|
const __floatundisf = @import("floatundisf.zig").__floatundisf;
|
|
const __floattisf = @import("floattisf.zig").__floattisf;
|
|
const __floatuntisf = @import("floatuntisf.zig").__floatuntisf;
|
|
|
|
// Conversion to f64
|
|
const __floatsidf = @import("floatsidf.zig").__floatsidf;
|
|
const __floatunsidf = @import("floatunsidf.zig").__floatunsidf;
|
|
const __floatdidf = @import("floatdidf.zig").__floatdidf;
|
|
const __floatundidf = @import("floatundidf.zig").__floatundidf;
|
|
const __floattidf = @import("floattidf.zig").__floattidf;
|
|
const __floatuntidf = @import("floatuntidf.zig").__floatuntidf;
|
|
|
|
// Conversion to f128
|
|
const __floatsitf = @import("floatsitf.zig").__floatsitf;
|
|
const __floatunsitf = @import("floatunsitf.zig").__floatunsitf;
|
|
const __floatditf = @import("floatditf.zig").__floatditf;
|
|
const __floatunditf = @import("floatunditf.zig").__floatunditf;
|
|
const __floattitf = @import("floattitf.zig").__floattitf;
|
|
const __floatuntitf = @import("floatuntitf.zig").__floatuntitf;
|
|
|
|
fn test__floatsisf(a: i32, expected: u32) !void {
|
|
const r = __floatsisf(a);
|
|
try std.testing.expect(@bitCast(u32, r) == expected);
|
|
}
|
|
|
|
fn test_one_floatunsisf(a: u32, expected: u32) !void {
|
|
const r = __floatunsisf(a);
|
|
try std.testing.expect(@bitCast(u32, r) == expected);
|
|
}
|
|
|
|
test "floatsisf" {
|
|
try test__floatsisf(0, 0x00000000);
|
|
try test__floatsisf(1, 0x3f800000);
|
|
try test__floatsisf(-1, 0xbf800000);
|
|
try test__floatsisf(0x7FFFFFFF, 0x4f000000);
|
|
try test__floatsisf(@bitCast(i32, @intCast(u32, 0x80000000)), 0xcf000000);
|
|
}
|
|
|
|
test "floatunsisf" {
|
|
// Test the produced bit pattern
|
|
try test_one_floatunsisf(0, 0);
|
|
try test_one_floatunsisf(1, 0x3f800000);
|
|
try test_one_floatunsisf(0x7FFFFFFF, 0x4f000000);
|
|
try test_one_floatunsisf(0x80000000, 0x4f000000);
|
|
try test_one_floatunsisf(0xFFFFFFFF, 0x4f800000);
|
|
}
|
|
|
|
fn test__floatdisf(a: i64, expected: f32) !void {
|
|
const x = __floatdisf(a);
|
|
try testing.expect(x == expected);
|
|
}
|
|
|
|
fn test__floatundisf(a: u64, expected: f32) !void {
|
|
try std.testing.expectEqual(expected, __floatundisf(a));
|
|
}
|
|
|
|
test "floatdisf" {
|
|
try test__floatdisf(0, 0.0);
|
|
try test__floatdisf(1, 1.0);
|
|
try test__floatdisf(2, 2.0);
|
|
try test__floatdisf(-1, -1.0);
|
|
try test__floatdisf(-2, -2.0);
|
|
try test__floatdisf(0x7FFFFF8000000000, 0x1.FFFFFEp+62);
|
|
try test__floatdisf(0x7FFFFF0000000000, 0x1.FFFFFCp+62);
|
|
try test__floatdisf(@bitCast(i64, @as(u64, 0x8000008000000000)), -0x1.FFFFFEp+62);
|
|
try test__floatdisf(@bitCast(i64, @as(u64, 0x8000010000000000)), -0x1.FFFFFCp+62);
|
|
try test__floatdisf(@bitCast(i64, @as(u64, 0x8000000000000000)), -0x1.000000p+63);
|
|
try test__floatdisf(@bitCast(i64, @as(u64, 0x8000000000000001)), -0x1.000000p+63);
|
|
try test__floatdisf(0x0007FB72E8000000, 0x1.FEDCBAp+50);
|
|
try test__floatdisf(0x0007FB72EA000000, 0x1.FEDCBAp+50);
|
|
try test__floatdisf(0x0007FB72EB000000, 0x1.FEDCBAp+50);
|
|
try test__floatdisf(0x0007FB72EBFFFFFF, 0x1.FEDCBAp+50);
|
|
try test__floatdisf(0x0007FB72EC000000, 0x1.FEDCBCp+50);
|
|
try test__floatdisf(0x0007FB72E8000001, 0x1.FEDCBAp+50);
|
|
try test__floatdisf(0x0007FB72E6000000, 0x1.FEDCBAp+50);
|
|
try test__floatdisf(0x0007FB72E7000000, 0x1.FEDCBAp+50);
|
|
try test__floatdisf(0x0007FB72E7FFFFFF, 0x1.FEDCBAp+50);
|
|
try test__floatdisf(0x0007FB72E4000001, 0x1.FEDCBAp+50);
|
|
try test__floatdisf(0x0007FB72E4000000, 0x1.FEDCB8p+50);
|
|
}
|
|
|
|
test "floatundisf" {
|
|
try test__floatundisf(0, 0.0);
|
|
try test__floatundisf(1, 1.0);
|
|
try test__floatundisf(2, 2.0);
|
|
try test__floatundisf(0x7FFFFF8000000000, 0x1.FFFFFEp+62);
|
|
try test__floatundisf(0x7FFFFF0000000000, 0x1.FFFFFCp+62);
|
|
try test__floatundisf(0x8000008000000000, 0x1p+63);
|
|
try test__floatundisf(0x8000010000000000, 0x1.000002p+63);
|
|
try test__floatundisf(0x8000000000000000, 0x1p+63);
|
|
try test__floatundisf(0x8000000000000001, 0x1p+63);
|
|
try test__floatundisf(0xFFFFFFFFFFFFFFFE, 0x1p+64);
|
|
try test__floatundisf(0xFFFFFFFFFFFFFFFF, 0x1p+64);
|
|
try test__floatundisf(0x0007FB72E8000000, 0x1.FEDCBAp+50);
|
|
try test__floatundisf(0x0007FB72EA000000, 0x1.FEDCBAp+50);
|
|
try test__floatundisf(0x0007FB72EB000000, 0x1.FEDCBAp+50);
|
|
try test__floatundisf(0x0007FB72EBFFFFFF, 0x1.FEDCBAp+50);
|
|
try test__floatundisf(0x0007FB72EC000000, 0x1.FEDCBCp+50);
|
|
try test__floatundisf(0x0007FB72E8000001, 0x1.FEDCBAp+50);
|
|
try test__floatundisf(0x0007FB72E6000000, 0x1.FEDCBAp+50);
|
|
try test__floatundisf(0x0007FB72E7000000, 0x1.FEDCBAp+50);
|
|
try test__floatundisf(0x0007FB72E7FFFFFF, 0x1.FEDCBAp+50);
|
|
try test__floatundisf(0x0007FB72E4000001, 0x1.FEDCBAp+50);
|
|
try test__floatundisf(0x0007FB72E4000000, 0x1.FEDCB8p+50);
|
|
}
|
|
|
|
fn test__floattisf(a: i128, expected: f32) !void {
|
|
const x = __floattisf(a);
|
|
try testing.expect(x == expected);
|
|
}
|
|
|
|
fn test__floatuntisf(a: u128, expected: f32) !void {
|
|
const x = __floatuntisf(a);
|
|
try testing.expect(x == expected);
|
|
}
|
|
|
|
test "floattisf" {
|
|
try test__floattisf(0, 0.0);
|
|
|
|
try test__floattisf(1, 1.0);
|
|
try test__floattisf(2, 2.0);
|
|
try test__floattisf(-1, -1.0);
|
|
try test__floattisf(-2, -2.0);
|
|
|
|
try test__floattisf(0x7FFFFF8000000000, 0x1.FFFFFEp+62);
|
|
try test__floattisf(0x7FFFFF0000000000, 0x1.FFFFFCp+62);
|
|
|
|
try test__floattisf(make_ti(0xFFFFFFFFFFFFFFFF, 0x8000008000000000), -0x1.FFFFFEp+62);
|
|
try test__floattisf(make_ti(0xFFFFFFFFFFFFFFFF, 0x8000010000000000), -0x1.FFFFFCp+62);
|
|
|
|
try test__floattisf(make_ti(0xFFFFFFFFFFFFFFFF, 0x8000000000000000), -0x1.000000p+63);
|
|
try test__floattisf(make_ti(0xFFFFFFFFFFFFFFFF, 0x8000000000000001), -0x1.000000p+63);
|
|
|
|
try test__floattisf(0x0007FB72E8000000, 0x1.FEDCBAp+50);
|
|
|
|
try test__floattisf(0x0007FB72EA000000, 0x1.FEDCBAp+50);
|
|
try test__floattisf(0x0007FB72EB000000, 0x1.FEDCBAp+50);
|
|
try test__floattisf(0x0007FB72EBFFFFFF, 0x1.FEDCBAp+50);
|
|
try test__floattisf(0x0007FB72EC000000, 0x1.FEDCBCp+50);
|
|
try test__floattisf(0x0007FB72E8000001, 0x1.FEDCBAp+50);
|
|
|
|
try test__floattisf(0x0007FB72E6000000, 0x1.FEDCBAp+50);
|
|
try test__floattisf(0x0007FB72E7000000, 0x1.FEDCBAp+50);
|
|
try test__floattisf(0x0007FB72E7FFFFFF, 0x1.FEDCBAp+50);
|
|
try test__floattisf(0x0007FB72E4000001, 0x1.FEDCBAp+50);
|
|
try test__floattisf(0x0007FB72E4000000, 0x1.FEDCB8p+50);
|
|
|
|
try test__floattisf(make_ti(0x0007FB72E8000000, 0), 0x1.FEDCBAp+114);
|
|
|
|
try test__floattisf(make_ti(0x0007FB72EA000000, 0), 0x1.FEDCBAp+114);
|
|
try test__floattisf(make_ti(0x0007FB72EB000000, 0), 0x1.FEDCBAp+114);
|
|
try test__floattisf(make_ti(0x0007FB72EBFFFFFF, 0), 0x1.FEDCBAp+114);
|
|
try test__floattisf(make_ti(0x0007FB72EC000000, 0), 0x1.FEDCBCp+114);
|
|
try test__floattisf(make_ti(0x0007FB72E8000001, 0), 0x1.FEDCBAp+114);
|
|
|
|
try test__floattisf(make_ti(0x0007FB72E6000000, 0), 0x1.FEDCBAp+114);
|
|
try test__floattisf(make_ti(0x0007FB72E7000000, 0), 0x1.FEDCBAp+114);
|
|
try test__floattisf(make_ti(0x0007FB72E7FFFFFF, 0), 0x1.FEDCBAp+114);
|
|
try test__floattisf(make_ti(0x0007FB72E4000001, 0), 0x1.FEDCBAp+114);
|
|
try test__floattisf(make_ti(0x0007FB72E4000000, 0), 0x1.FEDCB8p+114);
|
|
}
|
|
|
|
test "floatuntisf" {
|
|
try test__floatuntisf(0, 0.0);
|
|
|
|
try test__floatuntisf(1, 1.0);
|
|
try test__floatuntisf(2, 2.0);
|
|
try test__floatuntisf(20, 20.0);
|
|
|
|
try test__floatuntisf(0x7FFFFF8000000000, 0x1.FFFFFEp+62);
|
|
try test__floatuntisf(0x7FFFFF0000000000, 0x1.FFFFFCp+62);
|
|
|
|
try test__floatuntisf(make_uti(0x8000008000000000, 0), 0x1.000001p+127);
|
|
try test__floatuntisf(make_uti(0x8000000000000800, 0), 0x1.0p+127);
|
|
try test__floatuntisf(make_uti(0x8000010000000000, 0), 0x1.000002p+127);
|
|
|
|
try test__floatuntisf(make_uti(0x8000000000000000, 0), 0x1.000000p+127);
|
|
|
|
try test__floatuntisf(0x0007FB72E8000000, 0x1.FEDCBAp+50);
|
|
|
|
try test__floatuntisf(0x0007FB72EA000000, 0x1.FEDCBA8p+50);
|
|
try test__floatuntisf(0x0007FB72EB000000, 0x1.FEDCBACp+50);
|
|
|
|
try test__floatuntisf(0x0007FB72EC000000, 0x1.FEDCBBp+50);
|
|
|
|
try test__floatuntisf(0x0007FB72E6000000, 0x1.FEDCB98p+50);
|
|
try test__floatuntisf(0x0007FB72E7000000, 0x1.FEDCB9Cp+50);
|
|
try test__floatuntisf(0x0007FB72E4000000, 0x1.FEDCB9p+50);
|
|
|
|
try test__floatuntisf(0xFFFFFFFFFFFFFFFE, 0x1p+64);
|
|
try test__floatuntisf(0xFFFFFFFFFFFFFFFF, 0x1p+64);
|
|
|
|
try test__floatuntisf(0x0007FB72E8000000, 0x1.FEDCBAp+50);
|
|
|
|
try test__floatuntisf(0x0007FB72EA000000, 0x1.FEDCBAp+50);
|
|
try test__floatuntisf(0x0007FB72EB000000, 0x1.FEDCBAp+50);
|
|
try test__floatuntisf(0x0007FB72EBFFFFFF, 0x1.FEDCBAp+50);
|
|
try test__floatuntisf(0x0007FB72EC000000, 0x1.FEDCBCp+50);
|
|
try test__floatuntisf(0x0007FB72E8000001, 0x1.FEDCBAp+50);
|
|
|
|
try test__floatuntisf(0x0007FB72E6000000, 0x1.FEDCBAp+50);
|
|
try test__floatuntisf(0x0007FB72E7000000, 0x1.FEDCBAp+50);
|
|
try test__floatuntisf(0x0007FB72E7FFFFFF, 0x1.FEDCBAp+50);
|
|
try test__floatuntisf(0x0007FB72E4000001, 0x1.FEDCBAp+50);
|
|
try test__floatuntisf(0x0007FB72E4000000, 0x1.FEDCB8p+50);
|
|
|
|
try test__floatuntisf(make_uti(0x0000000000001FED, 0xCB90000000000001), 0x1.FEDCBAp+76);
|
|
try test__floatuntisf(make_uti(0x0000000000001FED, 0xCBA0000000000000), 0x1.FEDCBAp+76);
|
|
try test__floatuntisf(make_uti(0x0000000000001FED, 0xCBAFFFFFFFFFFFFF), 0x1.FEDCBAp+76);
|
|
try test__floatuntisf(make_uti(0x0000000000001FED, 0xCBB0000000000000), 0x1.FEDCBCp+76);
|
|
try test__floatuntisf(make_uti(0x0000000000001FED, 0xCBB0000000000001), 0x1.FEDCBCp+76);
|
|
try test__floatuntisf(make_uti(0x0000000000001FED, 0xCBBFFFFFFFFFFFFF), 0x1.FEDCBCp+76);
|
|
try test__floatuntisf(make_uti(0x0000000000001FED, 0xCBC0000000000000), 0x1.FEDCBCp+76);
|
|
try test__floatuntisf(make_uti(0x0000000000001FED, 0xCBC0000000000001), 0x1.FEDCBCp+76);
|
|
try test__floatuntisf(make_uti(0x0000000000001FED, 0xCBD0000000000000), 0x1.FEDCBCp+76);
|
|
try test__floatuntisf(make_uti(0x0000000000001FED, 0xCBD0000000000001), 0x1.FEDCBEp+76);
|
|
try test__floatuntisf(make_uti(0x0000000000001FED, 0xCBDFFFFFFFFFFFFF), 0x1.FEDCBEp+76);
|
|
try test__floatuntisf(make_uti(0x0000000000001FED, 0xCBE0000000000000), 0x1.FEDCBEp+76);
|
|
|
|
// Test overflow to infinity
|
|
try test__floatuntisf(@as(u128, math.maxInt(u128)), @bitCast(f32, math.inf(f32)));
|
|
}
|
|
|
|
fn test_one_floatsidf(a: i32, expected: u64) !void {
|
|
const r = __floatsidf(a);
|
|
try std.testing.expect(@bitCast(u64, r) == expected);
|
|
}
|
|
|
|
fn test_one_floatunsidf(a: u32, expected: u64) !void {
|
|
const r = __floatunsidf(a);
|
|
try std.testing.expect(@bitCast(u64, r) == expected);
|
|
}
|
|
|
|
test "floatsidf" {
|
|
try test_one_floatsidf(0, 0x0000000000000000);
|
|
try test_one_floatsidf(1, 0x3ff0000000000000);
|
|
try test_one_floatsidf(-1, 0xbff0000000000000);
|
|
try test_one_floatsidf(0x7FFFFFFF, 0x41dfffffffc00000);
|
|
try test_one_floatsidf(@bitCast(i32, @intCast(u32, 0x80000000)), 0xc1e0000000000000);
|
|
}
|
|
|
|
test "floatunsidf" {
|
|
try test_one_floatunsidf(0, 0x0000000000000000);
|
|
try test_one_floatunsidf(1, 0x3ff0000000000000);
|
|
try test_one_floatunsidf(0x7FFFFFFF, 0x41dfffffffc00000);
|
|
try test_one_floatunsidf(@intCast(u32, 0x80000000), 0x41e0000000000000);
|
|
try test_one_floatunsidf(@intCast(u32, 0xFFFFFFFF), 0x41efffffffe00000);
|
|
}
|
|
|
|
fn test__floatdidf(a: i64, expected: f64) !void {
|
|
const r = __floatdidf(a);
|
|
try testing.expect(r == expected);
|
|
}
|
|
|
|
fn test__floatundidf(a: u64, expected: f64) !void {
|
|
const r = __floatundidf(a);
|
|
try testing.expect(r == expected);
|
|
}
|
|
|
|
test "floatdidf" {
|
|
try test__floatdidf(0, 0.0);
|
|
try test__floatdidf(1, 1.0);
|
|
try test__floatdidf(2, 2.0);
|
|
try test__floatdidf(20, 20.0);
|
|
try test__floatdidf(-1, -1.0);
|
|
try test__floatdidf(-2, -2.0);
|
|
try test__floatdidf(-20, -20.0);
|
|
try test__floatdidf(0x7FFFFF8000000000, 0x1.FFFFFEp+62);
|
|
try test__floatdidf(0x7FFFFFFFFFFFF800, 0x1.FFFFFFFFFFFFEp+62);
|
|
try test__floatdidf(0x7FFFFF0000000000, 0x1.FFFFFCp+62);
|
|
try test__floatdidf(0x7FFFFFFFFFFFF000, 0x1.FFFFFFFFFFFFCp+62);
|
|
try test__floatdidf(@bitCast(i64, @intCast(u64, 0x8000008000000000)), -0x1.FFFFFEp+62);
|
|
try test__floatdidf(@bitCast(i64, @intCast(u64, 0x8000000000000800)), -0x1.FFFFFFFFFFFFEp+62);
|
|
try test__floatdidf(@bitCast(i64, @intCast(u64, 0x8000010000000000)), -0x1.FFFFFCp+62);
|
|
try test__floatdidf(@bitCast(i64, @intCast(u64, 0x8000000000001000)), -0x1.FFFFFFFFFFFFCp+62);
|
|
try test__floatdidf(@bitCast(i64, @intCast(u64, 0x8000000000000000)), -0x1.000000p+63);
|
|
try test__floatdidf(@bitCast(i64, @intCast(u64, 0x8000000000000001)), -0x1.000000p+63); // 0x8000000000000001
|
|
try test__floatdidf(0x0007FB72E8000000, 0x1.FEDCBAp+50);
|
|
try test__floatdidf(0x0007FB72EA000000, 0x1.FEDCBA8p+50);
|
|
try test__floatdidf(0x0007FB72EB000000, 0x1.FEDCBACp+50);
|
|
try test__floatdidf(0x0007FB72EBFFFFFF, 0x1.FEDCBAFFFFFFCp+50);
|
|
try test__floatdidf(0x0007FB72EC000000, 0x1.FEDCBBp+50);
|
|
try test__floatdidf(0x0007FB72E8000001, 0x1.FEDCBA0000004p+50);
|
|
try test__floatdidf(0x0007FB72E6000000, 0x1.FEDCB98p+50);
|
|
try test__floatdidf(0x0007FB72E7000000, 0x1.FEDCB9Cp+50);
|
|
try test__floatdidf(0x0007FB72E7FFFFFF, 0x1.FEDCB9FFFFFFCp+50);
|
|
try test__floatdidf(0x0007FB72E4000001, 0x1.FEDCB90000004p+50);
|
|
try test__floatdidf(0x0007FB72E4000000, 0x1.FEDCB9p+50);
|
|
try test__floatdidf(0x023479FD0E092DC0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatdidf(0x023479FD0E092DA1, 0x1.1A3CFE870496Dp+57);
|
|
try test__floatdidf(0x023479FD0E092DB0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatdidf(0x023479FD0E092DB8, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatdidf(0x023479FD0E092DB6, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatdidf(0x023479FD0E092DBF, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatdidf(0x023479FD0E092DC1, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatdidf(0x023479FD0E092DC7, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatdidf(0x023479FD0E092DC8, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatdidf(0x023479FD0E092DCF, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatdidf(0x023479FD0E092DD0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatdidf(0x023479FD0E092DD1, 0x1.1A3CFE870496Fp+57);
|
|
try test__floatdidf(0x023479FD0E092DD8, 0x1.1A3CFE870496Fp+57);
|
|
try test__floatdidf(0x023479FD0E092DDF, 0x1.1A3CFE870496Fp+57);
|
|
try test__floatdidf(0x023479FD0E092DE0, 0x1.1A3CFE870496Fp+57);
|
|
}
|
|
|
|
test "floatundidf" {
|
|
try test__floatundidf(0, 0.0);
|
|
try test__floatundidf(1, 1.0);
|
|
try test__floatundidf(2, 2.0);
|
|
try test__floatundidf(20, 20.0);
|
|
try test__floatundidf(0x7FFFFF8000000000, 0x1.FFFFFEp+62);
|
|
try test__floatundidf(0x7FFFFFFFFFFFF800, 0x1.FFFFFFFFFFFFEp+62);
|
|
try test__floatundidf(0x7FFFFF0000000000, 0x1.FFFFFCp+62);
|
|
try test__floatundidf(0x7FFFFFFFFFFFF000, 0x1.FFFFFFFFFFFFCp+62);
|
|
try test__floatundidf(0x8000008000000000, 0x1.000001p+63);
|
|
try test__floatundidf(0x8000000000000800, 0x1.0000000000001p+63);
|
|
try test__floatundidf(0x8000010000000000, 0x1.000002p+63);
|
|
try test__floatundidf(0x8000000000001000, 0x1.0000000000002p+63);
|
|
try test__floatundidf(0x8000000000000000, 0x1p+63);
|
|
try test__floatundidf(0x8000000000000001, 0x1p+63);
|
|
try test__floatundidf(0x0007FB72E8000000, 0x1.FEDCBAp+50);
|
|
try test__floatundidf(0x0007FB72EA000000, 0x1.FEDCBA8p+50);
|
|
try test__floatundidf(0x0007FB72EB000000, 0x1.FEDCBACp+50);
|
|
try test__floatundidf(0x0007FB72EBFFFFFF, 0x1.FEDCBAFFFFFFCp+50);
|
|
try test__floatundidf(0x0007FB72EC000000, 0x1.FEDCBBp+50);
|
|
try test__floatundidf(0x0007FB72E8000001, 0x1.FEDCBA0000004p+50);
|
|
try test__floatundidf(0x0007FB72E6000000, 0x1.FEDCB98p+50);
|
|
try test__floatundidf(0x0007FB72E7000000, 0x1.FEDCB9Cp+50);
|
|
try test__floatundidf(0x0007FB72E7FFFFFF, 0x1.FEDCB9FFFFFFCp+50);
|
|
try test__floatundidf(0x0007FB72E4000001, 0x1.FEDCB90000004p+50);
|
|
try test__floatundidf(0x0007FB72E4000000, 0x1.FEDCB9p+50);
|
|
try test__floatundidf(0x023479FD0E092DC0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatundidf(0x023479FD0E092DA1, 0x1.1A3CFE870496Dp+57);
|
|
try test__floatundidf(0x023479FD0E092DB0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatundidf(0x023479FD0E092DB8, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatundidf(0x023479FD0E092DB6, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatundidf(0x023479FD0E092DBF, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatundidf(0x023479FD0E092DC1, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatundidf(0x023479FD0E092DC7, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatundidf(0x023479FD0E092DC8, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatundidf(0x023479FD0E092DCF, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatundidf(0x023479FD0E092DD0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatundidf(0x023479FD0E092DD1, 0x1.1A3CFE870496Fp+57);
|
|
try test__floatundidf(0x023479FD0E092DD8, 0x1.1A3CFE870496Fp+57);
|
|
try test__floatundidf(0x023479FD0E092DDF, 0x1.1A3CFE870496Fp+57);
|
|
try test__floatundidf(0x023479FD0E092DE0, 0x1.1A3CFE870496Fp+57);
|
|
}
|
|
|
|
fn test__floattidf(a: i128, expected: f64) !void {
|
|
const x = __floattidf(a);
|
|
try testing.expect(x == expected);
|
|
}
|
|
|
|
fn test__floatuntidf(a: u128, expected: f64) !void {
|
|
const x = __floatuntidf(a);
|
|
try testing.expect(x == expected);
|
|
}
|
|
|
|
test "floattidf" {
|
|
try test__floattidf(0, 0.0);
|
|
|
|
try test__floattidf(1, 1.0);
|
|
try test__floattidf(2, 2.0);
|
|
try test__floattidf(20, 20.0);
|
|
try test__floattidf(-1, -1.0);
|
|
try test__floattidf(-2, -2.0);
|
|
try test__floattidf(-20, -20.0);
|
|
|
|
try test__floattidf(0x7FFFFF8000000000, 0x1.FFFFFEp+62);
|
|
try test__floattidf(0x7FFFFFFFFFFFF800, 0x1.FFFFFFFFFFFFEp+62);
|
|
try test__floattidf(0x7FFFFF0000000000, 0x1.FFFFFCp+62);
|
|
try test__floattidf(0x7FFFFFFFFFFFF000, 0x1.FFFFFFFFFFFFCp+62);
|
|
|
|
try test__floattidf(make_ti(0x8000008000000000, 0), -0x1.FFFFFEp+126);
|
|
try test__floattidf(make_ti(0x8000000000000800, 0), -0x1.FFFFFFFFFFFFEp+126);
|
|
try test__floattidf(make_ti(0x8000010000000000, 0), -0x1.FFFFFCp+126);
|
|
try test__floattidf(make_ti(0x8000000000001000, 0), -0x1.FFFFFFFFFFFFCp+126);
|
|
|
|
try test__floattidf(make_ti(0x8000000000000000, 0), -0x1.000000p+127);
|
|
try test__floattidf(make_ti(0x8000000000000001, 0), -0x1.000000p+127);
|
|
|
|
try test__floattidf(0x0007FB72E8000000, 0x1.FEDCBAp+50);
|
|
|
|
try test__floattidf(0x0007FB72EA000000, 0x1.FEDCBA8p+50);
|
|
try test__floattidf(0x0007FB72EB000000, 0x1.FEDCBACp+50);
|
|
try test__floattidf(0x0007FB72EBFFFFFF, 0x1.FEDCBAFFFFFFCp+50);
|
|
try test__floattidf(0x0007FB72EC000000, 0x1.FEDCBBp+50);
|
|
try test__floattidf(0x0007FB72E8000001, 0x1.FEDCBA0000004p+50);
|
|
|
|
try test__floattidf(0x0007FB72E6000000, 0x1.FEDCB98p+50);
|
|
try test__floattidf(0x0007FB72E7000000, 0x1.FEDCB9Cp+50);
|
|
try test__floattidf(0x0007FB72E7FFFFFF, 0x1.FEDCB9FFFFFFCp+50);
|
|
try test__floattidf(0x0007FB72E4000001, 0x1.FEDCB90000004p+50);
|
|
try test__floattidf(0x0007FB72E4000000, 0x1.FEDCB9p+50);
|
|
|
|
try test__floattidf(0x023479FD0E092DC0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floattidf(0x023479FD0E092DA1, 0x1.1A3CFE870496Dp+57);
|
|
try test__floattidf(0x023479FD0E092DB0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floattidf(0x023479FD0E092DB8, 0x1.1A3CFE870496Ep+57);
|
|
try test__floattidf(0x023479FD0E092DB6, 0x1.1A3CFE870496Ep+57);
|
|
try test__floattidf(0x023479FD0E092DBF, 0x1.1A3CFE870496Ep+57);
|
|
try test__floattidf(0x023479FD0E092DC1, 0x1.1A3CFE870496Ep+57);
|
|
try test__floattidf(0x023479FD0E092DC7, 0x1.1A3CFE870496Ep+57);
|
|
try test__floattidf(0x023479FD0E092DC8, 0x1.1A3CFE870496Ep+57);
|
|
try test__floattidf(0x023479FD0E092DCF, 0x1.1A3CFE870496Ep+57);
|
|
try test__floattidf(0x023479FD0E092DD0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floattidf(0x023479FD0E092DD1, 0x1.1A3CFE870496Fp+57);
|
|
try test__floattidf(0x023479FD0E092DD8, 0x1.1A3CFE870496Fp+57);
|
|
try test__floattidf(0x023479FD0E092DDF, 0x1.1A3CFE870496Fp+57);
|
|
try test__floattidf(0x023479FD0E092DE0, 0x1.1A3CFE870496Fp+57);
|
|
|
|
try test__floattidf(make_ti(0x023479FD0E092DC0, 0), 0x1.1A3CFE870496Ep+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DA1, 1), 0x1.1A3CFE870496Dp+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DB0, 2), 0x1.1A3CFE870496Ep+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DB8, 3), 0x1.1A3CFE870496Ep+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DB6, 4), 0x1.1A3CFE870496Ep+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DBF, 5), 0x1.1A3CFE870496Ep+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DC1, 6), 0x1.1A3CFE870496Ep+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DC7, 7), 0x1.1A3CFE870496Ep+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DC8, 8), 0x1.1A3CFE870496Ep+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DCF, 9), 0x1.1A3CFE870496Ep+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DD0, 0), 0x1.1A3CFE870496Ep+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DD1, 11), 0x1.1A3CFE870496Fp+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DD8, 12), 0x1.1A3CFE870496Fp+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DDF, 13), 0x1.1A3CFE870496Fp+121);
|
|
try test__floattidf(make_ti(0x023479FD0E092DE0, 14), 0x1.1A3CFE870496Fp+121);
|
|
}
|
|
|
|
test "floatuntidf" {
|
|
try test__floatuntidf(0, 0.0);
|
|
|
|
try test__floatuntidf(1, 1.0);
|
|
try test__floatuntidf(2, 2.0);
|
|
try test__floatuntidf(20, 20.0);
|
|
|
|
try test__floatuntidf(0x7FFFFF8000000000, 0x1.FFFFFEp+62);
|
|
try test__floatuntidf(0x7FFFFFFFFFFFF800, 0x1.FFFFFFFFFFFFEp+62);
|
|
try test__floatuntidf(0x7FFFFF0000000000, 0x1.FFFFFCp+62);
|
|
try test__floatuntidf(0x7FFFFFFFFFFFF000, 0x1.FFFFFFFFFFFFCp+62);
|
|
|
|
try test__floatuntidf(make_uti(0x8000008000000000, 0), 0x1.000001p+127);
|
|
try test__floatuntidf(make_uti(0x8000000000000800, 0), 0x1.0000000000001p+127);
|
|
try test__floatuntidf(make_uti(0x8000010000000000, 0), 0x1.000002p+127);
|
|
try test__floatuntidf(make_uti(0x8000000000001000, 0), 0x1.0000000000002p+127);
|
|
|
|
try test__floatuntidf(make_uti(0x8000000000000000, 0), 0x1.000000p+127);
|
|
try test__floatuntidf(make_uti(0x8000000000000001, 0), 0x1.0000000000000002p+127);
|
|
|
|
try test__floatuntidf(0x0007FB72E8000000, 0x1.FEDCBAp+50);
|
|
|
|
try test__floatuntidf(0x0007FB72EA000000, 0x1.FEDCBA8p+50);
|
|
try test__floatuntidf(0x0007FB72EB000000, 0x1.FEDCBACp+50);
|
|
try test__floatuntidf(0x0007FB72EBFFFFFF, 0x1.FEDCBAFFFFFFCp+50);
|
|
try test__floatuntidf(0x0007FB72EC000000, 0x1.FEDCBBp+50);
|
|
try test__floatuntidf(0x0007FB72E8000001, 0x1.FEDCBA0000004p+50);
|
|
|
|
try test__floatuntidf(0x0007FB72E6000000, 0x1.FEDCB98p+50);
|
|
try test__floatuntidf(0x0007FB72E7000000, 0x1.FEDCB9Cp+50);
|
|
try test__floatuntidf(0x0007FB72E7FFFFFF, 0x1.FEDCB9FFFFFFCp+50);
|
|
try test__floatuntidf(0x0007FB72E4000001, 0x1.FEDCB90000004p+50);
|
|
try test__floatuntidf(0x0007FB72E4000000, 0x1.FEDCB9p+50);
|
|
|
|
try test__floatuntidf(0x023479FD0E092DC0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatuntidf(0x023479FD0E092DA1, 0x1.1A3CFE870496Dp+57);
|
|
try test__floatuntidf(0x023479FD0E092DB0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatuntidf(0x023479FD0E092DB8, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatuntidf(0x023479FD0E092DB6, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatuntidf(0x023479FD0E092DBF, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatuntidf(0x023479FD0E092DC1, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatuntidf(0x023479FD0E092DC7, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatuntidf(0x023479FD0E092DC8, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatuntidf(0x023479FD0E092DCF, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatuntidf(0x023479FD0E092DD0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatuntidf(0x023479FD0E092DD1, 0x1.1A3CFE870496Fp+57);
|
|
try test__floatuntidf(0x023479FD0E092DD8, 0x1.1A3CFE870496Fp+57);
|
|
try test__floatuntidf(0x023479FD0E092DDF, 0x1.1A3CFE870496Fp+57);
|
|
try test__floatuntidf(0x023479FD0E092DE0, 0x1.1A3CFE870496Fp+57);
|
|
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DC0, 0), 0x1.1A3CFE870496Ep+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DA1, 1), 0x1.1A3CFE870496Dp+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DB0, 2), 0x1.1A3CFE870496Ep+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DB8, 3), 0x1.1A3CFE870496Ep+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DB6, 4), 0x1.1A3CFE870496Ep+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DBF, 5), 0x1.1A3CFE870496Ep+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DC1, 6), 0x1.1A3CFE870496Ep+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DC7, 7), 0x1.1A3CFE870496Ep+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DC8, 8), 0x1.1A3CFE870496Ep+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DCF, 9), 0x1.1A3CFE870496Ep+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DD0, 0), 0x1.1A3CFE870496Ep+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DD1, 11), 0x1.1A3CFE870496Fp+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DD8, 12), 0x1.1A3CFE870496Fp+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DDF, 13), 0x1.1A3CFE870496Fp+121);
|
|
try test__floatuntidf(make_uti(0x023479FD0E092DE0, 14), 0x1.1A3CFE870496Fp+121);
|
|
}
|
|
|
|
fn test__floatsitf(a: i32, expected: u128) !void {
|
|
const r = __floatsitf(a);
|
|
try std.testing.expect(@bitCast(u128, r) == expected);
|
|
}
|
|
|
|
test "floatsitf" {
|
|
try test__floatsitf(0, 0);
|
|
try test__floatsitf(0x7FFFFFFF, 0x401dfffffffc00000000000000000000);
|
|
try test__floatsitf(0x12345678, 0x401b2345678000000000000000000000);
|
|
try test__floatsitf(-0x12345678, 0xc01b2345678000000000000000000000);
|
|
try test__floatsitf(@bitCast(i32, @intCast(u32, 0xffffffff)), 0xbfff0000000000000000000000000000);
|
|
try test__floatsitf(@bitCast(i32, @intCast(u32, 0x80000000)), 0xc01e0000000000000000000000000000);
|
|
}
|
|
|
|
fn test__floatunsitf(a: u32, expected_hi: u64, expected_lo: u64) !void {
|
|
const x = __floatunsitf(a);
|
|
|
|
const x_repr = @bitCast(u128, x);
|
|
const x_hi = @intCast(u64, x_repr >> 64);
|
|
const x_lo = @truncate(u64, x_repr);
|
|
|
|
if (x_hi == expected_hi and x_lo == expected_lo) {
|
|
return;
|
|
}
|
|
// nan repr
|
|
else if (expected_hi == 0x7fff800000000000 and expected_lo == 0x0) {
|
|
if ((x_hi & 0x7fff000000000000) == 0x7fff000000000000 and ((x_hi & 0xffffffffffff) > 0 or x_lo > 0)) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
@panic("__floatunsitf test failure");
|
|
}
|
|
|
|
test "floatunsitf" {
|
|
try test__floatunsitf(0x7fffffff, 0x401dfffffffc0000, 0x0);
|
|
try test__floatunsitf(0, 0x0, 0x0);
|
|
try test__floatunsitf(0xffffffff, 0x401efffffffe0000, 0x0);
|
|
try test__floatunsitf(0x12345678, 0x401b234567800000, 0x0);
|
|
}
|
|
|
|
fn test__floatditf(a: i64, expected: f128) !void {
|
|
const x = __floatditf(a);
|
|
try testing.expect(x == expected);
|
|
}
|
|
|
|
fn test__floatunditf(a: u64, expected_hi: u64, expected_lo: u64) !void {
|
|
const x = __floatunditf(a);
|
|
|
|
const x_repr = @bitCast(u128, x);
|
|
const x_hi = @intCast(u64, x_repr >> 64);
|
|
const x_lo = @truncate(u64, x_repr);
|
|
|
|
if (x_hi == expected_hi and x_lo == expected_lo) {
|
|
return;
|
|
}
|
|
// nan repr
|
|
else if (expected_hi == 0x7fff800000000000 and expected_lo == 0x0) {
|
|
if ((x_hi & 0x7fff000000000000) == 0x7fff000000000000 and ((x_hi & 0xffffffffffff) > 0 or x_lo > 0)) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
@panic("__floatunditf test failure");
|
|
}
|
|
|
|
test "floatditf" {
|
|
try test__floatditf(0x7fffffffffffffff, make_tf(0x403dffffffffffff, 0xfffc000000000000));
|
|
try test__floatditf(0x123456789abcdef1, make_tf(0x403b23456789abcd, 0xef10000000000000));
|
|
try test__floatditf(0x2, make_tf(0x4000000000000000, 0x0));
|
|
try test__floatditf(0x1, make_tf(0x3fff000000000000, 0x0));
|
|
try test__floatditf(0x0, make_tf(0x0, 0x0));
|
|
try test__floatditf(@bitCast(i64, @as(u64, 0xffffffffffffffff)), make_tf(0xbfff000000000000, 0x0));
|
|
try test__floatditf(@bitCast(i64, @as(u64, 0xfffffffffffffffe)), make_tf(0xc000000000000000, 0x0));
|
|
try test__floatditf(-0x123456789abcdef1, make_tf(0xc03b23456789abcd, 0xef10000000000000));
|
|
try test__floatditf(@bitCast(i64, @as(u64, 0x8000000000000000)), make_tf(0xc03e000000000000, 0x0));
|
|
}
|
|
|
|
test "floatunditf" {
|
|
try test__floatunditf(0xffffffffffffffff, 0x403effffffffffff, 0xfffe000000000000);
|
|
try test__floatunditf(0xfffffffffffffffe, 0x403effffffffffff, 0xfffc000000000000);
|
|
try test__floatunditf(0x8000000000000000, 0x403e000000000000, 0x0);
|
|
try test__floatunditf(0x7fffffffffffffff, 0x403dffffffffffff, 0xfffc000000000000);
|
|
try test__floatunditf(0x123456789abcdef1, 0x403b23456789abcd, 0xef10000000000000);
|
|
try test__floatunditf(0x2, 0x4000000000000000, 0x0);
|
|
try test__floatunditf(0x1, 0x3fff000000000000, 0x0);
|
|
try test__floatunditf(0x0, 0x0, 0x0);
|
|
}
|
|
|
|
fn test__floattitf(a: i128, expected: f128) !void {
|
|
const x = __floattitf(a);
|
|
try testing.expect(x == expected);
|
|
}
|
|
|
|
fn test__floatuntitf(a: u128, expected: f128) !void {
|
|
const x = __floatuntitf(a);
|
|
try testing.expect(x == expected);
|
|
}
|
|
|
|
test "floattitf" {
|
|
try test__floattitf(0, 0.0);
|
|
|
|
try test__floattitf(1, 1.0);
|
|
try test__floattitf(2, 2.0);
|
|
try test__floattitf(20, 20.0);
|
|
try test__floattitf(-1, -1.0);
|
|
try test__floattitf(-2, -2.0);
|
|
try test__floattitf(-20, -20.0);
|
|
|
|
try test__floattitf(0x7FFFFF8000000000, 0x1.FFFFFEp+62);
|
|
try test__floattitf(0x7FFFFFFFFFFFF800, 0x1.FFFFFFFFFFFFEp+62);
|
|
try test__floattitf(0x7FFFFF0000000000, 0x1.FFFFFCp+62);
|
|
try test__floattitf(0x7FFFFFFFFFFFF000, 0x1.FFFFFFFFFFFFCp+62);
|
|
|
|
try test__floattitf(make_ti(0x8000008000000000, 0), -0x1.FFFFFEp+126);
|
|
try test__floattitf(make_ti(0x8000000000000800, 0), -0x1.FFFFFFFFFFFFEp+126);
|
|
try test__floattitf(make_ti(0x8000010000000000, 0), -0x1.FFFFFCp+126);
|
|
try test__floattitf(make_ti(0x8000000000001000, 0), -0x1.FFFFFFFFFFFFCp+126);
|
|
|
|
try test__floattitf(make_ti(0x8000000000000000, 0), -0x1.000000p+127);
|
|
try test__floattitf(make_ti(0x8000000000000001, 0), -0x1.FFFFFFFFFFFFFFFCp+126);
|
|
|
|
try test__floattitf(0x0007FB72E8000000, 0x1.FEDCBAp+50);
|
|
|
|
try test__floattitf(0x0007FB72EA000000, 0x1.FEDCBA8p+50);
|
|
try test__floattitf(0x0007FB72EB000000, 0x1.FEDCBACp+50);
|
|
try test__floattitf(0x0007FB72EBFFFFFF, 0x1.FEDCBAFFFFFFCp+50);
|
|
try test__floattitf(0x0007FB72EC000000, 0x1.FEDCBBp+50);
|
|
try test__floattitf(0x0007FB72E8000001, 0x1.FEDCBA0000004p+50);
|
|
|
|
try test__floattitf(0x0007FB72E6000000, 0x1.FEDCB98p+50);
|
|
try test__floattitf(0x0007FB72E7000000, 0x1.FEDCB9Cp+50);
|
|
try test__floattitf(0x0007FB72E7FFFFFF, 0x1.FEDCB9FFFFFFCp+50);
|
|
try test__floattitf(0x0007FB72E4000001, 0x1.FEDCB90000004p+50);
|
|
try test__floattitf(0x0007FB72E4000000, 0x1.FEDCB9p+50);
|
|
|
|
try test__floattitf(0x023479FD0E092DC0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floattitf(0x023479FD0E092DA1, 0x1.1A3CFE870496D08p+57);
|
|
try test__floattitf(0x023479FD0E092DB0, 0x1.1A3CFE870496D8p+57);
|
|
try test__floattitf(0x023479FD0E092DB8, 0x1.1A3CFE870496DCp+57);
|
|
try test__floattitf(0x023479FD0E092DB6, 0x1.1A3CFE870496DBp+57);
|
|
try test__floattitf(0x023479FD0E092DBF, 0x1.1A3CFE870496DF8p+57);
|
|
try test__floattitf(0x023479FD0E092DC1, 0x1.1A3CFE870496E08p+57);
|
|
try test__floattitf(0x023479FD0E092DC7, 0x1.1A3CFE870496E38p+57);
|
|
try test__floattitf(0x023479FD0E092DC8, 0x1.1A3CFE870496E4p+57);
|
|
try test__floattitf(0x023479FD0E092DCF, 0x1.1A3CFE870496E78p+57);
|
|
try test__floattitf(0x023479FD0E092DD0, 0x1.1A3CFE870496E8p+57);
|
|
try test__floattitf(0x023479FD0E092DD1, 0x1.1A3CFE870496E88p+57);
|
|
try test__floattitf(0x023479FD0E092DD8, 0x1.1A3CFE870496ECp+57);
|
|
try test__floattitf(0x023479FD0E092DDF, 0x1.1A3CFE870496EF8p+57);
|
|
try test__floattitf(0x023479FD0E092DE0, 0x1.1A3CFE870496Fp+57);
|
|
|
|
try test__floattitf(make_ti(0x023479FD0E092DC0, 0), 0x1.1A3CFE870496Ep+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DA1, 1), 0x1.1A3CFE870496D08p+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DB0, 2), 0x1.1A3CFE870496D8p+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DB8, 3), 0x1.1A3CFE870496DCp+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DB6, 4), 0x1.1A3CFE870496DBp+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DBF, 5), 0x1.1A3CFE870496DF8p+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DC1, 6), 0x1.1A3CFE870496E08p+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DC7, 7), 0x1.1A3CFE870496E38p+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DC8, 8), 0x1.1A3CFE870496E4p+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DCF, 9), 0x1.1A3CFE870496E78p+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DD0, 0), 0x1.1A3CFE870496E8p+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DD1, 11), 0x1.1A3CFE870496E88p+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DD8, 12), 0x1.1A3CFE870496ECp+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DDF, 13), 0x1.1A3CFE870496EF8p+121);
|
|
try test__floattitf(make_ti(0x023479FD0E092DE0, 14), 0x1.1A3CFE870496Fp+121);
|
|
|
|
try test__floattitf(make_ti(0, 0xFFFFFFFFFFFFFFFF), 0x1.FFFFFFFFFFFFFFFEp+63);
|
|
|
|
try test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC2801), 0x1.23456789ABCDEF0123456789ABC3p+124);
|
|
try test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC3000), 0x1.23456789ABCDEF0123456789ABC3p+124);
|
|
try test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC37FF), 0x1.23456789ABCDEF0123456789ABC3p+124);
|
|
try test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC3800), 0x1.23456789ABCDEF0123456789ABC4p+124);
|
|
try test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC4000), 0x1.23456789ABCDEF0123456789ABC4p+124);
|
|
try test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC47FF), 0x1.23456789ABCDEF0123456789ABC4p+124);
|
|
try test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC4800), 0x1.23456789ABCDEF0123456789ABC4p+124);
|
|
try test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC4801), 0x1.23456789ABCDEF0123456789ABC5p+124);
|
|
try test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC57FF), 0x1.23456789ABCDEF0123456789ABC5p+124);
|
|
}
|
|
|
|
test "floatuntitf" {
|
|
try test__floatuntitf(0, 0.0);
|
|
|
|
try test__floatuntitf(1, 1.0);
|
|
try test__floatuntitf(2, 2.0);
|
|
try test__floatuntitf(20, 20.0);
|
|
|
|
try test__floatuntitf(0x7FFFFF8000000000, 0x1.FFFFFEp+62);
|
|
try test__floatuntitf(0x7FFFFFFFFFFFF800, 0x1.FFFFFFFFFFFFEp+62);
|
|
try test__floatuntitf(0x7FFFFF0000000000, 0x1.FFFFFCp+62);
|
|
try test__floatuntitf(0x7FFFFFFFFFFFF000, 0x1.FFFFFFFFFFFFCp+62);
|
|
try test__floatuntitf(0x7FFFFFFFFFFFFFFF, 0xF.FFFFFFFFFFFFFFEp+59);
|
|
try test__floatuntitf(0xFFFFFFFFFFFFFFFE, 0xF.FFFFFFFFFFFFFFEp+60);
|
|
try test__floatuntitf(0xFFFFFFFFFFFFFFFF, 0xF.FFFFFFFFFFFFFFFp+60);
|
|
|
|
try test__floatuntitf(0x8000008000000000, 0x8.000008p+60);
|
|
try test__floatuntitf(0x8000000000000800, 0x8.0000000000008p+60);
|
|
try test__floatuntitf(0x8000010000000000, 0x8.00001p+60);
|
|
try test__floatuntitf(0x8000000000001000, 0x8.000000000001p+60);
|
|
|
|
try test__floatuntitf(0x8000000000000000, 0x8p+60);
|
|
try test__floatuntitf(0x8000000000000001, 0x8.000000000000001p+60);
|
|
|
|
try test__floatuntitf(0x0007FB72E8000000, 0x1.FEDCBAp+50);
|
|
|
|
try test__floatuntitf(0x0007FB72EA000000, 0x1.FEDCBA8p+50);
|
|
try test__floatuntitf(0x0007FB72EB000000, 0x1.FEDCBACp+50);
|
|
try test__floatuntitf(0x0007FB72EBFFFFFF, 0x1.FEDCBAFFFFFFCp+50);
|
|
try test__floatuntitf(0x0007FB72EC000000, 0x1.FEDCBBp+50);
|
|
try test__floatuntitf(0x0007FB72E8000001, 0x1.FEDCBA0000004p+50);
|
|
|
|
try test__floatuntitf(0x0007FB72E6000000, 0x1.FEDCB98p+50);
|
|
try test__floatuntitf(0x0007FB72E7000000, 0x1.FEDCB9Cp+50);
|
|
try test__floatuntitf(0x0007FB72E7FFFFFF, 0x1.FEDCB9FFFFFFCp+50);
|
|
try test__floatuntitf(0x0007FB72E4000001, 0x1.FEDCB90000004p+50);
|
|
try test__floatuntitf(0x0007FB72E4000000, 0x1.FEDCB9p+50);
|
|
|
|
try test__floatuntitf(0x023479FD0E092DC0, 0x1.1A3CFE870496Ep+57);
|
|
try test__floatuntitf(0x023479FD0E092DA1, 0x1.1A3CFE870496D08p+57);
|
|
try test__floatuntitf(0x023479FD0E092DB0, 0x1.1A3CFE870496D8p+57);
|
|
try test__floatuntitf(0x023479FD0E092DB8, 0x1.1A3CFE870496DCp+57);
|
|
try test__floatuntitf(0x023479FD0E092DB6, 0x1.1A3CFE870496DBp+57);
|
|
try test__floatuntitf(0x023479FD0E092DBF, 0x1.1A3CFE870496DF8p+57);
|
|
try test__floatuntitf(0x023479FD0E092DC1, 0x1.1A3CFE870496E08p+57);
|
|
try test__floatuntitf(0x023479FD0E092DC7, 0x1.1A3CFE870496E38p+57);
|
|
try test__floatuntitf(0x023479FD0E092DC8, 0x1.1A3CFE870496E4p+57);
|
|
try test__floatuntitf(0x023479FD0E092DCF, 0x1.1A3CFE870496E78p+57);
|
|
try test__floatuntitf(0x023479FD0E092DD0, 0x1.1A3CFE870496E8p+57);
|
|
try test__floatuntitf(0x023479FD0E092DD1, 0x1.1A3CFE870496E88p+57);
|
|
try test__floatuntitf(0x023479FD0E092DD8, 0x1.1A3CFE870496ECp+57);
|
|
try test__floatuntitf(0x023479FD0E092DDF, 0x1.1A3CFE870496EF8p+57);
|
|
try test__floatuntitf(0x023479FD0E092DE0, 0x1.1A3CFE870496Fp+57);
|
|
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DC0, 0), 0x1.1A3CFE870496Ep+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DA1, 1), 0x1.1A3CFE870496D08p+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DB0, 2), 0x1.1A3CFE870496D8p+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DB8, 3), 0x1.1A3CFE870496DCp+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DB6, 4), 0x1.1A3CFE870496DBp+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DBF, 5), 0x1.1A3CFE870496DF8p+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DC1, 6), 0x1.1A3CFE870496E08p+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DC7, 7), 0x1.1A3CFE870496E38p+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DC8, 8), 0x1.1A3CFE870496E4p+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DCF, 9), 0x1.1A3CFE870496E78p+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DD0, 0), 0x1.1A3CFE870496E8p+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DD1, 11), 0x1.1A3CFE870496E88p+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DD8, 12), 0x1.1A3CFE870496ECp+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DDF, 13), 0x1.1A3CFE870496EF8p+121);
|
|
try test__floatuntitf(make_uti(0x023479FD0E092DE0, 14), 0x1.1A3CFE870496Fp+121);
|
|
|
|
try test__floatuntitf(make_uti(0, 0xFFFFFFFFFFFFFFFF), 0x1.FFFFFFFFFFFFFFFEp+63);
|
|
|
|
try test__floatuntitf(make_uti(0xFFFFFFFFFFFFFFFF, 0x0000000000000000), 0x1.FFFFFFFFFFFFFFFEp+127);
|
|
try test__floatuntitf(make_uti(0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF), 0x1.0000000000000000p+128);
|
|
|
|
try test__floatuntitf(make_uti(0x123456789ABCDEF0, 0x123456789ABC2801), 0x1.23456789ABCDEF0123456789ABC3p+124);
|
|
try test__floatuntitf(make_uti(0x123456789ABCDEF0, 0x123456789ABC3000), 0x1.23456789ABCDEF0123456789ABC3p+124);
|
|
try test__floatuntitf(make_uti(0x123456789ABCDEF0, 0x123456789ABC37FF), 0x1.23456789ABCDEF0123456789ABC3p+124);
|
|
try test__floatuntitf(make_uti(0x123456789ABCDEF0, 0x123456789ABC3800), 0x1.23456789ABCDEF0123456789ABC4p+124);
|
|
try test__floatuntitf(make_uti(0x123456789ABCDEF0, 0x123456789ABC4000), 0x1.23456789ABCDEF0123456789ABC4p+124);
|
|
try test__floatuntitf(make_uti(0x123456789ABCDEF0, 0x123456789ABC47FF), 0x1.23456789ABCDEF0123456789ABC4p+124);
|
|
try test__floatuntitf(make_uti(0x123456789ABCDEF0, 0x123456789ABC4800), 0x1.23456789ABCDEF0123456789ABC4p+124);
|
|
try test__floatuntitf(make_uti(0x123456789ABCDEF0, 0x123456789ABC4801), 0x1.23456789ABCDEF0123456789ABC5p+124);
|
|
try test__floatuntitf(make_uti(0x123456789ABCDEF0, 0x123456789ABC57FF), 0x1.23456789ABCDEF0123456789ABC5p+124);
|
|
}
|
|
|
|
fn make_ti(high: u64, low: u64) i128 {
|
|
var result: u128 = high;
|
|
result <<= 64;
|
|
result |= low;
|
|
return @bitCast(i128, result);
|
|
}
|
|
|
|
fn make_uti(high: u64, low: u64) u128 {
|
|
var result: u128 = high;
|
|
result <<= 64;
|
|
result |= low;
|
|
return result;
|
|
}
|
|
|
|
fn make_tf(high: u64, low: u64) f128 {
|
|
var result: u128 = high;
|
|
result <<= 64;
|
|
result |= low;
|
|
return @bitCast(f128, result);
|
|
}
|
|
|
|
test "conversion to f16" {
|
|
try testing.expect(__floatunsihf(@as(u32, 0)) == 0.0);
|
|
try testing.expect(__floatunsihf(@as(u32, 1)) == 1.0);
|
|
try testing.expect(__floatunsihf(@as(u32, 65504)) == 65504);
|
|
try testing.expect(__floatunsihf(@as(u32, 65504 + (1 << 4))) == math.inf(f16));
|
|
}
|
|
|
|
test "conversion to f32" {
|
|
try testing.expect(__floatunsisf(@as(u32, 0)) == 0.0);
|
|
try testing.expect(__floatunsisf(@as(u32, math.maxInt(u32))) != 1.0);
|
|
try testing.expect(__floatsisf(@as(i32, math.minInt(i32))) != 1.0);
|
|
try testing.expect(__floatunsisf(@as(u32, math.maxInt(u24))) == math.maxInt(u24));
|
|
try testing.expect(__floatunsisf(@as(u32, math.maxInt(u24)) + 1) == math.maxInt(u24) + 1); // 0x100_0000 - Exact
|
|
try testing.expect(__floatunsisf(@as(u32, math.maxInt(u24)) + 2) == math.maxInt(u24) + 1); // 0x100_0001 - Tie: Rounds down to even
|
|
try testing.expect(__floatunsisf(@as(u32, math.maxInt(u24)) + 3) == math.maxInt(u24) + 3); // 0x100_0002 - Exact
|
|
try testing.expect(__floatunsisf(@as(u32, math.maxInt(u24)) + 4) == math.maxInt(u24) + 5); // 0x100_0003 - Tie: Rounds up to even
|
|
try testing.expect(__floatunsisf(@as(u32, math.maxInt(u24)) + 5) == math.maxInt(u24) + 5); // 0x100_0004 - Exact
|
|
}
|
|
|
|
test "conversion to f80" {
|
|
if (builtin.zig_backend == .stage1 and builtin.cpu.arch != .x86_64)
|
|
return error.SkipZigTest; // https://github.com/ziglang/zig/issues/11408
|
|
if (std.debug.runtime_safety) return error.SkipZigTest;
|
|
|
|
const intToFloat = @import("./int_to_float.zig").intToFloat;
|
|
|
|
try testing.expect(intToFloat(f80, @as(i80, -12)) == -12);
|
|
try testing.expect(@floatToInt(u80, intToFloat(f80, @as(u64, math.maxInt(u64)) + 0)) == math.maxInt(u64) + 0);
|
|
try testing.expect(@floatToInt(u80, intToFloat(f80, @as(u80, math.maxInt(u64)) + 1)) == math.maxInt(u64) + 1);
|
|
|
|
try testing.expect(intToFloat(f80, @as(u32, 0)) == 0.0);
|
|
try testing.expect(intToFloat(f80, @as(u32, 1)) == 1.0);
|
|
try testing.expect(@floatToInt(u128, intToFloat(f80, @as(u32, math.maxInt(u24)) + 0)) == math.maxInt(u24));
|
|
try testing.expect(@floatToInt(u128, intToFloat(f80, @as(u80, math.maxInt(u64)) + 0)) == math.maxInt(u64));
|
|
try testing.expect(@floatToInt(u128, intToFloat(f80, @as(u80, math.maxInt(u64)) + 1)) == math.maxInt(u64) + 1); // Exact
|
|
try testing.expect(@floatToInt(u128, intToFloat(f80, @as(u80, math.maxInt(u64)) + 2)) == math.maxInt(u64) + 1); // Rounds down
|
|
try testing.expect(@floatToInt(u128, intToFloat(f80, @as(u80, math.maxInt(u64)) + 3)) == math.maxInt(u64) + 3); // Tie - Exact
|
|
try testing.expect(@floatToInt(u128, intToFloat(f80, @as(u80, math.maxInt(u64)) + 4)) == math.maxInt(u64) + 5); // Rounds up
|
|
|
|
try testing.expect(@floatToInt(u128, intToFloat(f80, @as(u80, math.maxInt(u65)) + 0)) == math.maxInt(u65) + 1); // Rounds up
|
|
try testing.expect(@floatToInt(u128, intToFloat(f80, @as(u80, math.maxInt(u65)) + 1)) == math.maxInt(u65) + 1); // Exact
|
|
try testing.expect(@floatToInt(u128, intToFloat(f80, @as(u80, math.maxInt(u65)) + 2)) == math.maxInt(u65) + 1); // Rounds down
|
|
try testing.expect(@floatToInt(u128, intToFloat(f80, @as(u80, math.maxInt(u65)) + 3)) == math.maxInt(u65) + 1); // Tie - Rounds down
|
|
try testing.expect(@floatToInt(u128, intToFloat(f80, @as(u80, math.maxInt(u65)) + 4)) == math.maxInt(u65) + 5); // Rounds up
|
|
try testing.expect(@floatToInt(u128, intToFloat(f80, @as(u80, math.maxInt(u65)) + 5)) == math.maxInt(u65) + 5); // Exact
|
|
}
|