range = { degrees=360, gradians=400, mils=6400, radians=2.0*math.pi } function convert(value, fromunit, tounit) return math.fmod(value * range[tounit] / range[fromunit], range[tounit]) end testvalues = { -2, -1, 0, 1, 2, 6.2831853, 16, 57.2957795, 359, 399, 6399, 1000000 } testunits = { "degrees", "gradians", "mils", "radians" } print(string.format("%15s %8s = %15s %15s %15s %15s", "VALUE", "UNIT", "DEGREES", "GRADIANS", "MILS", "RADIANS")) for _, value in ipairs(testvalues) do for _, fromunit in ipairs(testunits) do local d = convert(value, fromunit, "degrees") local g = convert(value, fromunit, "gradians") local m = convert(value, fromunit, "mils") local r = convert(value, fromunit, "radians") print(string.format("%15.7f %8s = %15.7f %15.7f %15.7f %15.7f", value, fromunit, d, g, m, r)) end end