22 lines
685 B
Lua
22 lines
685 B
Lua
function mtul.math.fround(number)
|
|
if number == 0 or number ~= number then
|
|
return number
|
|
end
|
|
local sign = 1
|
|
if number < 0 then
|
|
sign = -1
|
|
number = -number
|
|
end
|
|
local _, exp = math.frexp(number)
|
|
exp = exp - 1 -- we want 2^exponent >= number > 2^(exponent-1)
|
|
local powexp = 2 ^ math.max(-126, math.min(exp, 127))
|
|
local leading = exp <= -127 and 0 or 1 -- subnormal number?
|
|
local mantissa = math.floor((number / powexp - leading) * 0x800000 + 0.5)
|
|
if
|
|
mantissa > 0x800000 -- doesn't fit in mantissa
|
|
or (exp >= 127 and mantissa == 0x800000) -- fits if the exponent can be increased
|
|
then
|
|
return sign * inf
|
|
end
|
|
return sign * powexp * (leading + mantissa / 0x800000)
|
|
end |