mirror of
https://github.com/appgurueu/modlib.git
synced 2024-11-22 07:13:45 +01:00
Fix math.fround
This commit is contained in:
parent
c5e622f4a9
commit
fdfe65167f
17
math.lua
17
math.lua
@ -152,6 +152,9 @@ function tostring(number, base, digit_function, precision)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround#polyfill
|
-- See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround#polyfill
|
||||||
|
-- Rounds a 64-bit float to a 32-bit float;
|
||||||
|
-- if the closest 32-bit float is out of bounds,
|
||||||
|
-- the appropriate infinity is returned.
|
||||||
function fround(number)
|
function fround(number)
|
||||||
if number == 0 or number ~= number then
|
if number == 0 or number ~= number then
|
||||||
return number
|
return number
|
||||||
@ -161,14 +164,18 @@ function fround(number)
|
|||||||
sign = -1
|
sign = -1
|
||||||
number = -number
|
number = -number
|
||||||
end
|
end
|
||||||
local exp = math_floor(math.log(number, 2))
|
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 powexp = 2 ^ math.max(-126, math.min(exp, 127))
|
||||||
local leading = exp < -127 and 0 or 1
|
local leading = exp <= -127 and 0 or 1 -- subnormal number?
|
||||||
local mantissa = math_floor((leading - number / powexp) * 0x800000 + 0.5)
|
local mantissa = math.floor((number / powexp - leading) * 0x800000 + 0.5)
|
||||||
if mantissa <= -0x800000 then
|
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
|
return sign * inf
|
||||||
end
|
end
|
||||||
return sign * powexp * (leading - mantissa / 0x800000)
|
return sign * powexp * (leading + mantissa / 0x800000)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Export environment
|
-- Export environment
|
||||||
|
Loading…
Reference in New Issue
Block a user