shithub: mc

ref: 321aec6bf2b82698196a94725e37cee135b1fe2b
dir: /lib/std/test/fltfmt.myr/

View raw version
use std
use testr
use math

const main = {
	math.fptrap(false)
	testr.run([
		[.name = "put0", .fn = put0],
		[.name = "putNaN", .fn = putNaN],
		[.name = "putInf", .fn = putInf],
		[.name = "putinteger", .fn = putinteger],
		[.name = "putlowprec", .fn = putlowprec],
		[.name = "padding", .fn = padding],
		[.name = "sigfigs", .fn = sigfigs],
		[.name = "scientific01", .fn = scientific01],
		[.name = "scientific02", .fn = scientific02],
	][:])
}

const put0 = {c
	var f : flt32 = 0.0
	var g : flt64 = 0.0
	testr.check(c, std.eq(std.fmt("f is {}", f), "f is 0.0"), "0.0 should format to \"0.0\"")
	testr.check(c, std.eq(std.fmt("g is {}", g), "g is 0.0"), "0.0 should format to \"0.0\"")
}

const putNaN = {c
	var f : flt32 = std.flt32nan()
	var g : flt64 = std.flt64nan()
	var f2 : flt32 = std.flt32frombits(0x7fc00ab0)
	var g2 : flt64 = std.flt64frombits(0x7ff800000000abc0)
	testr.check(c, std.eq(std.fmt("f is {}", f), "f is NaN"), "NaN should format to \"NaN\"")
	testr.check(c, std.eq(std.fmt("g is {}", g), "g is NaN"), "NaN should format to \"NaN\"")
	testr.check(c, std.eq(std.fmt("f2 is {}", f2), "f2 is NaN"), "alt NaN should format to \"NaN\"")
	testr.check(c, std.eq(std.fmt("g2 is {}", g2), "g2 is NaN"), "alt NaN should format to \"NaN\"")
}

const putInf = {c
	var f : flt32 = std.flt32inf()
	var g : flt64 = std.flt64inf()
	testr.check(c, std.eq(std.fmt("f is {}", f), "f is Inf"), "Inf should format to \"Inf\"")
	testr.check(c, std.eq(std.fmt("g is {}", g), "g is Inf"), "Inf should format to \"Inf\"")
	f *= -1.0
	g *= -1.0
	testr.check(c, std.eq(std.fmt("f is {}", f), "f is -Inf"), "-Inf should format to \"-Inf\"")
	testr.check(c, std.eq(std.fmt("g is {}", g), "g is -Inf"), "-Inf should format to \"-Inf\"")
}

const putinteger = {c
	var data : (int, byte[:])[:] = [
		(1, "1.0"), (2, "2.0"), (184, "184.0"), (-37, "-37.0")
	][:]

	for (f, exp) : data
		var f32 : flt32 = (f : flt32)
		var f64 : flt64 = (f : flt64)
		var act32 : byte[:] = std.fmt("{}", f32)
		var act64 : byte[:] = std.fmt("{}", f64)

		testr.check(c, std.eq(act32, exp), "{} should format [flt32] to \"{}\", was \"{}\"", f, exp, act32)
		testr.check(c, std.eq(act64, exp), "{} should format [flt64] to \"{}\", was \"{}\"", f, exp, act64)
	;;
}

const putlowprec = {c
	var data : (flt64, byte[:])[:] = [
		(1.5, "1.5"), (0.0025, "0.0025"), (4.25, "4.25"), (-229.25, "-229.25")
	][:]

	for (f, exp) : data
		var f32 : flt32 = (f : flt32)
		var f64 : flt64 = (f : flt64)
		var act32 : byte[:] = std.fmt("{}", f32)
		var act64 : byte[:] = std.fmt("{}", f64)

		testr.check(c, std.eq(act32, exp), "{} should format [flt32] to \"{}\", was \"{}\"", f, exp, act32)
		testr.check(c, std.eq(act64, exp), "{} should format [flt64] to \"{}\", was \"{}\"", f, exp, act64)
	;;
}

const padding = {c
	var exp, act
	var f32 : flt32
	var f64 : flt64

	f32 = 1.0
	exp = "XXXX1.0"
	act = std.fmt("{w=7,p=X}", f32)
	testr.check(c, std.eq(exp, act), "{} should format [flt32] to \"{}\", was \"{}\"", f32, exp, act)

	f64 = 1.0
	exp = "XXXX1.0"
	act = std.fmt("{w=7,p=X}", f64)
	testr.check(c, std.eq(exp, act), "{} should format [flt64] to \"{}\", was \"{}\"", f64, exp, act)

	f32 = -2.5
	exp = "YYYYYY-2.5"
	act = std.fmt("{w=10,p=Y}", f32)
	testr.check(c, std.eq(exp, act), "{} should format [flt32] to \"{}\", was \"{}\"", f32, exp, act)

	f64 = -100000.5
	exp = "-100000.5"
	act = std.fmt("{w=9,p=Y}", f64)
	testr.check(c, std.eq(exp, act), "{} should format [flt64] to \"{}\", was \"{}\"", f64, exp, act)

	f32 = -13.25
	exp = "-013.25"
	act = std.fmt("{w=7,p=0}", f32)
	testr.check(c, std.eq(exp, act), "{} should format [flt32] to \"{}\", was \"{}\"", f32, exp, act)

	f32 = -1.0 * std.flt32inf()
	exp = "0000000-Inf"
	act = std.fmt("{w=11,p=0}", f32)
	testr.check(c, std.eq(exp, act), "{} should format [flt32] to \"{}\", was \"{}\"", f32, exp, act)

	f64 = std.flt64nan()
	exp = "               NaN"
	act = std.fmt("{w=18,p= }", f64)
	testr.check(c, std.eq(exp, act), "{} should format [flt64] to \"{}\", was \"{}\"", f64, exp, act)
}

const sigfigs = {c
	var exp, act
	var f32 : flt32
	var f64 : flt64

	f32 = 9.1234
	exp = "9.12"
	act = std.fmt("{s=3}", f32)
	testr.check(c, std.eq(exp, act), "{} should format [flt32] to \"{}\", was \"{}\"", f32, exp, act)

	f64 = 19.1234
	exp = "19.123"
	act = std.fmt("{s=5}", f64)
	testr.check(c, std.eq(exp, act), "{} should format [flt64] to \"{}\", was \"{}\"", f64, exp, act)

	f64 = 104.9
	exp = "100.0"
	act = std.fmt("{s=2}", f64)
	testr.check(c, std.eq(exp, act), "{} should format [flt64] to \"{}\", was \"{}\"", f64, exp, act)

	f64 = 105.1
	exp = "110.0"
	act = std.fmt("{s=2}", f64)
	testr.check(c, std.eq(exp, act), "{} should format [flt64] to \"{}\", was \"{}\"", f64, exp, act)

	f64 = 12345.6789
	exp = "12345.67890000000000000000000000000000000"
	act = std.fmt("{s=40}", f64)
	testr.check(c, std.eq(exp, act), "{} should format [flt64] to \"{}\", was \"{}\"", f64, exp, act)

	f64 = 12345.6789
	exp = "12345.679"
	act = std.fmt("{s=8}", f64)
	testr.check(c, std.eq(exp, act), "{} should format [flt64] to \"{}\", was \"{}\"", f64, exp, act)

	f32 = -13.49
	exp = "-13.5"
	act = std.fmt("{s=3}", f32)
	testr.check(c, std.eq(exp, act), "{} should format [flt32] to \"{}\", was \"{}\"", f32, exp, act)

	f32 = -13.53
	exp = "-13.5"
	act = std.fmt("{s=3}", f32)
	testr.check(c, std.eq(exp, act), "{} should format [flt32] to \"{}\", was \"{}\"", f32, exp, act)

	f32 = -13.53
	exp = "-10.0"
	act = std.fmt("{s=-23}", f32)
	testr.check(c, std.eq(exp, act), "{} should format [flt32] to \"{}\", was \"{}\"", f32, exp, act)

	f64 = 99.999
	exp = "100.0"
	act = std.fmt("{s=2}", f64)
	testr.check(c, std.eq(exp, act), "{} should format [flt64] to \"{}\", was \"{}\"", f64, exp, act)
}

const scientific01 = {c
	var exp, act
	var f32 : flt32
	var f64 : flt64

	f32 = 9.125
	exp = "9.125e0"
	act = std.fmt("{e}", f32)
	testr.check(c, std.eq(exp, act), "{} should format [flt32] to \"{}\", was \"{}\"", f32, exp, act)

	f32 = -9.125
	exp = "-9.125e0"
	act = std.fmt("{e}", f32)
	testr.check(c, std.eq(exp, act), "{} should format [flt32] to \"{}\", was \"{}\"", f32, exp, act)

	f32 = 101.25
	exp = "1.0125e2"
	act = std.fmt("{e}", f32)
	testr.check(c, std.eq(exp, act), "{} should format [flt32] to \"{}\", was \"{}\"", f32, exp, act)

	f64 = 0.000345
	exp = "3.45e-4"
	act = std.fmt("{e}", f64)
	testr.check(c, std.eq(exp, act), "{} should format [flt64] to \"{}\", was \"{}\"", f64, exp, act)

	f64 = 0.0
	exp = "0.0e0"
	act = std.fmt("{e}", f64)
	testr.check(c, std.eq(exp, act), "{} should format [flt64] to \"{}\", was \"{}\"", f64, exp, act)
}

const scientific02 = {c
	var inputs : (uint32, byte[:])[:] = [
		(0x00006b2e, "3.845e-41"),  (0x0000001a, "3.600e-44"),  (0xb806801a, "-3.207e-5"),
		(0x865c1e25, "-4.140e-35"), (0x8f0e27a7, "-7.009e-30"), (0x1981f861, "1.344e-23"),
		(0xfc00ebc4, "-2.678e36"),  (0xffe3ee67, "NaN"),        (0x2beaaea1, "1.668e-12"),
		(0x2899fbf7, "1.710e-14"),  (0x64807020, "1.895e22"),   (0x397908de, "2.375e-4"),
		(0x43cf5761, "4.147e2"),    (0xe8dade34, "-8.269e24"),  (0xdb42028a, "-5.461e16"),
		(0xcb0dc6d9, "-9.291e6"),   (0xfe788727, "-8.259e37"),  (0x204d51af, "1.739e-19"),
		(0xaceb03c8, "-6.680e-12"), (0x62936772, "1.360e21"),   (0x01d04ef3, "7.652e-38"),
		(0x096f9939, "2.884e-33"),  (0x554393e6, "1.344e13"),   (0x7d569963, "1.783e37"),
		(0x7dab27eb, "2.844e37"),   (0xa82adb2a, "-9.484e-15"), (0xef3c547e, "-5.829e28"),
		(0x3f037508, "5.135e-1"),   (0x35f91ece, "1.856e-6"),   (0x64038c7d, "9.707e21"),
		(0xa7014df5, "-1.794e-15"), (0x00000001, "1.000e-45"),  (0x00000002, "3.000e-45"),
		(0x142d3a25, "8.746e-27"),  (0xf40956cc, "-4.352e31"),  (0xcf94a73b, "-4.988e9"),
		(0x8a5b4e0a, "-1.056e-32"), (0x6099c9f8, "8.865e19"),   (0x999901e9, "-1.582e-23"),
		(0x104d5fdf, "4.050e-29"),  (0x53994694, "1.317e12"),   (0xba0ffdd6, "-5.493e-4"),
		(0x566478f7, "6.280e13"),   (0xc828393e, "-1.723e5"),   (0x35e78756, "1.725e-6"),
		(0x8a7cc67a, "-1.217e-32"), (0xe5eac57c, "-1.386e23"),  (0xba198513, "-5.856e-4"),
		(0x912dced2, "-1.371e-28"), (0x62ceeff6, "1.909e21"),   (0xc319fddf, "-1.540e2"),
		(0x8d84f7de, "-8.195e-31"), (0xf9789b3a, "-8.068e34"),  (0xffe0458a, "NaN"),
		(0xa447b8cb, "-4.331e-17"), (0xe78db907, "-1.339e24"),  (0x5b9ddc70, "8.887e16"),
		(0x1e1135d1, "7.687e-21"),  (0x1092b9bc, "5.787e-29"),  (0x1fdaec1e, "9.272e-20"),
		(0xfd481782, "-1.662e37"),  (0x0a6f575b, "1.152e-32"),  (0x11f9b948, "3.940e-28"),
		(0x97a2e4ee, "-1.053e-24"), (0xc427eede, "-6.717e2"),   (0x6841cbee, "3.661e24"),
		(0x0fbe8791, "1.879e-29"),  (0x9b1deb6b, "-1.306e-22"), (0x380c6359, "3.347e-5"),
		(0xddc24e30, "-1.750e18"),  (0x306b3607, "8.557e-10"),  (0x646de701, "1.755e22"),
		(0x4b4c8fea, "1.341e7"),    (0x12633040, "7.169e-28"),  (0xa2e27952, "-6.139e-18"),
		(0x48daa5a6, "4.478e5"),    (0x5c19903e, "1.729e17"),   (0x1497718b, "1.529e-26"),
		(0x888e7d7c, "-8.576e-34"), (0x0f6b694a, "1.161e-29"),  (0xf6e7ac5f, "-2.349e33"),
		(0x9686921a, "-2.174e-25"), (0xcfbec790, "-6.401e9"),   (0x1e8da64f, "1.500e-20"),
		(0xd903e53a, "-2.320e15"),  (0x15d49a09, "8.587e-26"),  (0x203eedc3, "1.617e-19"),
		(0xdba9f019, "-9.567e16"),  (0x8bc93716, "-7.751e-32"), (0x5bbcf273, "1.064e17"),
		(0xa449bd7a, "-4.375e-17"), (0x2c75c7ac, "3.493e-12"),  (0x85f83a6b, "-2.334e-35"),
		(0x4cdf6322, "1.171e8"),    (0x490b5e87, "5.709e5"),    (0xb49a38f4, "-2.873e-7"),
		(0x14eecf83, "2.411e-26"),  (0xaddd8c33, "-2.519e-11"), (0x0b4ca7de, "3.942e-32"),
		(0x8cba7b11, "-2.873e-31"), (0x3a4c41c4, "7.792e-4"),   (0x0d13e993, "4.558e-31"),
		(0xd84bbda9, "-8.961e14"),  (0x5aa23a32, "2.283e16"),   (0xf20deb5d, "-2.811e30"),
		(0x62cccc86, "1.889e21"),   (0x20ba0821, "3.152e-19"),  (0x23c40663, "2.125e-17"),
		(0x8ef7d8b1, "-6.110e-30"), (0x253c173c, "1.631e-16"),  (0xe2d8fe86, "-2.001e21"),
		(0x2e31df38, "4.044e-11"),  (0x563dcd40, "5.217e13"),   (0x78c75eff, "3.235e34"),
		(0x9480ba67, "-1.300e-26"), (0xd4900806, "-4.949e12"),  (0x8fb3cb79, "-1.773e-29"),
		(0xf76ea58f, "-4.840e33"),  (0x18ce7442, "5.337e-24"),  (0x925f1cd6, "-7.040e-28"),
		(0x1fcbbe53, "8.629e-20"),  (0x723be188, "3.721e30"),   (0xa01bf8c6, "-1.321e-19"),
		(0xc034d668, "-2.826e0"),   (0xa983e3c2, "-5.857e-14"), (0xf3d52e40, "-3.378e31"),
		(0x64435bc6, "1.441e22"),   (0xb9b06c80, "-3.365e-4"),  (0x90ba67c2, "-7.352e-29"),
		(0x17620ab6, "7.304e-25"),  (0x93e2bd8a, "-5.724e-27"), (0xfe53a8b1, "-7.034e37"),
		(0x856df9d0, "-1.119e-35"), (0x773f393f, "3.878e33"),   (0x10231748, "3.216e-29"),
		(0x68a2b99a, "6.148e24"),   (0x57e0d3bc, "4.944e14"),   (0x5eb4cd0d, "6.514e18"),
		(0xf7593e1d, "-4.406e33"),  (0x9a200d02, "-3.310e-23"), (0x8f50d4f1, "-1.030e-29"),
		(0x6a39a779, "5.611e25"),   (0x57b438d9, "3.963e14"),   (0x8adc8f39, "-2.124e-32"),
		(0xa5ce9605, "-3.584e-16"), (0xa64fbd28, "-7.207e-16"), (0x07d505a4, "3.205e-34"),
		(0x88e15708, "-1.356e-33"), (0x871a5d45, "-1.161e-34"), (0x3bb2c09c, "5.455e-3"),
		(0xda05263b, "-9.370e15"),  (0x6e637d4a, "1.760e28"),   (0xf001136a, "-1.598e29"),
		(0x89399e5a, "-2.234e-33"), (0x57d88a36, "4.762e14"),   (0x48625a24, "2.318e5"),
		(0x469861fc, "1.950e4"),    (0xe2dfa9ef, "-2.063e21"),  (0xb30edce0, "-3.326e-8"),
		(0x4cf5612c, "1.286e8"),    (0xdb41cead, "-5.455e16"),  (0xe9eaf854, "-3.551e25"),
		(0x507b8568, "1.688e10"),   (0x6785fae6, "1.265e24"),   (0x0a36ba3c, "8.798e-33"),
		(0x3dbc3e38, "9.192e-2"),   (0x4a3d3834, "3.100e6"),    (0x09ebc2d8, "5.676e-33"),
		(0x2cf0fcdd, "6.849e-12"),  (0xb2452cfb, "-1.148e-8"),  (0xa25e17b3, "-3.010e-18"),
		(0x2d9bd504, "1.772e-11"),  (0x8afb1ff3, "-2.418e-32"), (0xccb86e05, "-9.669e7"),
		(0xa2bbd81e, "-5.092e-18"), (0xd99a0fda, "-5.421e15"),  (0x026f37f5, "1.758e-37"),
	][:]

	for (u, exp) : inputs
		var act : byte[:] = std.fmt("{e,s=4}", std.flt32frombits(u))
		testr.check(c, std.eq(exp, act), "0x{x,w=8,p=0} = {} should format to \"{}\", was \"{}\"", u, std.flt32frombits(u), exp, act)
	;;
}